Сбросить состояние Zend_Navigation - PullRequest
1 голос
/ 03 ноября 2011

В настоящее время я создаю приложение, в котором у меня есть несколько способов доступа к одному контроллеру.

Например:

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 Ответ

1 голос
/ 14 ноября 2011

Пока я правильно понял, поместите это в Bootstrap и скопируйте плагин контроллера, который я написал для вас. Я еще не проверял, что произойдет, если для представления не была установлена ​​навигация. Лучше проверить это. Между прочим, наличие одинаковых страниц по разным маршрутам не очень хорошо с точки зрения seo.

Bootstrap:

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 ) );
            }
        }
    }
}
...