Search code examples
phpmodel-view-controllerzend-frameworkurlhelper

How to Make Zend_Controller_Router resets un-wanted parameter by default


I'm using Zend-Framework 1.9.5 to make a web-application, But it's Url_Helper was quite tricky to me in the matter of parameter reset!, I know it's a good feature (parameter preserving) but in most cases I don't need it!. So I'm thinking of overriding the default Router to force it loosing parameters Unless I ask for it or maybe specifying a certain parameters that it keeps like (lang, or something like that).

Also I want to make it the default router so I don't have to edit my Controllers, Views to get that done!

Any suggestions?

Update: I spent the whole morning trying to write my url helper Admin_View_Helper_Xurl, But I couldn't do anything that solves the problem:

<?php
class Admin_View_Helper_Xurl extends Zend_View_Helper_Abstract
{
     public function xurl(array $urlOptions = array(), $name = 'default', $reset = false, $encode = true)
    {
        $router = Zend_Controller_Front::getInstance()->getRouter();

        $wanted_params = array('module', 'controller', 'action', 'lang', 'page', 'search');

        $route = $router->getCurrentRoute();

        $something = anyWayToGetThatObjectOrClass();

        $params = $something->getParams();

        foreach($params as $key => $val) {
            if (!in_array($key, $wanted_params)) {
                $params[$key] = null; // OR uset($params[$key]);
            }
        }

        $something->clearParams();
        $something->setParams($params);

        return $router->assemble($urlOptions, $name, $reset, $encode);
    }
}

I tried to get current URL parameters and filter them and clear the current parameters and pass my filtered ones but I couldn't do anything that does it without hard-code editing one Zend_Framework code :(.

Thanks


Solution

  • I came up with this solution. It took 7 hours to be functional.

    class Zend_View_Helper_Xurl extends Zend_View_Helper_Abstract
    {
    
        const RESET_ALL = 'all';
        const RESET_CUSTOM = 'normal';
        const RESET_NON_MVC = 'mvc';
        const RESET_NONE = 'none';
    
    
        protected $_wantedParams = array('module', 'controller', 'action', 'lang', 'page', 'search');
        protected $_router;  
        /**
         * Generates an url given the name of a route.
         *
         * @access public
         *
         * @param  array $urlOptions Options passed to the assemble method of the Route object.
         * @param  mixed $name The name of a Route to use. If null it will use the current Route
         * @param  bool $reset Whether or not to reset the route defaults with those provided
         * @return string Url for the link href attribute.
         */
    
        public function __construct()
        {
            $router = Zend_Controller_Front::getInstance()->getRouter();
            $this->_router = clone $router;
        }
    
        public function xurl(array $urlOptions = array(), $reset = 'mvc', $encode = true)
        {
            $urlOptions = $this->_getFilteredParams($urlOptions, $reset);
            return $this->_router->assemble($urlOptions, $name, true, $encode);
        }
    
        protected function _getFilteredParams($data = array(), $level)
        {
            // $filteredValues = array();
            $request = Zend_Controller_Front::getInstance()->getRequest();
            $filteredValues = $request->getUserParams();
            $$filteredValues['module']     = $request->getModuleName();
            $$filteredValues['controller'] = $request->getControllerName();
            $$filteredValues['action']     = $request->getActionName();
    
    
            switch ($level) {
                case self::RESET_ALL:
                    $filteredValues['module'] = null;
                    $filteredValues['controller'] = null;
                    $filteredValues['action'] = null;
                // break omitted intentionally
                case self::RESET_NON_MVC:
                    $filteredValues['page'] = null;
                    $filteredValues['lang'] = null;
                    $filteredValues['search'] = null;
                // break omitted intentionally
    
                case self::RESET_CUSTOM:
                    foreach ($filteredValues as $key=>$val) {
                        if (!in_array($key, $this->_wantedParams)) {
                            $filteredValues[$key] = null;
                        }
                    }
                    break;
                case self::RESET_NONE:
                    break;
    
                default:
                    throw new RuntimeException('Unsuppoted Xurl URL helper reset level.');
                    break;
            }
    
    
            foreach ($filteredValues as $key => $val) {
                if (!array_key_exists($key, $data)) {
                    $data[$key] = $val;
                }
            }
    
            return $data;
        }
    }
    

    Clearly it's a View Helper class, may be not the best solution but it works fine with me for now.