Zend Framework - мультипликационные блоки навигации - PullRequest
8 голосов
/ 16 ноября 2009

Я хочу использовать помощник по навигации для создания своих навигационных меню, используя 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")) ?>

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

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

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

Джейк

Ответы [ 3 ]

10 голосов
/ 08 января 2010

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

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

1 голос
/ 10 января 2010

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

$this->menu($this->menu1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...