2012-03-14 4 views
2

Я пытаюсь создать интерфейсное и вспомогательное меню навигации. Я хочу отображать только фоновое меню в фоновом режиме и наоборот.Многократная навигация Zend с ACL

Он работает правильно, когда я отключил ACL. Но, когда я включаю, меню уходит. Кто-нибудь знает, как я могу это решить?

Это мой код:

EDIT:

Я изменил navigation.xml и теперь, это почти работает правильно.

Элементы верхнего меню работают, когда я разрешаю контроллер. Но, когда я хочу только разрешить определенное действие внутри контроллера, отображается всего подменю вместо разрешенного действия.

Надеюсь, вы понимаете проблему. Извините, мой английский не очень хорошо.

в bootstrap.php

protected function _initNavigation() 
{ 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 

    $identity = $this->_auth->getStorage()->read(); 
    if($identity) 
    { 
     $roles = new Application_Model_Auth_Roles(); 
     $role = $roles->getRoles($identity->role); 
    } else { 
     $role[0]['role'] = 'Guest'; 
    } 

    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
    $container = new Zend_Navigation($config); 

    $view->navigation($container) 
        ->setAcl($this->_acl) 
        ->setRole($role[0]['role']); 

    // default menu   
    $view->nav = $view->navigation()->findOneByLabel('mainnav'); 

} 

CmsControllor.php

