重置Zend_Navigation状态

时间:2011-11-03 17:32:48

标签: php zend-framework zend-navigation

我目前正在构建一个应用程序,我有多种方法可以访问同一个控制器。

E.g:

Presenters -> access controller user/index with param user_type : presenters
Attendees -> access controller user/index with param user_type : attendees

在我的导航.ini中,我已经定义了两个路径(我删除了标签,模块和ACL以便于阅读):

dashboard.pages.presenter.controller = "user"
dashboard.pages.presenter.action = "index"

dashboard.pages.presenter.pages.create.controller = "user"
dashboard.pages.presenter.pages.create.action = "create"

dashboard.pages.presenter.pages.edit.controller = "user"
dashboard.pages.presenter.pages.edit.action = "edit" 

dashboard.pages.attendee.controller = "user"
dashboard.pages.attendee.action = "index"

dashboard.pages.attendee.pages.create.controller = "user"
dashboard.pages.attendee.pages.create.action = "create"

dashboard.pages.attendee.pages.edit.controller = "user"
dashboard.pages.attendee.pages.edit.action = "edit"

我遇到的问题是,当我转到与会者部分时,显示的面包屑是演示者的面包屑。我知道它按预期工作,但我正在寻找一种方法来根据URL参数user_type设置正确的“节点”。

使用此:

$page = $this->view->navigation()->findOneByLabel($label);
if ($page) {
    $page->setActive();
}

我已经能够将页面设置为活动状态,但我正在寻找一种方法将Zend_Navigation状态“重置”为无。

1 个答案:

答案 0 :(得分:1)

只要我说得对,就把它放在你的Bootstrap中并复制我为你写的控制器插件。我没有测试如果没有为视图设置导航会发生什么。更好的测试。顺便说一下,使用不同路线的相同页面在seo方面并不好。

自举:

protected function _initStackoverflow()
{
    $this->bootstrap('frontController');
    $frontController = $this->getResource( 'frontController' );
    $frontController->registerPlugin( new Altergear_Controller_Plugin_Stackoverflow() );
}

控制器插件:

<?php
class Altergear_Controller_Plugin_Stackoverflow extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch( Zend_Controller_Request_Abstract $request )
    {
        if( ( $activeLabel = $this->_request->getUserParam('active') ) !== null ){
            $view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->bootstrap('view')->getResource('view'); 
            foreach( $view->navigation()->getPages() as $page )
            {
                $page->setActive(  strtolower( $page->getLabel() ) === strtolower( $activeLabel ) );
            }
        }
    }
}