Я хочу использовать помощник навигации для создания навигационных меню с помощью 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 никогда не отображается и, кажется, перезаписывается новостным навигатором.
Я мог бы сделать это совершенно неправильно, если так, пожалуйста, дайте мне знать лучший способ. Если этот метод кажется прекрасным, может кто-то помочь мне разобраться, почему новостной навигатор отображается в макете и в новостном представлении.
Спасибо за ваше время
Джейк
У меня была такая же проблема. Я просто создаю несколько экземпляров 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
.