Zend Framework – умножить навигационные блоки

Я хочу использовать помощник навигации для создания навигационных меню с помощью Acl. В части Acl я отлично работаю.

Теперь я хочу иметь возможность отображать несколько разных типов навигации. Например, admin-nav, side-nav, new-nav и т. Д. Я не могу найти ничего об этом в документах. Только, как настроить навигацию, а затем использовать этот один навигационный объект несколько раз в макете или представлении.

Я пробовал что-то похожее на это: два разных контейнера с разными массивами страниц, а затем устанавливают эти контейнеры в реестре. Затем из моего представления и / или макета, называя навигацию и передавая ей контейнер:

<?php echo $this->navigation(Zend_Registry::get("news-nav")) ?> 

Вышеупомянутое вызывается в моем представлении новостей, в моем макете вызывается следующее:

 <?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?> 

Это отлично работает для всех моих страниц, кроме страницы новостей. На моей странице новостей навигатор для новостей отображается дважды, один раз в макете и один раз в окне новостей. Admin nav никогда не отображается и, кажется, перезаписывается новостным навигатором.

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

Спасибо за ваше время

Джейк

Solutions Collecting From Web of "Zend Framework – умножить навигационные блоки"

У меня была такая же проблема. Я просто создаю несколько экземпляров Zend_Navigation_Container в своих контроллерах для каждого из необходимых мне меню, передаю их в представление и затем визуализую их, передавая объекты непосредственно методу визуализации меню. Следующим образом:

В контроллере:

 $this->view->menu1 = new Zend_Navigation_Container(); $this->view->menu2 = new Zend_Navigation_Container(); 

В представлении:

 $this->navigation()->menu()->renderMenu($this->menu1); $this->navigation()->menu()->renderMenu($this->menu2); 

Вы даже можете настроить каждый из них (вставив вызовы методов после вызова изначального меню ():

 $this->navigation()->menu()->setUlClass('my_first_menu')->renderMenu($this->menu1); $this->navigation()->menu()->setUlClass('my_second_menu')->renderMenu($this->menu2); 

или вы можете сократить синтаксис

 $this->menu($this->menu1); 

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

Строка 516:

 public function __toString() { try { return $this->render(); } catch (Exception $e) { $msg = get_class($e) . ': ' . $e->getMessage(); trigger_error($msg, E_USER_ERROR); return ''; } } 

Проблема заключается в том, что если вы явно не вызываете $this->navigation->render($container) или волшебный метод, например $this->navigation()->menu($container) тогда вызов render заканчивается не получая контейнер, переданный ему.

Это, в свою очередь, приводит к тому, что помощник по умолчанию для navigation , который является menu , вытаскивается из registry (в этом случае он будет использовать последний данный контейнер) или создается на месте (что не создает контейнера).

Это мое простое исправление, которое вызывает getContainer на __toString .

Строка 516:

 public function __toString() { try { return $this->render($this->getContainer()); } catch (Exception $e) { $msg = get_class($e) . ': ' . $e->getMessage(); trigger_error($msg, E_USER_ERROR); return ''; } } 

Просматривая все вспомогательные файлы, связанные с Navigation ясно, что целью было вызвать getContainer . Также ясно, что это не проблема, если вы вызываете вспомогательный элемент menu непосредственно или с помощью метода магии navigation .

После того, как вы измените эту строку выше, вы сможете вызвать $this->navigation($container) и отобразить несколько навигаций, не прибегая непосредственно к вызову вспомогательного menu .