Zend Navigation показывает все пункты в меню

Я просто не понимаю этого; Я использую стандартную версию Zend_Navigation, основанную на XML, прямо из коробки, так сказать - и каждая страница, кажется, имеет каждый пункт меню. Я перепробовал все - activeOnly, renderSubMenu, renderParent, но все они возвращают мне либо все, либо ничего. Я предполагаю, что я неправильно понимаю, потому что то, что я хочу (элементы в "домашнем" узле, которые должны быть видны на "домашней" странице и т. Д.), Похоже, то, что я бы назвал поведением по умолчанию. Если мне нужно начать установку содержимого на "активный", зачем вам указывать настройки URL или контейнера в вашем XML- конечно, Zend "знает", что активно...

Например, используя эту страницу http://my.opera.com/spadille/blog/zend-navigation-with-xml (которая очень стандартна), я бы хотел, чтобы все узлы верхнего уровня были видны (Главная / О компании /Product/COntact), но только дочерние элементы "активной" страницы. Это не поведение по умолчанию?

Нужно ли частичное, чтобы достичь этого?

Большое спасибо,

Майк

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

Вот XML

     <?xml version="1.0" encoding="UTF-8"?>
     <configdata>
 <nav>
    <home>
        <label>Home</label>
        <controller>index</controller>
        <action>index</action>
        <module>default</module>
        <route>home</route>
    </home>
    <admin>         
        <label>Admin</label>
        <controller>admin</controller>
        <action>index</action>
        <module>default</module>
        <route>admin</route>
    </admin>
            <results>           
        <label>Results</label>
        <controller>result</controller>
        <action>index</action>
        <module>default</module>
        <route>results</route>
        <pages>
            <t>
            <label>Charts</label>
            <controller>result</controller>
            <action>graph</action>
            <module>default</module>
            <route>charts</route>
        </t>
        </pages>
    </results>
</nav>
    </configdata>

routes.ini

    routes.home.route = "/"
    routes.home.defaults.controller = index
    routes.home.defaults.action = index


    routes.admin.route = "/admin"
    routes.admin.defaults.controller = admin
    routes.admin.defaults.action = index

    routes.results.route = "/results"
    routes.results.defaults.controller = result
    routes.results.defaults.action = index

    routes.charts.route = "/results/charts"
    routes.charts.defaults.controller = result
    routes.charts.defaults.action = chart

И мой бутстрап

    protected function _initNavigation()
{
    $this->_bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml(
            APPLICATION_PATH . '/configs/navigation.xml','nav');


    $navigation = new Zend_Navigation($config);

    $view->navigation($navigation);
}

И мой взгляд. Я пробовал...

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

а потом это; Следующая строка скрывает вложенные элементы в навигационной панели "Результаты", но при нажатии на нее вы получаете только элемент и вложенный элемент, а не верхний уровень (из-за maxDepth)

    $this->navigation()->menu()->renderMenu(null,array("minDepth"=>0,"maxDepth"=>1,"onlyActiveBranch"=>true,"renderParents"=>true))

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

Это дает мне то, к чему я стремился, но похоже на взлом? Это уместно?

     <div class="top_menu">
            <?php echo $this->navigation()->menu()->renderMenu(null,array("minDepth"=>0,"maxDepth"=>0,"onlyActiveBranch"=>1,"renderParents"=>true)) ?>
        </div>
        <div class="sub_menu">
            <?php echo $this->navigation()->menu()->renderMenu(null,array("minDepth"=>1,"maxDepth"=>4,"onlyActiveBranch"=>true,"renderParents"=>false)) ?>
        </div>

1 ответ

Решение

Хорошо, я подозреваю, что "поведение по умолчанию" Zend_Navigation - это тот случай использования, при котором на каждой странице необходимо отображать все дерево меню. В этом случае использования дочерние элементы меню будут отображаться в виде раскрывающихся списков с помощью CSS/JS. В этом сценарии "странное" поведение, которое вы описали, действительно имеет смысл.

Ваш вариант использования отличается тем, что вы используете главное меню вместе с подменю. Это похоже на реализацию topbar + sidebar. В этом сценарии, очевидно, нежелательно, чтобы все дерево меню отображалось на каждой странице.

Чтобы еще больше запутать проблему, кажется, что renderSubmenu() ведет себя неожиданно, так как он отображает корневой уровень меню, когда у активной ветви нет дочерних элементов. Некоторые сообщают об этом поведении как об ошибке. Здесь вы найдете комментарий, предлагающий что-то похожее на ваш "хак"

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

  1. Использование одного из методов findBy * для "извлечения" вашего подменю в качестве нового контейнера в соответствии с примером 40
  2. Разделение основного меню и подменю на отдельные контейнеры и управление отношениями в каком-то фрагменте кода
  3. Расширение Zend_Navigation_Container для обеспечения желаемого поведения
  4. Используя частичное
Другие вопросы по тегам