Как мне расширить Zend Navigation Menu View Helper? - PullRequest
10 голосов
/ 02 марта 2010

Мне нужно изменить вывод Zend_View_Helper_Navigation_Menu. Я нашел две функции, которые мне нужно изменить, и я знаю, как внести необходимые изменения. Чего я не знаю, так это как заставить объект навигации использовать мой помощник вида вместо 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. Звоните 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
    }
}

Ответы [ 3 ]

3 голосов
/ 02 марта 2010
   $view->addHelperPath(
      APPLICATION_ROOT . '/library/MyApp/View/Helper/Navigation',
      'MyApp_View_Helper_'
      );


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

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

EDIT

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

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

1 голос
/ 23 мая 2013

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

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

* 1005 Е.Г. *

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 (имена не должны конфликтовать).

0 голосов
/ 02 марта 2010

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


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

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

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

...