У меня есть это в моей начальной загрузке:
protected function _initAutoload()
{
$this->_auth = Zend_Auth::getInstance();
$this->_acl = new Federico_Plugin_Acl($this->_auth);
....
}
....
protected function _initNavigation()
{
$this->bootstrap('view');
$view = $this->getResource('view');
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation)->setAcl($this->_acl)
->setRole($this->_auth->getStorage()->read()->role);//I just added this
}
однако вставка, которую я только что сделал, сгенерировала это:
Исправляемая фатальная ошибка: аргумент 1 передан Zend_View_Helper_Navigation_HelperAbstract :: setAcl () должен быть экземпляром Zend_Acl, заданным экземпляром Federico_Plugin_Acl, который вызывается в /home/fiodorovich/public_html/gisele/application/Bootstrap.php в строке 106 и определяется в / home / fiodorovich / library / ZendFramework / library / Zend / View /Helper / Navigation / HelperAbstract.php в строке 333
А вот так выглядит мой navigation.xml:
<configdata>
<nav>
<home>
<label>HOME</label>
<controller>index</controller>
<action>index</action>
</home>
<about>
<label>Nosotros</label>
<module>default</module>
<controller>about</controller>
<action>index</action>
</about>
<admin>
<label>Admin</label>
<uri>admin/index</uri>
<resource>admin</resource>
<pages>
<alta>
<active>0</active>
<label>Alta Usuario</label>
<controller>users</controller>
<action>create</action>
</alta>
</pages>
</admin>
</nav>
Прямо сейчас,даже гости-пользователи могут видеть эти элементы в навигации, хотя они не могут получить к ним доступ, поскольку они уже настроены в классе Acl ... как мне передать роли acl здесь?
РЕДАКТИРОВАТЬ:
//my acl
class Federico_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
private $_acl = null;
private $_auth = null;
const DEFAULT_ROLE = 'guest';
public function __construct($auth)
{
$this->_auth = $auth;
$this->_acl = new Zend_Acl();
$this->_acl->addRole(new Zend_Acl_Role(self::DEFAULT_ROLE));
$this->_acl->addRole(new Zend_Acl_Role('user'), self::DEFAULT_ROLE);
$this->_acl->addRole(new Zend_Acl_Role('admin'), 'user');
$this->_acl->addResource(new Zend_Acl_Resource('index'));
$this->_acl->addResource(new Zend_Acl_Resource('users'));
$this->_acl->addResource(new Zend_Acl_Resource('about'));
$this->_acl->addResource(new Zend_Acl_Resource('gisele'));
$this->_acl->addResource(new Zend_Acl_Resource('admin'));
$this->_acl->allow('guest', 'index');
$this->_acl->allow('guest', 'about');
$this->_acl->deny('guest', 'gisele');
$this->_acl->deny('guest', 'users');
$this->_acl->allow('user', 'users', array('index'));
$this->_acl->allow('admin','users');
$this->_acl->allow('admin','gisele');
}
public function preDispatch (Zend_Controller_Request_Abstract $request)
{
if ($this->_auth->hasIdentity()) {
// user is logged in and we can get role
$role = $this->_auth->getStorage()->read()->role;
} else {
// guest
$role = self::DEFAULT_ROLE;
}
$action = $request->getActionName();
$controller = $request->getControllerName();
if($this->_acl->has($controller)) {
if(!$this->_acl->isAllowed($role, $controller, $action)) {
$request->setActionName('error');
$request->setControllerName('error');
}
}
}
}