Как получить текущую страницу из Zend_Navigation в плагине контроллера

Я работаю над плагином аутентификации, используя плагин контроллера. Я определяю свою конфигурацию навигации в файле application.ini, а затем использую его и записи пользователей базы данных для динамической загрузки ACL и применения его к Zend_Navigation. Этот бит работает, так как он успешно загружает меню и отображает только те страницы, которые разрешено видеть пользователю.

Однако это не мешает пользователю перейти на страницу напрямую. Что я хочу сделать, так это определить, когда пользователь переходит на страницу, к которой у него нет доступа в плагине контроллера, чтобы я мог перенаправить его запрос на страницу аутентификации.

Я думал, что должна быть функция для извлечения текущей страницы из Zend_Navigation, но я не могу ее найти... так что, возможно, ее не существует.

Во всяком случае, это мой полный плагин контроллера. Кто-нибудь видит решение?

<?php
class Pog_Model_AuthPlugin extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $oRequest)
    {
        /**
         * Load user
         */
        $oAuth = Zend_Auth::getInstance();
        $oDbUsers = new Pog_Model_DbTable_Users();

        if (!$oAuth->hasIdentity())
        {
            $oUser       = $oDbUsers->createRow();
            $oUser->name = "guest";
            $oUser->setReadOnly(true);
        }
        else
        {
            $oUser = $oAuth->getIdentity();
            $oUser->setTable($oDbUsers);
        }

        /**
         * Load ACL
         */    
        $oAcl = new Zend_Acl();
        $oAcl->addRole($oUser->name);


        /**
         * Add current user privileges
         */
        $oPrivileges = $oUser->getPrivileges();
        foreach ($oPrivileges as $oPrivilege)
        {
            if (!$oAcl->has($oPrivilege->resource))
                $oAcl->addResource($oPrivilege->resource);

            $oAcl->allow($oUser->name, $oPrivilege->resource, $oPrivilege->privilege);
        }


        /**
         * Load Navigation view helper
         */
        $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $oNavigation   = $oViewRenderer->view->navigation();


        /**
         * Add remaining Navigation resources
         */
        foreach ($oNavigation->getPages() as $oPage)
        {
            if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
                $oAcl->addResource($oPage->getResource());
        }


        /**
         * Set ACL and Role
         */
        $oNavigation->setAcl($oAcl)->setRole($oUser->name);


        /**
         * Check if use is allowed to be here
         */
        ...MAGIC GOES HERE...
    }
}

person Stephen RC    schedule 14.04.2011    source источник


Ответы (2)


Я думаю, что вы сможете получить текущую страницу навигации следующим образом:

     /**
     * Load Navigation view helper
     */
    $oViewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
    $oNavigation   = $oViewRenderer->view->navigation();

    /*@var $active array */        
    $active = $oNavigation->findActive($oNavigation->getContainer());

    /*@var $activePage Zend_Navigation_Page_Mvc */   
    $activePage =  $active['page'];

    // example of getting page info        
    var_dump($activePage->getLabel(), $activePage->getController(), $activePage->getAction());

Надеюсь это поможет.

person Marcin    schedule 14.04.2011
comment
Это похоже на то, что мне нужно, но в качестве ответа я получаю пустой массив. Может ли это иметь какое-то отношение к тому, что я запускаю его в плагине контроллера? - person Stephen RC; 14.04.2011
comment
Я просто поместил тестовый код в сценарий просмотра, и вышеприведенное работает нормально. Похоже, помощник навигации не полностью настроен, когда я добираюсь до него в плагине контроллера, но после этого все в порядке... Теперь нужно узнать, когда он будет настроен, и посмотреть, смогу ли я его запустить. - person Stephen RC; 14.04.2011
comment
@Валорин. Я проверил код в preDispatch моего плагина контроллера acl, и все в порядке. Как настроить навигацию? Я настраиваю навигацию в bootstrap.php? Может так в моем случае инициализируется? - person Marcin; 15.04.2011
comment
@Marcin, я настроил свою навигацию в файле application.ini, используя ресурс навигации, так что это может быть так. Хотя, это немного странно, если это так. Похоже, что код для Nav извлекает активный контроллер и действие через передний контроллер, поэтому я предположил, что это еще не настроено. - person Stephen RC; 15.04.2011
comment
@Валорин. Вот как я инициализирую свою навигацию в bootstrap.php: pastebin.com/TrCf0Bm5. Может быть, это будет полезно. - person Marcin; 15.04.2011
comment
У меня была такая же проблема в моем макете, затем я понял, что для моей страницы установлено значение «visible = false», что мешало ее поиску с помощью findActive()... Так что я бы сказал, что это была моя проблема из начать тоже. Это немного раздражает ... Я посмотрю, смогу ли я найти обходной путь. О, и я приму ваш ответ тоже :) - person Stephen RC; 16.04.2011
comment
@Валорин. Спасибо за согласие и надеюсь, что вы преодолеете свою проблему. - person Marcin; 16.04.2011

Это решение, которое я использовал, так как по какой-то причине я не могу заставить работать решение Марцина в моей установке.

Я еще немного подумал и придумал хорошее простое решение проблемы. Вместо того, чтобы использовать модуль навигации для поиска активной страницы, я нахожу ее сам. Поскольку я уже перебираю страницы, сравнить контроллер и действие несложно — если они оба совпадают, у меня есть активная страница!

Новый цикл foreach getPages() выглядит следующим образом:

$oCurrentPage = null;
foreach ($oNavigation->getPages() as $oPage)
{
    /**
     * Check for Current Page
     */
    if ($oPage->getController() == $oRequest->getControllerName()
      && $oPage->getAction() == $oRequest->getActionName())
        $oCurrentPage = $oPage;


    /**
     * Add Resource, if missing
     */
    if (!is_null($oPage->getResource()) && !$oAcl->has($oPage->getResource()))
        $oAcl->addResource($oPage->getResource());
}
person Stephen RC    schedule 14.04.2011