zend tutorial framework php zend-framework zend-view zend-navigation

php - tutorial - ¿Cómo extiendo el Zend Navigation Menu View Helper?



zend framework tutorial (3)

editaste tu publicación? Parece que mi respuesta es totalmente irrelevante para tu pregunta ahora?

Si dices lo que necesitas cambiar, será más fácil. En este momento su pregunta es un poco confusa.

Supuse que desea editar la vista DESPUÉS de que ya haya creado su navegación. Si puede hacerlo antes de crearlo, entonces es aún más fácil. Este bit a continuación es un poco confuso porque normalmente cambiarías las opciones antes de la mano.

// Get the helper navigation $navigation = $viewRenderer-> view-> getHelper( ''navigation'' ) ->menu() ->renderMenu( $YOUR_NAVIGATION_OBJECT, array( ''minDepth'' => null, ''maxDepth'' => null, ''onlyActiveBranch'' => false, ''renderParents'' => false, // More options here ) );

disculpe la sangría, era realmente difícil alinearlo casi

Observe que usé $ YOUR_NAVIGATION_OBJECT arriba. Solo lo usa si usa más de una Navegación en su página. De lo contrario, usarás Render () en lugar de RenderMenu ().

Necesito cambiar el resultado de Zend_View_Helper_Navigation_Menu . Encontré las dos funciones que necesitaré modificar y sé cómo hacer los cambios que necesito. Lo que no sé es cómo hacer que el objeto Navigation use mi vista helper en lugar de Zend one.

Fragmento de código que representa mi extensión de clase:

// file /library/My/View/Helper/Navigation/Menu.php class My_View_Helper_Navigation_Menu extends Zend_View_Helper_Navigation_Menu { protected function _renderDeepestMenu(Zend_Navigation_Container $container, $ulClass, $indent, $minDepth, $maxDepth) { // modified code here } protected function _renderMenu(Zend_Navigation_Container $container, $ulClass, $indent, $minDepth, $maxDepth, $onlyActive) { // modified code here } }

Ediciones para aclarar

Quiero cambiar la clase de los elementos <li> y eliminar el EOL y la sangría. No hay opciones para hacer eso con el script de vista de menú, por lo que tendré que extenderlo.

Inicializando el objeto de navegación en mi Bootstrap:

$navTable = new Default_Model_Site_DbTable_Navigation(); $view = $this->getResource(''view''); $view->navigation(new Zend_Navigation($navTable->getNavigation()));

Presentar el menú en mi diseño:

echo $this->navigation()->menu();

Solución

Lo hice funcionar cambiando el nombre de las cosas de la siguiente manera, pero no tengo claro por qué no puedo sobrecargar / sobrescribir la clase _Menu y la función de menu() .

  1. Cambiar el nombre de la clase a My_View_Helper_Navigation_MyMenu
  2. Agregue la función myMenu a la clase ( return parent::menu($container); )
  3. Llamar echo $this->navigation()->myMenu(); en el diseño

Estructura metálica de clase:

// file /library/My/View/Helper/Navigation/MyMenu.php class My_View_Helper_Navigation_MyMenu extends Zend_View_Helper_Navigation_Menu { public function myMenu(Zend_Navigation_Container $container = null) { return parent::menu($container); } protected function _renderDeepestMenu(Zend_Navigation_Container $container, $ulClass, $indent, $minDepth, $maxDepth) { // modified code here } protected function _renderMenu(Zend_Navigation_Container $container, $ulClass, $indent, $minDepth, $maxDepth, $onlyActive) { // modified code here } }


Para cualquier persona que pueda necesitar una respuesta, encontré una mejor manera y, probablemente, la forma prevista.

Lo único que tienes que hacer es crear tu propio asistente de visualización personalizado que extienda ''Zend_View_Helper_Navigation_HelperAbstract'' y establecer el proxy predeterminado para el asistente de vista de navegación al tuyo.

P.ej

class Admin_View_Helper_NavigationMenu extends Zend_View_Helper_Navigation_HelperAbstract { public function render(/Zend_Navigation_Container $container = null) { return "Hello world!!"; } }

y

$this->view->navigation()->setDefaultProxy("navigationMenu");

(Estoy cambiando el proxy predeterminado en la acción del controlador de menú, ya que se agrega a la pila de acciones)

Una vez hecho esto, será posible usar esto en la vista

<?= $this->navigation()->render(); ?>

Nota: Aún debe cambiar el nombre de la clase de ayuda de vista, pero así es como funcionan los ayudantes de visualización en Zend (no se supone que los nombres colisionen).


$view->addHelperPath( APPLICATION_ROOT . ''/library/MyApp/View/Helper/Navigation'', ''MyApp_View_Helper_'' ); echo $this->navigation()->myMenu(); // name of your class

De: Obtención del menú Zend_Navigation para trabajar con jQuery''s Fisheye

EDITAR

Lamento no haber visto su solución, es exactamente lo que he publicado.

¿Pero por qué esto no es una verdadera extensión de la clase de menú?