Как мне расширить помощник просмотра меню Zend?

Мне нужно изменить вывод Zend_View_Helper_Navigation_Menu . Я нашел две функции, которые мне нужно будет изменить, и я знаю, как внести необходимые изменения. Я не знаю, как сделать объект Navigation использующим помощник моего представления вместо Zend.

Фрагмент кода, представляющий расширение моего класса:

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

Редактирование для уточнения

Я хочу изменить класс элементов <li> и удалить EOL и отступы. Нет никаких вариантов сделать это со сценарием меню, поэтому я должен его продлить.

Инициализация объекта навигации в моем Bootstrap:

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

Отображение меню в моем макете:

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

Решение

Я получил его работу, переименовав вещи следующим образом, но я не понимаю, почему я не могу перегружать / перезаписывать _Menu класса и функции menu() .

  1. Измените имя класса на My_View_Helper_Navigation_MyMenu
  2. Добавьте функцию myMenu в класс ( return parent::menu($container); )
  3. Call echo $this->navigation()->myMenu(); в макете

Каркас класса:

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

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

From: Получение меню Zend_Navigation для работы с Fisheye от jQuery

РЕДАКТИРОВАТЬ

Извините, я не видел вашего решения, это именно то, что я опубликовал.

Но почему это не просто расширение класса меню?

Для тех, кому может понадобиться ответ, я нашел лучший способ и, возможно, намеченный путь.

Единственное, что вам нужно сделать, это создать свой собственный пользовательский помощник вида, который расширяет «Zend_View_Helper_Navigation_HelperAbstract» и задает прокси-сервер по умолчанию для помощника по навигации для вашего собственного.

Например

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

а также

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

(Я изменяю прокси-сервер по умолчанию в действии контроллера меню, так как он добавляется в стек действия)

Сделав это, можно будет использовать это в представлении

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

Примечание. Вам все еще нужно переименовать класс помощника вида, но так как помощники справки работают в Zend (имена не должны сталкиваться).

Вы редактировали сообщение? Похоже, мой ответ сейчас совершенно не имеет отношения к вашему вопросу?


Если вы скажете, что вам нужно изменить, это будет проще. На данный момент ваш вопрос немного запутан.

Я предположил, что вы хотите отредактировать представление ПОСЛЕ того, как вы уже создали навигацию. Если вы можете сделать это, прежде чем создавать его, то это еще проще. Этот бит ниже немного запутан, потому что вы обычно меняете параметры перед рукой.

 // 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 ) ); 

извините отступы, было очень трудно получить его выровненным почти

Обратите внимание, что я использовал $ YOUR_NAVIGATION_OBJECT выше. Вы используете это только в том случае, если на своей странице вы используете более одной навигации. В противном случае вы используете Render () вместо RenderMenu ().