2011-11-03 118 views
1

我目前正在构建一个应用程序,我有多种方式来访问同一个控制器。重置Zend_Navigation状态

如:

 
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

你总是可以创建为与会者一个新的类,它扩展用户。你得到所有的功能,并消除与导航玩的痛苦。此外,您可以添加更多的自定义功能 – Ashley

回答

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)); 
      } 
     } 
    } 
} 
+0

感谢您的SEO指针,我现在意识到我在设计应用程序时的错误,下次我将为我的不同用户构建不同的控制器,并将我的大部分代码移植到本地。另一方面,您的答案给出了我能够得到的相同结果,但在插件级别而不是在控制器内部 –

+0

不要为每个用户构建控制器。使用Zend_AUth和Zend_Acl将stdClass对象设置为标识并将userId附加到它。这就是我在momemnt工作的方式。 –

+0

我想要你的赏金。你的问题的哪一部分尚未回答:D? –