2012-07-03 1 views
2

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

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

Нужно ли частично для достижения этого?

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

Майк

EDIT

Вот 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() 

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

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

EDIT.

Это получает меня за то, что я был после, но чувствует себя как рубить? Это уместно?

 <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> 
+0

хорошее имя! ..... –

+0

Какие типы страниц вы создаете? Zend_Navigation_Page_Uri или Zend_Navigation_Page_Mvc –

+0

Благодаря @Christian, я использую MVC, как это ... \t \t \t \t \t \t \t \t \t админ \t \t \t индекс \t \t \t по умолчанию \t \t \t админ \t \t MikeB

ответ

2

Ok Я подозреваю, что «поведение по умолчанию» из Zend_Navigation является использование случаем, когда требуется все дерево меню, чтобы быть оказано на каждой странице. В этом случае дети меню будут отображаться в виде выпадающих списков с помощью CSS/JS. В этом случае «странное» поведение, которое вы описали, действительно имеет смысл.

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

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

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

  1. Используя один из findBy * методы «извлечь» ваш подменю в качестве нового контейнера согласно Example 40
  2. Нарезка MainMenu и подменю в отдельные контейнеры и управлять отношения в кусок кода где-то
  3. Расширение Zend_Navigation_Container для обеспечения желаемого поведения
  4. Использование частичного
+0

Фантастический христианин, это ДЕЙСТВИТЕЛЬНО полезно, спасибо нагрузкам за то, что смотрели на это ... – MikeB