¿Cómo puedo escribir las URL de Zend Framework que tienen etiquetas de anclaje en el cuerpo?

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

Pregunta

Utilizando el MVC estándar configurado en Zend Framework, quiero poder mostrar páginas que tengan anclajes en todo. En este momento, solo estoy agregando un parámetro sin sentido con el '#anchor' que quiero dentro del archivo .phtml.

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

Esto establece que la URL se vea como /my.controller/my.action/anchor/#myanchor

¿Hay una mejor manera de lograr esto? Después de navegar al enlace de anclaje, el parámetro del elemento adicional se establece en la URL del usuario, que es algo que preferiría que no ocurriera.

¿Fue útil?

Solución

Una de las posibilidades es anular la ayuda de url o crear una nueva.

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 ayudante anula la ayuda de url, el problema es que no puedes usar el parámetro llamado 'ancla', porque se cambiará a ancla en la url.

lo llamarás como en tu ejemplo

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

Espero que ayude

Otros consejos

Hay varias maneras de implementar una ID del fragmento en tus URL. A continuación se muestran algunas opciones, junto con algunas ventajas y desventajas de cada una.

Adición directa

Simplemente puede agregar el " # $ fragment_id " después de su llamada a url () . Inelegante, pero simple. Si no usa mucho los anclajes de página (es decir, solo una o dos páginas), este es el camino a seguir.

Escribe un url () personalizado

Podría escribir una versión personalizada de url () agregando un quinto argumento opcional para la identificación del 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;
    }
}

De esta manera, la información del ancla (y la identificación del ancla / fragmento) se mantiene estrictamente dentro del reino de la Vista. Esto es bueno para el uso general, pero puede resultar un poco difícil de manejar para la ruta predeterminada. Además, esto todavía es un código demasiado duro para algunos usos.

Escribe una clase personalizada de Route (Extreme)

Como tercera opción, puede escribir una versión personalizada de la (s) clase (es) Zend_Controller_Router_Router_code>, específicamente el método de ensamblaje ($ data, $ reset, $ encode) (El método match ($ path) ignora las identificaciones de los fragmentos de forma predeterminada).

El uso de este método puede ser bastante complicado, pero muy útil, especialmente si el uso está limitado a rutas específicas (este método se puede usar para basar el ID de fragmento de cualquier variable).

Advertencia

Ciertas consideraciones deben deben tenerse en cuenta al utilizar los identificadores de fragmentos. Por ejemplo, las cadenas de consulta tienen que preceder a la identificación del fragmento en el uri, de lo contrario, la cadena de consulta ignorada por PHP. Sin embargo, la mayoría de las aplicaciones ZF tienden a evitar el uso de cadenas de consulta, por lo que puede no ser un problema.

El ayudante de vista de url acepta una clave de 'fragmento' para la tercera opción:

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

esto terminará automáticamente la url con #anchor.

-Gracias a Exlord

Creo que el método Extreme de escribir una clase de ruta personalizada es mejor porque otro ayudante tendrá el mismo comportamiento (como el ayudante de acción del redirector).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top