Acl.php
00001 <?php
00009 class Dsao_Constructor_Acl implements Dsao_Constructor_Interface
00010 {
00014 const ACL_RESOURCES_DIR = 'modules/meta/acl/resources/';
00015
00016
00017 public function getObject()
00018 {
00019 $acl = new Zend_Acl();
00020
00021
00022 $rolesRowset = Dsao_Registry::getTable('acl_role')->fetchAll();
00023
00024
00025 $rolesArray = array();
00026
00027
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
00035 foreach ($rolesArray as $role)
00036 {
00037
00038 $parents = array();
00039
00040
00041 foreach (explode(',', $role['parents']) as $roleId)
00042 {
00043
00044 if (isset($rolesArray[$roleId]))
00045 {
00046 $parents[] = $rolesArray[$roleId]['object'];
00047 }
00048 }
00049
00050 $acl->addRole($role['object'], $parents);
00051 }
00052
00053
00054
00055
00056 $xmlLoaderResources =
00057 new Dsao_Xml_Loader(XML_DIR.self::ACL_RESOURCES_DIR,
00058
00059 Dsao_Module_Broker::getInstance()->getModulesActive(true));
00060
00061
00062 $permissions = array();
00063
00064
00065 $resourcesArray = array();
00066
00067
00068 foreach ($xmlLoaderResources->getXmlObjects() as $xml)
00069 {
00070
00071 foreach ($xml->children() as $child)
00072 {
00073
00074 $resourcesArray[(string) $child->id] =
00075 new Zend_Acl_Resource($child->id);
00076
00081
00082 $indexPermission = 'allowed';
00083
00084
00085 $childArray = (array) $child;
00086
00087
00088 $rolesAllowed = (isset($childArray['allow']) ?
00089 (array) $childArray['allow'] : array());
00090 $rolesDenied = (isset($childArray['deny']) ?
00091 (array) $childArray['deny'] : array());;
00092
00093
00094 array_push($rolesAllowed, null);
00095
00096
00097 foreach (array_merge($rolesAllowed, $rolesDenied) as $roleId)
00098 {
00099
00100 if (null === $roleId)
00101 {
00102 $indexPermission = 'denied';
00103 }
00104
00105
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
00119 foreach ($resourcesArray as $resource)
00120 {
00121
00122 $parent = null;
00123
00124
00125 if (false !==
00126 ($lastUnderscorePosition = strrpos($resource->getResourceId(), '_')))
00127 {
00128
00129 $parent = substr($resource->getResourceId(),
00130
00131 0,
00132
00133 $lastUnderscorePosition);
00134
00135
00136 if (isset($resourcesArray[$parent]))
00137 {
00138 $parent = $resourcesArray[$parent];
00139 }
00140 }
00141
00142 $acl->add($resource, $parent);
00143 }
00144
00145
00146 foreach ($rolesArray as $roleId => $role)
00147 {
00148
00149 $allowed = ( isset($permissions[$roleId]['allowed']) ?
00150 $permissions[$roleId]['allowed'] : null);
00151
00152
00153 if (null !== $allowed || 1 == $roleId)
00154 {
00155 $acl->allow($role['object'], $allowed);
00156 }
00157
00158
00159 if (isset($permissions[$roleId]['denied']))
00160 {
00161 $acl->deny($role['object'], $permissions[$roleId]['denied']);
00162 }
00163 }
00164
00165
00166 $acl->allow($rolesArray[1]['object']);
00167
00168 return $acl;
00169 }
00170 }