Сбросить состояние 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 до нуля.


person JF Dion    schedule 03.11.2011    source источник
comment
Вы всегда можете создать новый класс для посетителей, который расширяет пользователей. Вы получаете все функции и устраняете боль от игры с навигацией. Кроме того, вы можете добавить дополнительные пользовательские функции   -  person Ashley    schedule 04.11.2011


Ответы (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 ) );
            }
        }
    }
}
person Jakob Alexander Eichler    schedule 13.11.2011
comment
Спасибо за советы по SEO, теперь я понимаю свою ошибку при разработке своего приложения, в следующий раз я создам другой контроллер для разных пользователей и делокализую большую часть своего кода. С другой стороны, ваш ответ дает тот же результат, что и я, но на уровне плагина, а не внутри контроллера. - person JF Dion; 14.11.2011
comment
Не создавайте контроллер для каждого пользователя. Используйте Zend_AUth и Zend_Acl, установите объект stdClass в качестве идентификатора и добавьте к нему идентификатор пользователя. Вот как я работаю в данный момент. - person Jakob Alexander Eichler; 14.11.2011
comment
Я хочу твоей щедрости. На какую часть вашего вопроса еще нет ответа: D? - person Jakob Alexander Eichler; 14.11.2011
comment
Да, верно, я не дал его вам сначала, потому что я надеялся на решение текущей проблемы программирования напрямую, но награда была за ответ или альтернативный способ сделать что-то: P. Прочитав ваше решение, я нашел способ сделать это так, как хотел, но теперь я застрял с другой проблемой, я переработаю свой код, чтобы он работал правильно. Большое спасибо - person JF Dion; 14.11.2011