Я хочу использовать помощника навигации для создания моего использования навигационных меню Acl. Первая часть Acl имеет хорошо работать.
Я теперь хочу смочь отобразить несколько различных типов навигации. Например, военно-морской администратором, военно-морской стороной, ново-военно-морской, и т.д. Я ничего не могу найти об этом в документах. Только, как установить навигацию и затем использовать тот один объект навигации неоднократно в рамках расположения или представления.
Я попробовал что-то подобное этому - наличие двух различных контейнеров, с различными массивами страниц, затем установив эти контейнеры в реестре. Затем из моей навигации вызова представления и/или расположения и передачи его контейнер:
<?php echo $this->navigation(Zend_Registry::get("news-nav")) ?>
Вышеупомянутое называют в моем представлении новостей, следующее называют в моем расположении
<?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?>
Это хорошо работает для всех моих страниц кроме страницы новостей. На моей странице новостей военно-морское для новостей отображено дважды, однажды в расположении и однажды в представлении новостей. Военно-морской администратор никогда не отображается и, кажется, перезаписывается военно-морскими новостями.
Я мог идти об этом полностью неправильным путем, раз так сообщите мне лучший путь. Если этот метод кажется прекрасным, может кто-то помогать мне разобраться, почему военно-морские новости отображаются в расположении и в представлении новостей.
Спасибо за внимание
Jake
У меня была точно такая же проблема. Я просто создаю несколько экземпляров 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);
Вы даже можете настроить каждый из них (вставив вызовы методов после первоначального вызова menu ():
$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
в итоге не получает переданный ему контейнер.
Это в свою очередь приводит к тому, что помощник представления по умолчанию для навигации
, которым является меню
, будет извлечен из реестра
(в этом случае он будет использовать последний переданный контейнер) или создан на месте (что приводит к отсутствию контейнера).
Это мое простое исправление, которое вызывает 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
.