【问题标题】:Zend Navigation - Mark parent active if a child is activeZend Navigation - 如果孩子处于活动状态,则标记父母处于活动状态
【发布时间】:2013-04-11 02:09:58
【问题描述】:

我目前正在使用 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-post 这样的子路由处于活动状态,我会将页面 blog 标记为活动状态。不幸的是,如果不使用子页面(我不想要),它就不会这样做。因此,如果有办法将路由名称blog 以及所有以blog 开头的路由(例如:blog-postblog-categoryblog-author)标记为活动状态,那将非常有用!

我不想为此使用子页面,因为我的菜单部分呈现了一个空的下拉菜单(Twitter Bootstrap)。自己看:

【问题讨论】:

  • 为什么不使用 ZF2?因为它是一个新网站。
  • 我只给我的主要导航元素一个模块/控制器并将动作留空 - 然后每个子项目都有一个动作。这就是你得到你想要的东西的方式。它不适用于uri。你必须使用路由器。
  • @MarshallHouse 我不喜欢 ZF2 命名空间类。
  • 我不知道它是否支持 uri 中的通配符,但您可以尝试在父级中使用 /blog/*
  • 命名空间是一个很小的学习曲线,然后你就不想回去了。它们整洁多了。

标签: php zend-framework twitter-bootstrap zend-navigation


【解决方案1】:

我知道它已经得到了回答,但我找到了不同的解决方案,因为 Marshall 发布的一个对我不起作用。我想这是因为我没有在菜单中使用 action/controller,而是使用 routes

我的菜单项如下所示:

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)

这两种方法都行,但这个接缝更合适。

【讨论】:

  • 嗯,事实上,我不再使用 zf1,现在我使用的是 ZF2,但是,这正是我为使子页面正常工作所做的!所以,谢谢哥们批准这个! :)
【解决方案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'
        )
    )
),

如您所见,父菜单项没有分配任何操作,但父菜单项和子菜单项共享同一个控制器。这就是您可以在子页面的父页面上拥有活动状态的方式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多