Zend框架中的Zend_Nav问题让菜单显示出来

时间:2010-04-02 16:43:38

标签: zend-framework zend-navigation

我有以下问题,使用zend框架,特别是zend_nav创建一个可重用的菜单,通过layout / layout.phtml页面传入。这些是各自文件中的代码片段。

首先在application / 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 个答案:

答案 0 :(得分:1)

如果您没有故意将函数__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注册表项。

答案 1 :(得分:1)

我认为您的代码是正确的,只是受保护的函数__initNavigation()  应该只在_

中使用一个_initNavigation()

然后将__initNavigation()更改为_initNavigation()

答案 2 :(得分:1)

我印象深刻,答案非常快,问题有几个方面,首先你们两个都正确使用一个下划线标志,非常感谢你们两个人! 事实证明,我拼错了,

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

应该是,

$config = new Zend_Config_Xml(APPLICATION_PATH .'/configs/navigation.xml', 'nav');
我的错。最后,在nav.xml文件中,在 - 节点内部,应该有每个“页面”节点周围的节点,例如用于家庭。它应该有

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

就是这样!

再次,非常感谢您的提示和提示,我正确的方向。

Sinc Kalle Johansson