Question

J'utilise Zend-Framework 1.9.5 pour créer une application Web, mais c'est Url_Helper qui m'a posé beaucoup de problèmes en matière de réinitialisation de paramètres! Je sais que c'est une bonne fonctionnalité (préservation des paramètres), mais dans la plupart des cas Je n'en ai pas besoin! Donc, je songe à remplacer le routeur par défaut pour le forcer à perdre des paramètres, sauf si je le demande ou peut-être spécifier certains paramètres qu'il garde comme (lang ou quelque chose comme ça).

De plus, je veux en faire le routeur par défaut afin de ne pas avoir à modifier mes contrôleurs, vues pour y parvenir!

Des suggestions?

Mise à jour: J'ai passé toute la matinée à essayer d'écrire mon assistant url Admin_View_Helper_Xurl , mais je ne pouvais rien faire qui résout le problème:

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

J'ai essayé d'obtenir les paramètres d'URL actuels, de les filtrer, de les effacer et de transmettre mes paramètres filtrés, mais je ne pouvais rien faire qui ne le fasse sans éditer en code dur un code Zend_Framework: (.

Merci

Était-ce utile?

La solution 2

Je suis venu avec cette solution. Cela a pris 7 heures pour être fonctionnel.

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 

Je suis venu avec cette solution. Cela a pris 7 heures pour être fonctionnel.

<*>

Clairement, c'est une classe View Helper, ce n'est peut-être pas la meilleure solution, mais ça me convient pour le moment.

wantedParams = array('module', 'controller', 'action', 'lang', 'page', 'search'); protected

Je suis venu avec cette solution. Cela a pris 7 heures pour être fonctionnel.

<*>

Clairement, c'est une classe View Helper, ce n'est peut-être pas la meilleure solution, mais ça me convient pour le moment.

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

Clairement, c'est une classe View Helper, ce n'est peut-être pas la meilleure solution, mais ça me convient pour le moment.

Autres conseils

Lorsque vous générez un lien dans une vue, vous pouvez demander à l’assistant de se débarrasser de tous les aparamtres avec un simple booléen:

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

Le dernier paramètre indique s'il faut ou non réinitialiser les paramètres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top