Como eu posso escrever Zend Framework URLs que têm Anchor Tag no corpo?
-
03-07-2019 - |
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.
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).