为什么Zend将子页面标记为非活动状态?

时间:2011-06-06 14:15:09

标签: model-view-controller zend-framework zend-navigation

我在使用Zend_Navigation设置面包屑和菜单时遇到问题。

首先,我使用XML配置对象设置我的页面:

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<nav>
    <home>
        <label>Home</label>
        <controller>Index</controller>
        <action>index</action>
        <id>home</id>
        <resource>default</resource>
    </home>
    <crm>
        <label>CRM</label>
        <module>Crm</module>
        <controller>Index</controller>
        <action>index</action>
        <id>crm</id>
        <resource>Crm</resource>
        <pages>
            <persons>
                <module>Crm</module>
                <label>Personen</label>
                <controller>Persons</controller>
                <action>index</action>
            </persons>
           (...)etc.(...)

然后在我的引导程序中:

//Bootstrap.php
$view = $layout -> getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view -> navigation($navigation);
$view -> menu = $view -> navigation() -> menu();
$view -> breadcrumbs = $view -> navigation()->breadcrumbs()->setMinDepth(0);

现在,如果我要导航到http://hostname/Crm/Persons/,则活动状态将起作用,并且面包屑也将正确显示。

然而,当我转到http://hostname/Crm/Persons/inspect/id/3(其中inspect是action并且id是参数)时,面包屑将为空,并且所有菜单项都不会处于活动状态。预期的面包屑类似于:Home > CRM > Personen > John,CRM和Personen应该在菜单中处于活动状态。

现在,Zend文档给了我一个线索:由于设置了参数,它可能无法正常工作。

/*
* Dispatched request:
* - module:     blog
* - controller: post
* - action:     view
*/
$page = new Zend_Navigation_Page_Mvc(array(
    'action'     => 'view',
    'controller' => 'post',
    'module'     => 'blog',
    'params'     => array('id' => null)
));

// returns false, because page requires the id param to be set in the request
$page->isActive(); // returns false

我不知道如何解决这个问题。我们高度赞赏这些想法。

2 个答案:

答案 0 :(得分:0)

之前我没有使用过xml文件在ZF中设置导航,所以我不确定这是否有用。但根据我的经验,将以下内容添加到您的人员标签中:

    <params>
        <id>0</id>
    </params>

在此示例中,默认情况下id设置为0.

请参阅This Question

答案 1 :(得分:0)

经过一些(很多)修补,我发现我需要在Zend识别结构之前在XML中定义页面。

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
<nav>
    <home>
        <label>Home</label>
        <controller>Index</controller>
        <action>index</action>
        <id>home</id>
        <resource>default</resource>
    </home>
    <crm>
        <label>CRM</label>
        <module>Crm</module>
        <controller>Index</controller>
        <action>index</action>
        <id>crm</id>
        <resource>Crm</resource>
        <pages>
            <persons>
                <module>Crm</module>
                <label>Personen</label>
                <controller>Persons</controller>
                <action>index</action>
                <pages>
                    <inspect>  <--- this will make Zend recognize the page
                        <module>Crm</module>
                        <label>Persoon</label>
                        <controller>Persons</controller>
                        <action>inspect</action>
                    </inspect>
                </pages>
            </persons>
            (...)etc(...)

请注意,我不希望检查操作显示在菜单上并将最大渲染深度设置为1:

$view -> menu = $view -> navigation() -> menu()->setMaxDepth(1);