Domanda

Usando l'MVC standard impostato in Zend Framework, voglio essere in grado di visualizzare pagine con ancore ovunque. In questo momento sto solo aggiungendo un parametro senza significato con '#anchor' che voglio all'interno del file .phtml.

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

Questo imposta l'URL in modo che assomigli a /my.controller/my.action/anchor/#myanchor

C'è un modo migliore per raggiungere questo obiettivo? Dopo la navigazione verso il collegamento di ancoraggio, il parametro dell'elemento aggiuntivo viene impostato nell'URL dell'utente, cosa che preferirei non accadere.

È stato utile?

Soluzione

una delle possibilità è quella di ignorare l'helper dell'URL o di crearne uno nuovo.

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

questo helper ha la precedenza su url helper, il problema è che non puoi usare il parametro chiamato 'anchor', perché verrà cambiato in anchor in url.

lo chiamerai come nel tuo esempio

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

Spero che sia d'aiuto

Altri suggerimenti

Esistono diversi modi per implementare un frammento id nei tuoi URL. Di seguito sono riportate alcune opzioni, insieme ad alcuni pro e contro per ciascuno.

Aggiungi diretto

Puoi semplicemente aggiungere il " # $ fragment_id " dopo la tua chiamata url () . Inelegante, ma semplice. Se non usi molto gli ancoraggi di pagina (ovvero solo una o due pagine), questa è la strada da percorrere.

Scrivi un helper personalizzato ()

Potresti scrivere una versione personalizzata di url () aggiungendo un quinto argomento opzionale per l'ID frammento:

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

In questo modo, le informazioni di ancoraggio (e id di ancoraggio / frammento) vengono mantenute rigorosamente all'interno del regno della vista. Questo è buono per l'uso generale, ma può diventare un po 'ingombrante per il percorso predefinito. Inoltre, questo è ancora un po 'troppo codificato per alcuni usi.

Scrivi una classe Route personalizzata (Extreme)

Come terza opzione, potresti scrivere una versione personalizzata delle classi Zend_Controller_Router_Route , in particolare il assemble ($ data, $ reset, $ encode) (il metodo match ($ path) ignora gli ID frammento per impostazione predefinita).

L'uso di questo metodo può essere piuttosto complicato, ma molto utile, soprattutto se l'uso è limitato solo a percorsi specifici (questo metodo può essere utilizzato per basare l'id del frammento su qualsiasi variabile).

Caveat

Alcune considerazioni devono essere prese in considerazione quando si usano gli ID frammento. Ad esempio, le stringhe di query devono precedere l'id del frammento nell'uri, altrimenti la stringa di query ignorata da PHP. Tuttavia, la maggior parte delle applicazioni ZF tende ad evitare l'uso di stringhe di query, quindi potrebbe non essere un problema.

L'helper della vista url accetta una chiave 'frammento' per la terza opzione:

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

questo terminerà automaticamente l'URL con #anchor.

-Grazie a Exlord

Penso che il metodo Extreme di scrivere una classe di route personalizzata sia migliore perché altri helper avranno lo stesso comportamento (come l'helper dell'azione redirector).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top