Платформа зенда - блоки навигации мультипластины

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

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

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

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

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

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

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

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

Спасибо за внимание

Jake

8
задан David Snabel-Caunt 27 November 2009 в 00:18
поделиться

3 ответа

У меня была точно такая же проблема. Я просто создаю несколько экземпляров 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);
10
ответ дан 5 December 2019 в 14:03
поделиться

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

$this->menu($this->menu1);
1
ответ дан 5 December 2019 в 14:03
поделиться

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

1
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: