Hallo,
Ik werk aan een applicatie waar de Zend Acl permission module (ik denk versie 1) toegepast is. Zij zetten het o.a. voor het menu. Nu moet ik het menu aanpassen van simpel 2 dimensionaal (parent-child) naar een multi-level dropdown menu. Het menu zelf werkt uitstekend maar nu moet ik het laten aansluiten op de bestaande Zend Acl module
Step 1: definiëren van de rollen:
Dit laat ik ongewijzigd, want dit is niet veranderd. Momenteel wordt iedere bestaande rol toegevoegd met:
<?php
$this->addRole(new Zend_Acl_Role($role->name), $parent);
?>
($parent is Always null)
Step 2: definiëren van de resources:
Dit moet ik aanpassen. Ieder menu-item voeg ik als resource toe en dat doe recursive zoals:
<?php
if ($item->parent_id == 0) {
if (!empty($item->menu_code))
$this->addResource(new Zend_Acl_Resource($item->menu_code));
} else {
// Add the menu-item as resource
if (!empty($item->menu_code))
$this->addResource(new Zend_Acl_Resource($item->menu_code), $parent_menucode);
}
?>
Ik voeg dus ieder menu item toe als resource maar voor de test gaat het mij om de volgende 3:
Uid | menucode | parentid | parent menucode
1 | DBEH_Data_Beheer | 0 |
45 | DBEH_ANALYSIS | 1 | DBEH_Data_Beheer
47 | DBEH_ANALYSIS_Upl | 45 | DBEH_ANALYSIS
((voordat ik de AddResource method aanroep echo ik de signatuur, dus dit is wat de method in gaat)
Step 3: Definiëren van de 'allow' rule lijst:
Ik wil voor een specifieke rol het menu-item 'DBEH_ANALYSIS_Upl' tonen is allow. Dit is een child van DBEH_ANALYSIS welke weer een child is van DBEH_Data_Beheer (root). Ik denk dat ik dat goed gedaan heb op de volgende manier:
<?php
$this->allow($role_name, $resource_name, $privilege);
?>
Resultaat:
(Voordat ik de allow aanroep echo ik de signatuur:)
role | menucode | privilege
ESG | DBEH_ANALYSIS | view
ESG | DBEH_ANALYSIS_Upl | view
ESG | DBEH_Data_Beheer | view
Dit interpreteer ik als dat de rol ESG enkel toegang heeft tot deze drie menu-items. Ik weet niet mijn interpretatie/aanname correct is?
Step 4: Checking of een resource 'isAllowed' for een specifiek menu item:
Ik ittereer door alle menu-items en voordat ik hem aan het menu toevoeg check ik of de resource voor deze rol 'isAllowed' is. ($resource = menucode, $privilege is altijd 'view')
<?php
public function isAllowedByUser($resource, $privilege) {
return parent::isAllowed($_SESSION['RoleName'], $resource, $privilege);
}
?>
Mijn verwachting is nu dat als een menu-item resource bestaat in de Alow lijst, deze functie true retouneert. Indien deze niet voorkomt in de Allow lijst retouneert deze functie false.
Helaas dit is niet wat er gebeurd. Hoewel er maar 3 menu-items in de allow rules lijst staan, retouneert deze functie voor ieder menu-item onder de root DBEH_Data_Beheer true (=1). Waarom!!!!!!???????
En als ik DBEH_Data_Beheer uit de Allow lijst verwijder, wordt er geen enkel menu-item onder deze root getoond, wat dan wel begrijp.
Heeft iemand een idee waar ik de fout in ga, waar ik mijn verwachtingspatroon moet bijstellen?
Ik hoop dat iemand mij hiermee kan helpen.
Ik echo nu de resource, Allow signatuur voordat ik deze methods aanroep.
Wat ik graag zou willen is dat ik één of andere manier kan zien welke resources en de allow rules list van de Acl module kan opvragen/tonen.
Natuurlijk heb ik bij Zend gekeken en dan doe ik het zoals het daar beschreven staat, dat denk ik in ieder geval. Maar weet iemand nog een goed voorbeeld evt. van een multi-level menu?
Bedankt,
Nico
2.420 views