代码之家  ›  专栏  ›  技术社区  ›  Omar Al-Ithawi

如何使Zend_控制器_路由器默认重置不需要的参数

  •  2
  • Omar Al-Ithawi  · 技术社区  · 15 年前

    我正在使用Zend Framework 1.9.5制作一个Web应用程序,但它的url帮助程序在参数重置方面对我来说相当棘手!,我知道这是一个很好的特性(参数保持),但在大多数情况下,我不需要它!. 因此,我正在考虑覆盖默认的路由器,以强制它失去参数,除非我请求它,或者指定它保持的某个参数(lang或类似的东西)。

    另外,我想让它成为默认的路由器,这样我就不必编辑我的控制器,视图来完成它!

    有什么建议吗?

    更新: 我花了一上午的时间写我的网址助手 Admin_View_Helper_Xurl 但是我不能做任何能解决问题的事情:

    <?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);
        }
    }
    

    我试图获取当前的URL参数,过滤它们,清除当前的参数,并传递我过滤过的参数,但如果没有硬代码编辑Zend_框架代码,我就做不到任何事情。

    谢谢

    2 回复  |  直到 14 年前
        1
  •  2
  •   Wookai    15 年前

    当生成一个链接视图时,您可以要求助手使用一个简单的布尔值来除去所有的参数:

    <?php echo $this->url(array('controller' => 'index', action => 'action'), 'default', true); ?>
    

    最后一个参数指示是否重置参数。

        2
  •  1
  •   Omar Al-Ithawi    14 年前

    我想出了这个解决方案。它花了7个小时才能正常工作。

    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;
        }
    }
    

    显然,这是一个视图帮助器类,可能不是最好的解决方案,但目前它对我来说很好。