Dsao_Constructor_Acl Klassenreferenz

Erstellt ACL-Objekt. Mehr ...

Klassendiagramm für Dsao_Constructor_Acl:

Dsao_Constructor_Interface

Aufstellung aller Elemente

Öffentliche Methoden

 getObject ()
 Instanziiert Klasse und gibt Objekt zurück.

Öffentliche Attribute

const ACL_RESOURCES_DIR = 'modules/meta/acl/resources/'
 string, Verzeichnis der XML-Dateien für die ACL-Ressourcen


Ausführliche Beschreibung

Erstellt ACL-Objekt.

Autor:
DSAo-Md

http://www.gnu.org/licenses/gpl-3.0.html GNU Public License

Version:
SVN: $Id: Acl.php 519 2009-09-13 15:51:26Z saviola777 $

Definiert in Zeile 9 der Datei Acl.php.


Dokumentation der Elementfunktionen

Dsao_Constructor_Acl::getObject (  ) 

Instanziiert Klasse und gibt Objekt zurück.

Parameter:
$parameters array, Parameter für Konstruktion
Rückgabe:
object, Objekt

Implementiert Dsao_Constructor_Interface.

Definiert in Zeile 17 der Datei Acl.php.

Benutzt Dsao_Module_Broker::getInstance() und Dsao_Registry::getTable().

00018   {
00019     $acl = new Zend_Acl();
00020 
00021     // Alle Rollen laden
00022     $rolesRowset = Dsao_Registry::getTable('acl_role')->fetchAll();
00023 
00024     // Hier werden die Rollen mit ihrer ID als Index gespeichert
00025     $rolesArray = array();
00026 
00027     // Array mit Rollen erstellen
00028     foreach ($rolesRowset as $roleRow)
00029     {
00030       $rolesArray[$roleRow->id]['object'] = new Zend_Acl_Role($roleRow->name);
00031       $rolesArray[$roleRow->id]['parents'] = $roleRow->parents;
00032     }
00033 
00034     // Rollen dem ACL-Objekt hinzufügen
00035     foreach ($rolesArray as $role)
00036     {
00037       // Beerbte Rollen
00038       $parents = array();
00039 
00040       // IDs durchgehen und Referenz auf jeweilige Rolle in Array speichern
00041       foreach (explode(',', $role['parents']) as $roleId)
00042       {
00043         // Falls Rolle vorhanden
00044         if (isset($rolesArray[$roleId]))
00045         {
00046           $parents[] = $rolesArray[$roleId]['object'];
00047         }
00048       }
00049 
00050       $acl->addRole($role['object'], $parents);
00051     }
00052 
00053     // Nun die Ressourcen
00054 
00055     // XML-Loader für das ACL-Ressourcen-Verzeichnis erstellen
00056     $xmlLoaderResources =
00057       new Dsao_Xml_Loader(XML_DIR.self::ACL_RESOURCES_DIR,
00058         // Liste der aktiven Module
00059         Dsao_Module_Broker::getInstance()->getModulesActive(true));
00060 
00061     // Befugnisse für die einzelnen Rollen
00062     $permissions = array();
00063 
00064     // Array für die Ressourcen mit ihrem Namen als Index
00065     $resourcesArray = array();
00066 
00067     // Objekte der Dateien durcgehen
00068     foreach ($xmlLoaderResources->getXmlObjects() as $xml)
00069     {
00070       // Ressourcen durcgehen
00071       foreach ($xml->children() as $child)
00072       {
00073         // Ressource erstellen
00074         $resourcesArray[(string) $child->id] =
00075           new Zend_Acl_Resource($child->id);
00076 
00081         // Index für Schleife
00082         $indexPermission = 'allowed';
00083 
00084         // SimpleXML-Bug Workaround
00085         $childArray = (array) $child;
00086 
00087         // Arrays mit IDs der Rollen
00088         $rolesAllowed = (isset($childArray['allow']) ?
00089           (array) $childArray['allow'] : array());
00090         $rolesDenied = (isset($childArray['deny']) ?
00091           (array) $childArray['deny'] : array());;
00092 
00093         // Trennelement einfügen
00094         array_push($rolesAllowed, null);
00095 
00096         // Erlaubnisse und Verbote durchgehen
00097         foreach (array_merge($rolesAllowed, $rolesDenied) as $roleId)
00098         {
00099           // Ggf. Index umstellen
00100           if (null === $roleId)
00101           {
00102             $indexPermission = 'denied';
00103           }
00104 
00105           // explode produziert mindestens ein leeres Element, überspringen
00106           if (!is_numeric($roleId))
00107           {
00108             continue;
00109           }
00110 
00111           $permissions[$roleId][$indexPermission][] =
00112             $resourcesArray[(string) $child->id];
00113         }
00114 
00115       }
00116     }
00117 
00118     // Nun zum ACL-Objekt hinzufügen
00119     foreach ($resourcesArray as $resource)
00120     {
00121       // Elternressource, sofern vorhanden
00122       $parent = null;
00123 
00124       // Falls Unterstrich in Ressourcenname gefunden wurde
00125       if (false !==
00126         ($lastUnderscorePosition = strrpos($resource->getResourceId(), '_')))
00127       {
00128         // Elternressource
00129         $parent = substr($resource->getResourceId(),
00130           // Am Anfang starten
00131           0,
00132           // die Länge entspricht der Position des letzten Unterstrichts
00133           $lastUnderscorePosition);
00134 
00135         // Falls Ressource vorhanden
00136         if (isset($resourcesArray[$parent]))
00137         {
00138           $parent = $resourcesArray[$parent];
00139         }
00140       }
00141 
00142       $acl->add($resource, $parent);
00143     }
00144 
00145     // Nun noch einmal Rollen durchgehen und Befugnisse hinzufügen
00146     foreach ($rolesArray as $roleId => $role)
00147     {
00148       // Erlaubte Ressourcen
00149       $allowed = ( isset($permissions[$roleId]['allowed']) ?
00150         $permissions[$roleId]['allowed'] : null);
00151 
00152       // Falls Ressourcen erlaubt sind, oder Benutzer Admin
00153       if (null !== $allowed || 1 == $roleId)
00154       {
00155         $acl->allow($role['object'], $allowed);
00156       }
00157 
00158       // Falls nicht erlaubte Ressourcen vorhanden sind
00159       if (isset($permissions[$roleId]['denied']))
00160       {
00161         $acl->deny($role['object'], $permissions[$roleId]['denied']);
00162       }
00163     }
00164 
00165     // Der Rolle mit der ID 1 ist immer alles erlaubt
00166     $acl->allow($rolesArray[1]['object']);
00167 
00168     return $acl;
00169   }


Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Datei:

Erzeugt am Fri Sep 18 19:04:12 2009 für DSA online - Morgendaemmerung von  doxygen 1.5.7.1