CakePHP, budowanie drzewa ACOs dla AuthComponent
December 3rd, 2007 by prondCakePHP 1.2 udostepnia deweloperom bardzo wygodny AuthComponent. Dołączenie go w aplikacji jest na prawdę szybkie i przyjemne. Wystarczy zerknąć na następujące dwa tutoriale :
- http://lemoncake.wordpress.com/2007/07/19/using-authcomponent-and-acl-in-cakephp-12/
- http://lemoncake.wordpress.com/2007/07/19/acl-with-groups/
Wszystko idzie gładko aż do momentu, w którym chcemy zbudować drzewo Acos.
Zrobienie tego ręcznie odpada, dlatego napisałem krótką metodę, która buduje drzewko Acos oraz dla opcjonalnego argumentu $adminAro nadaje uprawnienia do wszystkich kontrolerów. Będzie to szczególnie przydatne przy instalacji aplikacji.
/** * Builds Acos tree from current app controllers and actions: * controller1 * |--action1 * |--action2 * controller2 * |--action1 * |--action2 * */ function _buildAcosTree($adminAro = null) { $aco = new Aco(); $excludedActions = array("apperror","map","action_map"); $excludedActions = am($excludeList,get_class_methods('Controller')); $controllers = listClasses(APP."/controllers/"); foreach ($controllers as &$controller) { require_once($controller); $controller = preg_replace('/.php/','',$controller); $controllerAlias = Inflector::camelize(preg_replace('/_controller/','',$controller)); $controllerActions = array_diff(get_class_methods(Inflector::camelize($controller)), $excludedActions); if (!$aco->findByAlias($controllerAlias)) { $aco->create(); $aco->save(array('alias'=>$controllerAlias)); } if (!empty($adminAro)) { $this->Acl->allow($adminAro, $controllerAlias); } $parent = $aco->findByAlias($controllerAlias); $parentId = $parent['Aco']['id']; foreach ($controllerActions as $action) { if ($action{0} <> "_") { if (!$aco->findByAliasAndParentId($action,$parentId)) { $aco->create(); $aco->save(array('parent_id'=>$parentId,'alias'=>"{$action}")); } } } } }
Posted in CakePHP |