2009-11-16 2 views
8

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

Теперь я хочу иметь возможность отображать несколько разных типов навигации. Например. 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 никогда не отображается и, кажется, перезаписывается новостным навигатором.

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

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

Джейк

ответ

10

Я имел точно такую ​​же проблему. Я просто создаю несколько экземпляров 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); 
1

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

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

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

Line 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.

Line 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.

Смежные вопросы