2

Zend-Framework 1.9.5 を使用して Web アプリケーションを作成しています。しかし、Url_Helper は、パラメーターのリセットの問題で非常に扱いにくいものでした!、これが優れた機能 (パラメーターの保存) であることはわかっていますが、ほとんどの場合はそうではありません。必要ない!したがって、デフォルトのルーターをオーバーライドして、パラメーターを強制的に失うことを考えています。要求しない限り、または保持する特定のパラメーター (lang など) を指定する場合を除きます。

また、それをデフォルトのルーターにしたいので、それを行うためにコントローラー、ビューを編集する必要はありません!

助言がありますか?

更新: 午前中ずっと URL helper を書き込もうとしました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 パラメータを取得してフィルタリングし、現在のパラメータをクリアしてフィルタリングしたパラメータを渡そうとしましたが、1 つの Zend_Framework コードをハードコード編集しない限り、それを行うことはできませんでした :(.

ありがとう

4

2 に答える 2

2

ビューへのリンクを生成するとき、単純な boolean を使用してすべてのパラメータを取り除くようにヘルパーに依頼できます。

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

最後のパラメーターは、パラメーターをリセットするかどうかを示します。

于 2009-12-16T17:07:04.377 に答える
1

私はこの解決策を思いつきました。機能するまでに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;
    }
}

明らかにこれは View Helper クラスであり、最善の解決策ではないかもしれませんが、今のところ問題なく動作します。

于 2010-01-14T12:30:14.887 に答える