Comment puis-je écrire des URL Zend Framework ayant des étiquettes d'ancrage dans le corps?

StackOverflow https://stackoverflow.com/questions/405338

Question

En utilisant le standard MVC configuré dans Zend Framework, je veux pouvoir afficher les pages qui ont des ancres. Pour le moment, j'ajoute simplement un paramètre sans signification avec le '#anchor' que je veux dans le fichier .phtml.

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

Ceci définit l'URL comme suit: /my.controller/my.action/anchor/#myanchor

Existe-t-il un meilleur moyen de réaliser cela? Après la navigation vers le lien d'ancrage, le paramètre d'élément supplémentaire est défini dans l'URL de l'utilisateur, ce que je préférerais ne pas avoir.

Était-ce utile?

La solution

L’une des possibilités est de remplacer le programme url helper ou d’en créer un nouveau.

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
    {
        if (isset($urlOptions['anchor']) && !empty($urlOptions['anchor']))
        {
            $anchor = $urlOptions['anchor'];
            unset($urlOptions['anchor']);
        }
        else
        {
            $anchor = '';
        }

        return parent::url($urlOptions, $name, $reset, $encode).$anchor;
    }
}

cette aide remplace l'url, le problème est que vous ne pouvez pas utiliser le paramètre appelé 'ancre', car il sera changé en ancre dans l'URL.

vous l'appellerez comme dans l'exemple de votre

<?= $this->url(array(
    'controller'=>'my.controller',
    'action'=>'my.action',
    'anchor'=>'#myanchor'
));

J'espère que ça aide

Autres conseils

Il existe de nombreuses façons de mettre en œuvre un identifiant de fragment dans vos URL. Vous trouverez ci-dessous quelques options, ainsi que des avantages et des inconvénients pour chacune d’elles.

Ajout direct

Vous pouvez simplement ajouter le "# $ fragment_id" après votre appel url () . Inélégant, mais simple. Si vous n’utilisez pas beaucoup d’ancres de page (c’est-à-dire une ou deux pages seulement), c’est la voie à suivre.

Écrire un aide personnalisée url ()

Vous pourriez écrire une version personnalisée de url () en ajoutant un cinquième argument optionnel pour l'identifiant de fragment:

class My_View_Helper_Url extends Zend_View_Helper_Url
{    
    public function url(array $urlOptions  = array(), $name   = null, 
                              $reset       = false,   $encode = true, 
                              $fragment_id = null)
    {
        $uri = parent::url($urlOptions, $name, $reset, $encode);

        if(!is_null($fragment_id)) {
            $uri .= "#$fragment_id";
        }

        return $uri;
    }
}

De cette manière, les informations d'ancre (et d'ancre / fragment id) sont conservées strictement dans le royaume de la vue. C'est bon pour une utilisation générale, mais peut être un peu lourd pour la route par défaut. De plus, cela reste un peu trop codé pour certaines utilisations.

Écrire une classe Route personnalisée (Extreme)

Troisièmement, vous pourriez écrire une version personnalisée de la ou des classes Zend_Controller_Router_Route , plus précisément de la méthode assemble ($ data, $ reset, $ encode) . (la méthode match ($ path) ignore les identifiants de fragment par défaut).

L'utilisation de cette méthode peut être assez délicate, mais très utile, en particulier si son utilisation est limitée à des routes spécifiques (cette méthode peut être utilisée pour baser l'identifiant de fragment de n'importe quelle variable).

Mise en garde

Certaines considérations doivent être prises en compte lors de l'utilisation d'identifiants de fragment. Par exemple, les chaînes de requête doivent précéder l'identifiant du fragment dans l'URI, sinon, la chaîne de requête est ignorée par PHP. Cependant, la plupart des applications ZF ont tendance à éviter l'utilisation de chaînes de requête, ce qui peut ne pas être un problème.

L'aide à la vue URL accepte une clé 'fragment' pour la troisième option:

url('[route]',array([params]),array('fragment'=>'anchor'));

Ceci mettra automatiquement fin à l'URL avec #anchor.

- Merci à Exlord

Je pense que la méthode Extreme pour écrire une classe de routage personnalisée est préférable car les autres assistants auront le même comportement (comme l'aide des redirecteurs).

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