Pergunta

Usando o MVC padrão criado em Zend Framework, eu quero ser capaz de exibir páginas que tenham âncoras todo. Agora eu estou apenas adicionando um parâmetro sem sentido com o '#anchor' que eu quero dentro do arquivo .phtml.

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

Isso define o URL para se parecer com /my.controller/my.action/anchor/#myanchor

Existe uma maneira melhor de fazer isso? Após a navegação para o link de âncora, o parâmetro artigo extra fica definido na URL do usuário, que é algo que eu preferiria não acontecer.

Foi útil?

Solução

uma das possibilidades é substituir ajudante url, ou criar um novo.

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

este ajudante override url ajudante, problema é que você não pode usar o parâmetro chamado 'âncora', porque ele vai ser transformado em âncora na url.

você vai chamá-lo como a sua de exemplo

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

Espero que ajude

Outras dicas

Existem várias maneiras que você poderia ir sobre a implementação de um id fragmento em suas URLs. Abaixo estão algumas opções, juntamente com alguns prós e contras de cada um.

Add direto

Você pode simplesmente adicionar o "#$fragment_id" após a sua chamada url(). Deselegante, mas simples. Se você não usar âncoras página muito (ou seja, uma ou apenas duas páginas), este é o caminho a percorrer.

Escrever um costume url() helper

Você pode escrever uma versão personalizada do url() acrescentando um quinto argumento opcional para o ID de fragmento:

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

Desta forma, âncora (e âncora / fragmento id) informação é mantida withing estritamente o reino do View. Isso é bom para uso geral, mas pode ficar um pouco pesado para a rota padrão. Além disso, este ainda é um pouco hard-coded para alguns usos.

Escreva uma classe Route costume (Extreme)

Como terceira opção, você pode escrever uma versão personalizada da classe Zend_Controller_Router_Route (ES), especificamente o método assemble($data, $reset, $encode) (o método match($path) ignora ids fragmento por padrão).

Usando este método pode ser bastante complicado, mas muito úteis, especialmente se o uso é limitado apenas às ligações específicas (este método pode ser utilizada como base para o ID de fragmento de fora de qualquer variável).

Advertência

Certas considerações deve ser tidos em conta quando se utiliza ids fragmento. Por exemplo, seqüências de consulta tem que preceder o ID de fragmento na URI, caso contrário, a string de consulta ignorado pelo PHP. No entanto, a maioria das aplicações ZF tendem a evitar o uso de seqüências de consulta, por isso não pode ser um problema.

O auxiliar vista url aceita uma chave 'fragmento' para a terceira opção:

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

isso vai acabar automaticamente o url com #anchor.

-Obrigado para Exlord

Eu acho que o método extremo de escrever uma classe de rota personalizada é melhor porque outro helper terá o mesmo comportamento (como o ajudante ação redirecionador).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top