我目前正在使用Zend Framework 1.12.3创建我的新网站,我看到了一些我讨厌Zend Navigation的东西:
当子路由处于活动状态时(例如:博客单个帖子,路由
blog-post
),它不会将父页面(在这种情况下为路由blog
)标记为活动。
这是我的代码:(navigation.xml)
<blog>
<label>BLOG</label>
<route>blog</route>
<title>BLOG_TITLE</title>
<pages>
<blog-post>
<route>blog-post</route>
<visible>false</visible>
</blog-article>
<blog-category>
<route>blog-category</route>
<visible>false</visible>
</blog-category>
</pages>
</blog>
清楚地说,如果像blog
这样的子路由处于活动状态,我会将页面blog-post
标记为活动状态。不使用子页面(我不想要),它不会这样做。因此,如果有一种方法可以标记路线名称blog
和所有以blog
开头的路线(例如:blog-post
,blog-category
,blog-author
)非常有用!
我不想使用子页面因为我的菜单部分呈现空下拉列表(Twitter Bootstrap)。自己看:
答案 0 :(得分:5)
我知道它已经得到了解答,但我找到了不同的解决方案,因为马歇尔发布的一个不适合我。我想这是因为我的菜单中没有使用操作/控制器,而是使用路径。
我的菜单条目如下所示:
array(
'label' => 'cms-nav_users',
'access_module' => 'user',
'resource' => 'user_admin',
'route' => 'admin_user',
'pages' => array(
array(
'label' => 'cms-nav_companies',
'access_module' => 'user',
'route' => 'company_admin',
'resource' => 'company_admin',
),
array(
'label' => 'cms-nav_users-list',
'access_module' => 'company',
'route' => 'admin_user',
'resource' => 'user_admin',
),
),
),
我想出了一个基于我自己的菜单模板(部分)的解决方案。基本上有一个foreach循环,它检查是否有任何子页面是活动的,如果有一个 - 将父标记为活动,它看起来像这样:
$active = false;
if (!empty($page->pages))
{
foreach ($page->pages as $subpage)
{
if ($subpage->isActive()) $active = true;
}
}
$html[] = ($active) ? 'class="active"' : '';
希望它可以帮助某人:)
实际上我发现你可以使用Zend Framework自带的isActive()和true
参数,如源代码所示:
Zend_Navigation_Page_Mvc::isActive($recursive = false)
这两种方式都可行,但这种方式更合适。
答案 1 :(得分:2)
来自文档:
array(
'label' => 'Page 2',
'controller' => 'page2',
'pages' => array(
array(
'label' => 'Page 2.1',
'action' => 'page2_1',
'controller' => 'page2',
'class' => 'special-one',
'title' => 'This element has a special class',
'active' => true
),
array(
'label' => 'Page 2.2',
'action' => 'page2_2',
'controller' => 'page2',
'class' => 'special-two',
'title' => 'This element has a special class too'
)
)
),
如您所见,父菜单项没有分配给它,但父项和子项共享同一个控制器。这就是如何在子页面的父级上拥有活动状态。