public static function accessTree($nodeId, $privilege = null, $addNodes = false) { self::initTree(); $nodeArr = K_tree::getParents($nodeId); // выбираем всех родителей ноды $nodeArr[] = $nodeId; // добовляем id самой ноды $allowTrigger = false; $access = false; // по умолчанию доступ запрещён //проверяем на доступ ноду со всеми её родителями к которой запрашиваються потомки // проверка идёт с верху вниз /** *@todo протестировать проверку с низу-вверх, как быстрей ? */ // c низу вверх(должно работать быстрей); //проверка не самой ноды а сразу ноды родителя(необходимо для привелегий add addremove) if ($addNodes) { array_pop($nodeArr); } $i = count($nodeArr); for ($i; $i > 0; $i--) { $resourse = implode('/', $nodeArr); array_pop($nodeArr); $access = K_Access::aclTree()->isAllowed(K_Auth::getRoles(), $resourse, $privilege); if (K_Access::aclTree()->lastResource) { break; } } /* // проверка с верху ввниз foreach ($nodeArr as $v) { $resourseArr[] = $v; $resourse = implode('/', $resourseArr); $access = K_Access::aclTree()->isAllowed(K_Auth::getRoles(), $resourse, null); if (K_Access::aclTree()->lastResource == null) { $access = $allowTrigger; } else { $lastKnowResourse = K_Access::aclTree()->lastResource; } $allowTrigger = $access; }*/ return $access; }
Returns data for client-side tree var data = [ { label: 'Тест', children: [ { label: 'child1' }, { label: 'child2' } ] }, { label: 'Тест 2', children: [ { label: 'child3' } ] } ]; */ public function getAction() { $this->disableRender = true; $query = new K_Db_Query(); $treeStructure = array(); $treeElements = array(); if ($this->getParam('pid')) { $nodeId = $this->getParam('pid'); } else { $nodeId = 0; } // Прийдётся лезть в тип списка $pidType = K_TreeQuery::gOne((int) $nodeId); //var_dump($pidType); if ($pidType['sorted'] == "По алфавиту") { $order = "`t1`.`tree_title`"; } else { $order = "`t1`.`tree_lkey`"; } $sql = 'SELECT `t1`.*, COUNT(`t2`.`tree_id`) as subElements FROM `tree` as `t1` LEFT JOIN `tree` as `t2` ON `t2`.`tree_pid` = `t1`.`tree_id` WHERE `t1`.`tree_pid`=' . (int) $nodeId . ' GROUP BY `t1`.`tree_id`, `t1`.`tree_pid`, `t1`.`tree_title` ORDER BY ' . $order; $treeElements = $query->q($sql); foreach ($treeElements as $key => $column) { $treeElements[$key] = $column->toArray(); } if ($nodeId != '0') { $nodeArr = K_tree::getParents($nodeId); // выбираем всех родителей ноды $nodeArr[] = $nodeId; // добовляем id самой ноды // проверяем на доступ ноду со всеми её родителями к которой запрашиваються потомки /* foreach ( $pid_node_perents as $v ) { if ( is_string( $v ) ) { $resourse_arr[] = $v; $resourse = 't:' . implode( '/', $resourse_arr ); // echo $resourse; try { $access = K_Access::acl()->isAllowed( K_Auth::getRoles(), $resourse, 'view' ); // var_dump($access); } catch ( exception $e ) { $access = $allow_trigger; } $allow_trigger = $access; } }*/ //строим ресур запрашиваемой ноды если нода не равна 0 $allowTrigger = false; $access = false; $_nodeArr = $nodeArr; for ($i = count($_nodeArr); $i > 0; $i--) { $resourse = implode('/', $_nodeArr); array_pop($_nodeArr); $access = K_Access::aclTree()->isAllowed(K_Auth::getRoles(), $resourse, true); if (K_Access::aclTree()->lastResource) { break; } } $allowTrigger = $access;