class CmsController extends Zend_Controller_Action 
{ 
    public function init() 
    { 

     //// BUILD MENU 
     $this->view->nav = $this->view->navigation()->findOneByLabel('cms'); 

     ... 

вид:

<?= $this->navigation()->menu()->renderMenu($this->nav); ?> 

navigation.xml

<config> 
    <nav> 
    <mainnav> 
    <label>mainnav</label> 
    <module>default</module> 
    <pages> 
      <home> 
       <label>Home</label> 
       <controller>index</controller> 
       <resource>index</resource> 
      </home> 

      <page1> 
       <label>De Esdoorn</label> 
       <controller>page1</controller> 
       <resource>deesdoorn</resource> 

      </page1> 

      <page2> 
       <label>page2</label> 
       <controller>page2</controller> 

       <pages> 
        <algemeen> 
         <label>Algemeen</label> 
         <controller>page2</controller> 
         <action>index</action> 
         <resource>page2</resource> 
         <privileges>index</privileges> 
        </algemeen> 
        <biedt> 
         <label>page2 biedt</label> 
         <controller>page2</controller> 
         <action>biedt</action> 
         <privileges>biedt</privileges> 

        </biedt> 
        <zorg> 
         <label>Zorg</label> 
         <controller>page2</controller> 
         <action>zorg</action> 
         <privileges>zorg</privileges> 
        </zorg> 
        <download> 
         <label>Download onze folder</label> 
         <uri>folder url</uri> 
         <target>_blank</target> 
        </download> 

       </pages>   
      </page2> 

      <organisatie> 
       <label>Onze organisatie</label> 
       <controller>organisatie</controller> 

       <pages> 
        <algemeen> 
         <label>Algemeen</label> 
         <controller>organisatie</controller> 
         <resource>organisatie</resource> 
         <privileges>index</privileges> 
        </algemeen> 
        <missieenvisie> 
         <label>Missie en visie</label> 
         <controller>organisatie</controller> 
         <action>missieenvisie</action> 
         <privileges>missieenvisie</privileges> 

        </missieenvisie> 
        <dienstverlening> 
         <label>Dienstverlening</label> 
         <controller>organisatie</controller> 
         <action>dienstverlening</action> 
         <privileges>dienstverlening</privileges> 
        </dienstverlening> 
        <kosten> 
         <label>Kosten</label> 
         <controller>organisatie</controller> 
         <action>kosten</action> 
         <privileges>kosten</privileges> 
        </kosten> 

        <nieuws> 
         <label>Nieuws</label> 
         <controller>organisatie</controller> 
         <action>nieuws</action> 
         <privileges>nieuws</privileges> 
        </nieuws> 





       </pages>   
      </organisatie> 

      <contact> 
       <label>Contact</label> 
       <controller>contact</controller> 
       <resource>contact</resource> 
      </contact> 
    </pages> 
    </mainnav> 

    <cms> 
    <label>cms</label> 
    <module>default</module> 
    <pages> 
      <dashboard> 
       <label>Dashboard</label> 
       <controller>cms</controller> 
       <action>dashboard</action> 
       <resource>cms</resource> 
       <privileges>nieuws</privileges> 
      </dashboard> 

      <nieuwsbeheren> 
       <label>Beheer uw nieuws</label> 
       <controller>cms</controller> 
       <action>managenews</action> 
       <resource>cms</resource> 
      </nieuwsbeheren> 

      <fotoalbum> 
       <label>Foto album</label> 
       <controller>fotoalbum</controller> 
       <pages> 
        <index> 
         <label>Album overzicht</label> 
         <controller>fotoalbum</controller> 
         <privileges>index</privileges> 
        </index> 
        <add> 
         <label>+ Album toevoegen</label> 
         <controller>fotoalbum</controller> 
         <action>add</action> 
         <resource>fotoalbum</resource> 
         <privileges>add</privileges> 
        </add> 
        <clientoverview> 
         <label>Bewoner overzicht</label> 
         <controller>fotoalbum</controller> 
         <action>clientoverview</action> 
         <privileges>clientoverview</privileges> 
        </clientoverview> 

        <useroverview> 
         <label>Naaste overzicht</label> 
         <controller>fotoalbum</controller> 
         <action>useroverview</action> 
         <privileges>useroverview</privileges> 
        </useroverview> 


       </pages>   
      </fotoalbum> 
      <settings> 
       <label>Instellingen</label> 
       <controller>cms</controller> 
       <action>settings</action> 
       <resource>cms</resource> 
       <privilege>settings</privilege> 
      </settings> 
      <logout> 
       <label>Uitloggen</label> 
       <controller>cms</controller> 
       <action>logout</action> 
       <resource>cms</resource> 
       <privilege>logout</privilege> 
      </logout> 
    </pages> 
    </cms> 
</nav> 
</config> 

Мой ACL плагин:

class My_Plugins_CheckAccess extends Zend_Controller_Plugin_Abstract 
{ 

private $_acl = NULL; 
private $_auth = NULL; 

public function __construct(Zend_Acl $acl, Zend_Auth $auth) 
{ 
    $this->_acl = $acl; 
    $this->_auth = $auth; 
} 

public function preDispatch(Zend_Controller_Request_Abstract $request){ 

    $controller = $request->getControllerName(); 
    $action  = $request->getActionName(); 

    $identity = $this->_auth->getStorage()->read(); 
    if($identity) 
    { 
     $roles = new Application_Model_Auth_Roles(); 
     $role = $roles->getRoles($identity->role); 
    } else { 
     $role[0]['role'] = 'Guest'; 
    } 

    if(!$this->_acl->isAllowed($role[0]['role'],$controller,$action)) 
    { 
     $request->setControllername('login')->setActionName('index'); 
    } else 
    { 

    } 

} 

Мои правила файл (правила из базы данных)

class Application_Model_Auth_CmsAcl extends Zend_Acl { 

public function __construct(){ 

    $logic = new Application_Model_Auth_Logic(); 

    $pages = new Application_Model_Auth_Pages(); 
    $pagecollection = $pages->getPages(); 
    $pagelist = $logic->listPages($pagecollection); 

    $roles = new Application_Model_Auth_Roles(); 
    $rolecollection = $roles->getRoles(); 

    $resources = new Application_Model_Auth_Resources(); 
    $resourcecollection = $resources->getResource(); 

    foreach($pagelist as $controller) 
    { 

     if($controller['controllerBase'] == 1): 
      $this->add(new Zend_Acl_Resource($controller['controller'])); 
     endif; 

    } 

    foreach($rolecollection as $role) 
    { 
     $this->addRole(new Zend_Acl_Role($role['role'])); 
    } 

    foreach($resourcecollection as $resource) 
    { 
     $roleName = $roles->getRoles($resource['roleID']); 
     $pageName = $pages->getPages($resource['pageID']); 
     if($pageName[0]['action'] != ''){ 
      $this->allow($roleName[0]['role'],$pageName[0]['controller'],$pageName[0]['action']); 
     } else {$this->allow($roleName[0]['role'],$pageName[0]['controller']);} 
    } 

} 

} 

Это мой первый сайт Зенд. Пожалуйста, исправьте меня, когда я ошибаюсь.

ответ

0

Хорошо, я отредактирован это правило в моем файле правил:

$this->allow($roleName[0]['role'],$pageName[0]['controller'],$pageName[0]['action']); 

в

$this->allow($roleName[0]['role'],$pageName[0]['controller'],array('index',$pageName[0]['action'])); 

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

Я узнал, что это, конечно, вполне логично, поскольку элемент верхнего меню запускается только всем контроллером или действием индекса.

Для этого необходимо прикрепить этот код к пункту главного меню:

<resource>page2</resource> 
<privilege>index</privilege> 

Решение будет меню пользовательских плагин, который срабатывает только элемент верхнего меню, когда индекс или другое действие внутри контроллера позволил.

Возможно, кто-то знает, как установить несколько привилегий в верхний пункт меню? Нечто подобное ?:

<page2> 
       <label>page2</label> 
       <controller>page2</controller> 
       <privilege>index</privilege> 
       <privilege>zorg</privilege> 
       <privilege>biedt</privilege> 

       <pages> 
        <algemeen> 
         <label>Algemeen</label> 
         <controller>page2</controller> 
         <action>index</action> 
         <resource>page2</resource> 
         <privilege>index</privilege> 
        </algemeen> 
        <biedt> 
         <label>page2 biedt</label> 
         <controller>page2</controller> 
         <action>biedt</action> 
         <privilege>biedt</privilege> 

        </biedt> 
        <zorg> 
         <label>Zorg</label> 
         <controller>page2</controller> 
         <action>zorg</action> 
         <privilege>zorg</privilege> 
        </zorg> 
        <download> 
         <label>Download onze folder</label> 
         <uri>folder url</uri> 
         <target>_blank</target> 
        </download> 

       </pages>   
      </page2> 

Так что, когда привилегия или индекс, OR biedt ИЛИ Зорг -> показать это верхний пункт меню.

Другая ошибка, которую я сделал, печатал

<privileges> вместо <privilege>

Спасибо за помощь.

0

Вы еще не указали какие-либо Правила. Это необходимо сделать, чтобы компонент ACL знал, кто имеет доступ к чему. Это можно сделать, позвонив по телефону deny() и/или allow(). Взгляните на the manual, это объясняется подробно.

+0

Прошу прощения, я не добавил файл правил. – Royw

1

Похоже, вы поменялись местами ресурс для привилегии в вашей navigation.xml

Try:

<home> 
    <label>Home</label> 
    <controller>index</controller> 
    <resource>index</resource> 
<home> 

<page1> 
    <label>page1</label> 
    <controller>page1</controller> 
    <resource>page1</resource>  
<page1> 
0

В навигационном файле нужно добавить тег ресурса:

<admin> 
    <label>admin</label> 
    <module>admin</module> 
    <resource>admin</resource> 
    <pages> 
      ... 
    </pages> 
</admin> 

В этом примере я дал ресурсу имя «admin», но это будет ресурс администратора, который у вас есть в вашей базе данных, и пользователю-администратору потребуется разрешение на просмотр/доступ к этому ресурсу.

+0

Благодарим вас за ответ. Но с ресурсом он больше не будет динамичным? Я только что узнал, что можно установить несколько модулей со своим собственным бутстрапом. Я думаю, это лучший подход. Что вы, ребята, думаете об этом? – Royw

+0

Ресурсы не могут быть динамическими - например, вы бы назвали ваш админ-контроллер ресурсом администратора, указателем-регулятором ресурса страницы, контроллером форума ресурсом форума и т. Д., Затем в своей базе данных вы затем можете назначать ресурсы для ролей (это было бы динамический бит), поэтому только определенные роли могут обращаться к определенным ресурсам (например, только администратор может получить доступ к ресурсу администратора, только пользователи могут получить доступ к форуму, но каждый может получить доступ к странице). Я использую модульную компоновку и имею модуль: controller: действие как имя ресурса (например, admin: index: acl). –

+0

Хм, я попробовал добавить ресурс. но я получаю эту ошибку: «Ресурс» Admin «не найден» в /usr/share/php/libzend-framework-php/Zend/Acl.php. – Royw

Смежные вопросы