Как мне расширить помощник просмотра меню 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 и отступ. Нет никаких возможностей сделать это с видом меню script, поэтому я должен его продлить.

Инициализация объекта навигации в моем 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().

  • Измените имя класса на My_View_Helper_Navigation_MyMenu
  • Добавить функцию myMenu в класс (return parent::menu($container);)
  • Вызов 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
    }
}

Ответ 1

   $view->addHelperPath(
      APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
      'MyApp_View_Helper_'
      );


echo $this->navigation()->myMenu(); // name of your class

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

ИЗМЕНИТЬ

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

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

Ответ 2

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

Единственное, что вам нужно сделать, это создать свой собственный настраиваемый помощник вида, который расширяет "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 (имена не должны сталкиваться).

Ответ 3

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


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

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

// 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().