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; }
public function buildArrows($node) { $prevBro = K_tree::getPrevBro($node['tree_id']); $nextBro = K_tree::getNextBro($node['tree_id']); return '<a href = "javascript:void(0)" ' . ($prevBro['tree_link'] ? '' : 'style="display:none"') . '" id = "arrow-prev" data-link = "' . $prevBro['tree_link'] . '" class="arrow-prev-next" >Предыдущий</a>' . '<a href = "javascript:void(0)" ' . ($nextBro['tree_link'] ? '' : 'style="display:none"') . '" id = "arrow-next" data-link = "' . $nextBro['tree_link'] . '" class="arrow-prev-next" >Следующий</a>'; }
public function updateElementAction() { $this->disableRender = true; $values = array(); $treeTable = new K_Tree_Model(); $elementId = $this->getParam('id'); $node = K_tree::getNode($elementId); $typeModelName = 'Type_Model_' . ucfirst($node['tree_type']); $typeModel = new $typeModelName(); $query = new K_Db_Query(); $columns = $query->q('SHOW COLUMNS FROM `type_' . $node['tree_type'] . '`'); foreach ($columns as $c_key => $column) { $columns[$c_key] = $column->toArray(); foreach ($_POST as $p_key => $value) { if ('type_' . $node['tree_type'] . '_' . $p_key == $columns[$c_key]['Field']) { $values['type_' . $node['tree_type'] . '_' . $p_key] = $value; } elseif ($columns[$c_key]['Field'] == 'type_' . $node['tree_type'] . '_aaccess') { $values['type_' . $node['tree_type'] . '_aaccess'] = ''; } } } $form = new K_Form(); $uploadDir = WWW_PATH . '/upload'; $typeFiles = $form->getFiles(); $typesModel = new K_Tree_Types_Model(); $typeData = $typesModel->select('type_fields')->where('`type_name`="' . $node['tree_type'] . '"')->fetchRow(); $typeData = $typeData->toArray(); $typeData = unserialize($typeData['type_fields']); $typeData = json_decode($typeData['form_structure']); if ($form->hasFiles()) { $typeFiles = $form->getFiles(); } foreach ($typeData as $key => $value) { /* если необходимо добавлять текущее время к дате if($value->values->name == 'date'){ $dates = K_date::dateParse($_POST['date']); $values['type_' . $node['tree_type'] . '_date'] = date('Y-m-d',$dates['ts']) .' '.date('G:i:s',time()); } */ // var_dump($typeFiles); if ($value->type == 'file' || $value->type == 'multifile') { if ($value->type == 'multifile') { $currentTypeData = $typeModel->select()->where('`type_' . $node['tree_type'] . '_id`=' . (int) $node['tree_id'])->fetchRow(); $currentTypeData = $currentTypeData->toArray(); // массив файлов сохранённый в базе; if ($filesArray = unserialize($currentTypeData['type_' . $node['tree_type'] . '_' . $value->values->name])) { $i = 0; $fcount = count($filesArray); for ($i = 0; $i < $fcount; $i++) { $isDelete = false; if ($_POST[$value->values->name . '_delete_' . $i] || $typeFiles[$value->values->name . '_f_' . $i]) { $currentLastLoadedFile = $uploadDir . '/' . $filesArray[$i]['f']; if (is_file($currentLastLoadedFile)) { unlink($currentLastLoadedFile); } unset($filesArray[$i]); $isDelete = true; } if (!$isDelete && $_POST[$value->values->name . '_t_' . $i]) { $filesArray[$i]['t'] = $_POST[$value->values->name . '_t_' . $i]; } } } foreach ($typeFiles as $k => $v) { if (preg_match('/^' . $value->values->name . '_f_([0-9]*)$/s', $k, $m)) { if (is_dir($uploadDir)) { $pathData = $form->moveUploadedFile($k, $uploadDir, md5(time() . rand()), true); /* if ($value->values->filter) { $filters = explode('|', $value->values->filter); foreach ($filters as $filter) { $filter = explode(':', $filter); if ($filter[0] == 'image') { $pathData['path'] = '/images/'.$pathData['filename'].'&'.$filter[1]; } } }*/ } else { $this->putAjax('Директории для загрузки не существует "' . $k . '"!'); } if ($pathData) { $fileOne['f'] = $pathData['filename']; if (!empty($_POST[$value->values->name . '_t_' . $m[1]])) { $fileName = $_POST[$value->values->name . '_t_' . $m[1]]; } else { $fileName = $v['name']; } $fileOne['t'] = $fileName; $filesArray[] = $fileOne; } else { $this->putAjax('Не удалось загрузить файл "' . $k . '"!'); } } } //упорядочим массив $filesArrayOrdered = array(); foreach ($filesArray as $v) { if (isset($v)) { $filesArrayOrdered[] = $v; } } $values['type_' . $node['tree_type'] . '_' . $value->values->name] = count($filesArrayOrdered) ? serialize($filesArrayOrdered) : ''; } else { if ($_POST[$value->values->name . '_delete']) { $currentTypeData = $typeModel->select()->where('`type_' . $node['tree_type'] . '_id`=' . (int) $node['tree_id'])->fetchRow(); $currentTypeData = $currentTypeData->toArray(); $currentLastLoadedFile = $uploadDir . '/' . $currentTypeData['type_' . $node['tree_type'] . '_' . $value->values->name]; if (is_file($currentLastLoadedFile)) { unlink($currentLastLoadedFile); } $values['type_' . $node['tree_type'] . '_' . $value->values->name] = ''; } else { if ($form->hasFiles() && isset($typeFiles[$value->values->name])) { if (is_dir($uploadDir)) { $currentTypeData = $typeModel->select()->where('`type_' . $node['tree_type'] . '_id`=' . (int) $node['tree_id'])->fetchRow(); $currentTypeData = $currentTypeData->toArray(); $currentLastLoadedFile = $uploadDir . '/' . $currentTypeData['type_' . $node['tree_type'] . '_' . $value->values->name]; if (is_file($currentLastLoadedFile)) { unlink($currentLastLoadedFile); } $pathData = $form->moveUploadedFile($value->values->name, $uploadDir, md5(time() . rand()), true); /* if ($value->values->filter) { $filters = explode('|', $value->values->filter); foreach ($filters as $filter) { $filter = explode(':', $filter); if ($filter[0] == 'image') { $pathData['path'] = '/images/'.$pathData['filename'].'&'.$filter[1]; } } }*/ } else { $this->putAjax('Директории для загрузки не существует "' . $value->values->name . '"!'); } if ($pathData) { $values['type_' . $node['tree_type'] . '_' . $value->values->name] = $pathData['filename']; } else { $this->putAjax('Не удалось загрузить файл "' . $value->values->name . '"!'); } } else { if ($value->values->filter == 'required' && !isset($typeFiles[$value->values->name])) { $this->putAjax('Файл "' . $value->values->name . '" не был загружен!'); } else { if (!$values['type_' . $node['tree_type'] . '_' . $value->values->name]) { unset($values['type_' . $node['tree_type'] . '_' . $value->values->name]); } } } } } } } $typeModel->update($values, '`type_' . $node['tree_type'] . '_id`=' . (int) $elementId); echo 'Данные сохранены! <script type="text/javascript"> $(document).ready(function(){ setTimeout(function(){ loadTabs(' . (int) $elementId . '); }, 2000); }); </script> '; }
public function prevNextLoad() { $treeLink = $_POST['link']; $node = K_tree::getNode($treeLink); if (!$node) { $jsonReturn['error'] = true; $jsonReturn['msg'] = 'Ошибка: неправильная ссылка на элемент'; $this->putJSON($jsonReturn); } $jsonReturn['error'] = false; $prevBro = K_tree::getPrevBro($node['tree_id']); $nextBro = K_tree::getNextBro($node['tree_id']); $jsonReturn['prev'] = !empty($prevBro['tree_link']) ? $prevBro['tree_link'] : false; $jsonReturn['next'] = !empty($nextBro['tree_link']) ? $nextBro['tree_link'] : false; $jsonReturn['html'] = K_Request::call(array('module' => 'default', 'controller' => 'index', 'action' => 'page', 'params' => array('0' => $treeLink), 'disableLayout' => false, 'layout' => 'contentlayout')); $this->putJSON($jsonReturn); }
public function updateElementAction() { $this->disableRender = true; $values = array(); $treeTable = new K_Tree_Model(); $elementId = $this->getParam('id'); $node = K_tree::getNode($elementId); $typeModelName = 'Type_Model_' . ucfirst($node['tree_type']); $typeModel = new $typeModelName(); $query = new K_Db_Query(); $columns = $query->q('SHOW COLUMNS FROM `type_' . $node['tree_type'] . '`'); foreach ($columns as $c_key => $column) { $columns[$c_key] = $column->toArray(); foreach ($_POST as $p_key => $value) { if ('type_' . $node['tree_type'] . '_' . $p_key == $columns[$c_key]['Field']) { $values['type_' . $node['tree_type'] . '_' . $p_key] = $value; } elseif ($columns[$c_key]['Field'] == 'type_' . $node['tree_type'] . '_aaccess') { $values['type_' . $node['tree_type'] . '_aaccess'] = ''; } } } $form = new K_Form(); $uploadDir = WWW_PATH . '/upload'; $typeFiles = $form->getFiles(); $typesModel = new K_Tree_Types_Model(); $typeData = $typesModel->select('type_fields')->where('`type_name`="' . $node['tree_type'] . '"')->fetchRow(); $typeData = $typeData->toArray(); $typeData = unserialize($typeData['type_fields']); $typeData = json_decode($typeData['form_structure']); if ($form->hasFiles()) { $typeFiles = $form->getFiles(); } foreach ($typeData as $key => $value) { if ($value->type == 'file') { if ($_POST[$value->values->name . '_delete']) { $currentTypeData = $typeModel->select()->where('`type_' . $node['tree_type'] . '_id`=' . (int) $node['tree_id'])->fetchRow(); $currentTypeData = $currentTypeData->toArray(); $currentLastLoadedFile = $uploadDir . '/' . $currentTypeData['type_' . $node['tree_type'] . '_' . $value->values->name]; if (is_file($currentLastLoadedFile)) { unlink($currentLastLoadedFile); } $values['type_' . $node['tree_type'] . '_' . $value->values->name] = ''; } else { if ($form->hasFiles() && isset($typeFiles[$value->values->name])) { if (is_dir($uploadDir)) { $currentTypeData = $typeModel->select()->where('`type_' . $node['tree_type'] . '_id`=' . (int) $node['tree_id'])->fetchRow(); $currentTypeData = $currentTypeData->toArray(); $currentLastLoadedFile = $uploadDir . '/' . $currentTypeData['type_' . $node['tree_type'] . '_' . $value->values->name]; if (is_file($currentLastLoadedFile)) { unlink($currentLastLoadedFile); } $pathData = $form->moveUploadedFile($value->values->name, $uploadDir, md5(time() . rand()), true); /* if ($value->values->filter) { $filters = explode('|', $value->values->filter); foreach ($filters as $filter) { $filter = explode(':', $filter); if ($filter[0] == 'image') { $pathData['path'] = '/images/'.$pathData['filename'].'&'.$filter[1]; } } }*/ } else { $this->putAjax('Директории для загрузки не существует "' . $value->values->name . '"!'); } if ($pathData) { $values['type_' . $node['tree_type'] . '_' . $value->values->name] = $pathData['filename']; } else { $this->putAjax('Не удалось загрузить файл "' . $value->values->name . '"!'); } } elseif ($value->values->filter == 'required' && !isset($typeFiles[$value->values->name])) { $this->putAjax('Файл "' . $value->values->name . '" не был загружен!'); } else { if (!$values['type_' . $node['tree_type'] . '_' . $value->values->name]) { unset($values['type_' . $node['tree_type'] . '_' . $value->values->name]); } } } } } $typeModel->update($values, '`type_' . $node['tree_type'] . '_id`=' . (int) $elementId); echo 'Данные сохранены! <script type="text/javascript"> setTimeout(function(){ $("a.jstree-clicked").click(); } }); </script> '; }
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;