2010-03-09 3 views
0

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

У меня есть вход и выход в навигацию, но, очевидно, я должен отображать только одно действие, которое имеет смысл.

Я считаю, что могу сделать что-то вроде $ navigation-> removePage(), но ... Как получить переменную $ navigation в контроллере после того, как она была ранее создана в Bootstrap.php?

+2

Может быть, вы могли бы использовать ACL, чтобы предоставить «Гость», доступ к авторизации ресурсу, и «пользователи» доступ к выходу из системы ресурса? – gnarf

+0

Звучит отличная идея. Можете ли вы поделиться этим кодом, чтобы выполнить это? – jwhat

ответ

2

Самый простой способ заключается в создании ACL с apropriate privilages для зарегистрированных и не зарегистрированных пользователей, то в конфигурационном файле:

resources.navigation.pages.login.resource = "user" 
resources.navigation.pages.login.privilege = "login" 

(это ини формат для простоты, вы можете сделать это в XML, а)

Privilages ограничат отображающие Войти/выхода из системы связи для указанной группы.

Однако ... Это полезно для статических навигационных меток. Я хотел бы иметь ссылку для входа по имени: Login и выйти из системы: Logout (+ username), так что пользователь постоянно видит свою личность.

В этом случае я бы создал плагин переднего контроллера, который извлекает фактический контейнер навигации, находит контейнер страницы входа и заменяет ярлык и маршрут (или URI или модуль, контроллер и действие, если вы используете контейнеры страниц MVC).

Обновлен:

Попробуйте что-то вроде этого:

if (Zend_Auth::getInstance()->hasIdentity()) { 
    Zend_Registry::set('role', 
    Zend_Auth::getInstance()->getStorage()->read()->role); 
} else { 
    Zend_Registry::set('role', 'guest'); 
} 

$this->_acl = new My_Model::Acl; 
$this->_auth = Zend_Auth::getInstance(); 

$front = Zend_Controller_Front::getInstance(); 
$front->registerPlugin(new Plugin_AccessCheck($this->_acl)); 

$view->navigation()->setAcl($this->_acl)->setRole(Zend_Registry:get('role')); 
+0

Я добавил пользователя и logout в файл конфигурации navigation.xml, но я не уверен, как связать остальную часть этого вместе. У меня есть код Zend_Acl в методе init() IndexController.php (даже не уверен, что это подходящее место). Не могли бы вы поделиться кодом, необходимым для этого? – jwhat

+0

- отредактировал мой оригинальный пост - – takeshin

+0

Отлично! Я поместил этот код в метод _initAcl() в Bootstrap, где я настроил соответствующие addRole(), addResource(), allow() и deny(). Благодаря! – jwhat

0

Если вы используете Zend_Application, настройки Zend_Navigation в качестве ресурса (см ссылку о том, как установить ваши страницы в файле конфигурации)

http://framework.zend.com/manual/en/zend.application.available-resources.html

Затем вы можете получить доступ к навигации ресурса в контроллере, как так:

class FooController extends Zend_Controller_Action 
    { 
     public function init() 
     { 
      $bootstrap = $this->getInvokeArg('bootstrap'); 
      $navigation = $bootstrap->getResource('navigation'); 
      // ... 
     } 
    } 
+0

Я смог получить навигацию в своем IndexController из $ this-> view-> Navigation(); ... но я до сих пор не знаю, как связать действия входа и выхода с Zend_Acl соответственно, чтобы сначала был доступен только вход в систему, а затем только выход из системы доступен после входа пользователя. – jwhat