Zend_Nav в Zend Framework проблема с получением меню для отображения - PullRequest
1 голос
/ 02 апреля 2010

У меня есть следующая проблема, используя Zend Framework, в частности, Zend_nav, чтобы создать повторно используемое меню для передачи через страницу layout / layout.phtml. Это фрагменты кода в соответствующих файлах.

первый в приложении / configs / navigation.xml,

<configdata>
    <nav>      
         <label>Home</label>
         <controller>index</controller>
         <action>index</action>
         <pages>
             <add>
                 <label>Add</label>
                 <controller>post</controller>
                 <action>add</action>
             </add>
             <login>
                 <label>Admin</label>
                 <controller>login</controller>
                 <action>login</action>
             </login>
         </pages>     
     </nav>
 </configdata>

это затем передается в объект в файле Bootstrap.php (только показывая этот конкретный метод)

protected function __initNavigation(){
    $this->bootstrap('layout');
    $layout = $this->getResource('layout');
    $view = $layout->getView();
    $config = new Zend_Config_Xml(APPLICATION .'/config/navigation.xml', 'nav');
    $container = new Zend_Navigation($config);
    $view->navigation($container);
}

и, наконец, в представлении layout.phtml объект должен вернуть меню

 <!-- application/layouts/scripts/layout.phtml -->
<?php echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>        
    <title>Zend Blog !</title>
    <?php echo $this->headLink()->appendStylesheet('/css/global.css')?>
</head>
<body>
    <div id="header">
        <div id="header-logo">
            <b>Blog Me !</b>
        </div>
    </div>
    <div id="menu">            
        <?php echo $this->navigation()->menu() ?>
    </div>
    <div id="content">
    <?php echo $this->layout()->content ?>
    </div>
</body>
</html>

Однако меню не отображается, когда я запускаю свое приложение в браузере, любые идеи о том, что могло пойти не так, принимаются смиренно.

Ответы [ 3 ]

1 голос
/ 02 апреля 2010

Я думаю, что ваш код правильный, просто ваша защищенная функция __initNavigation() следует использовать только один _ в вашем _initNavigation()

Затем измените __initNavigation() на _initNavigation()

1 голос
/ 02 апреля 2010

Ну, я впечатлен, очень быстрые ответы, у этой проблемы было несколько аспектов, во-первых, вы оба правильно использовали знак подчеркивания, спасибо вам обоим! И, как оказалось, я ошибся,

$config = new Zend_Config_Xml(APPLICATION .'/config/navigation.xml', 'nav');

должно быть,

$config = new Zend_Config_Xml(APPLICATION_PATH .'/configs/navigation.xml', 'nav');

моя вина. И, наконец, промах в файле navigation.xml внутри узла - должны быть узлы, окружающие каждый из узлов "страницы", например, для дома. Должно иметь

   <configdata>
     <nav> 
      <home>     
       <label>Home</label>
        <controller>index</controller>
        <action>index</action>
      </home>

Вот и все!

Опять же, большое спасибо за ваши советы и подсказки в правильном направлении.

Синк Калле Йоханссон

1 голос
/ 02 апреля 2010

Если вы не назвали функцию __initNavigation с двумя подчеркиваниями _ специально, то вы, вероятно, ожидали, что код запустится автоматически. Для автоматического запуска вам нужно использовать одно подчеркивание.

Другая возможная проблема заключается в том, что _initNavigation работает до _initView, когда Zend проходит через эти ресурсы в алфавитном порядке. Но тогда вам не нужен доступ к $view в этом коде. Вы можете использовать Zend_Registry для хранения контейнера навигации:

protected function _initNavigation() {
    $config = new Zend_Config_Xml(APPLICATION .'/config/navigation.xml', 'nav');
    $container = new Zend_Navigation($config);
    Zend_Registry::set('Zend_Navigation', $container);
}

Запись реестра Zend_Navigation будет использоваться по умолчанию любым помощником навигации, когда контейнер не указан.

...