Php Zend Navigation-如果子项处于活动状态,则将父项标记为活动
我目前正在使用Zend Framework 1.12.3创建我的新网站,我看到了一些我讨厌的Zend Navigation: 当子路由处于活动状态时(例如:博客单篇文章,路由Php Zend Navigation-如果子项处于活动状态,则将父项标记为活动,php,zend-framework,twitter-bootstrap,zend-navigation,Php,Zend Framework,Twitter Bootstrap,Zend Navigation,我目前正在使用Zend Framework 1.12.3创建我的新网站,我看到了一些我讨厌的Zend Navigation: 当子路由处于活动状态时(例如:博客单篇文章,路由博客文章),它不会将父页面(在本例中,路由博客)标记为活动 以下是我的代码:(navigation.xml) 博客 博客 博客标题 博文 假的 博客类别 假的 很明显,如果像blog post这样的子路径处于活动状态,我会将页面blog标记为活动。不幸的是,如果不使用子页面(我不希望使用子页面),它就不能做到这一点。因此
博客文章
),它不会将父页面(在本例中,路由博客
)标记为活动
以下是我的代码:(navigation.xml)
博客
博客
博客标题
博文
假的
博客类别
假的
很明显,如果像blog post
这样的子路径处于活动状态,我会将页面blog
标记为活动。不幸的是,如果不使用子页面(我不希望使用子页面),它就不能做到这一点。因此,如果有一种方法来标记活动的路由名称blog
和所有以blog
开头的路由(例如:blog post
,blog category
,blog author
),那将非常有用
我不想为此使用子页面,因为我的菜单部分呈现一个空下拉列表(Twitter引导)。亲自看看:
来自文档:
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'
)
)
),
如您所见,父菜单项没有指定任何操作,但父菜单项和子菜单项共享同一控制器。这就是如何在子页面的父页面上显示活动状态的方法。我知道它已经得到了回答,但我找到了不同的解决方案,因为Marshall发布的一个解决方案对我不起作用。我想这是因为我没有在菜单中使用动作/控制器,而是使用路由 我的菜单项如下所示:
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',
),
),
),
$active = false;
if (!empty($page->pages))
{
foreach ($page->pages as $subpage)
{
if ($subpage->isActive()) $active = true;
}
}
$html[] = ($active) ? 'class="active"' : '';
我根据自己的菜单模板(部分)提出了一个解决方案。基本上有一个foreach循环,它检查是否有任何子页面处于活动状态,如果有一个将父页面标记为活动状态,它看起来是这样的:
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',
),
),
),
$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)
两种方法都可以,但这一种更合适。为什么不使用ZF2?因为这是一个新站点。我给我的主要导航元素一个模块/控制器,并将操作留空-然后每个子项都有一个操作。这就是你得到你想要的东西的方式。它不能只和uri一起工作。您必须使用路由器。@MarshallHouse我不喜欢ZF2命名空间的类。我不知道它是否支持uri中的通配符,但您可以尝试在父类中使用
/blog/*
。命名空间是一个很小的学习曲线,然后您就不想回去了。他们太整洁了。请和我一起聊天。我有一些关于ZF2的问题,如果您愿意将它们比ZF文档做得更好的话!:)事实上,我不再使用zf1,现在我使用的是ZF2,但是,这正是我使我的子页面正常工作所做的!所以,谢谢老兄批准这个!:)