43200,'cookie_secure' => true,'cookie_httponly' => true]); if(isset($_SESSION['REMOTE_ADDR']) && $_SESSION['REMOTE_ADDR'] != $_SERVER['REMOTE_ADDR']) unset($_SESSION["USER_ID"]); //Делаемся не авторизованным если зашли с другого ip адреса //sleep(1); //Тестирование с задержкой //require_once("../../config.xyz"); Должно быть обьявлено во внешнем файле require_once("treetools.php"); /** * Отправить клиенту информацию о ошибке * @param String $e - Наименование ошибки */ function sendError($e) { header('Content-type: text/xml'); header("Cache-Control: no-cache, must-revalidate"); echo ''; Exit(); } /** * Взять данные из базы данных в результсет * @param Node $treeNode - DOM узел переданной клиентом * @param Node $currNode - DOM узел из файла tree.xml параметрам фильтра которого будут присвоенны значения из treeNode (недостающие фильтры возтмуться из nodeMetadata) * @return PDOStatement|NULL Результ-сет */ function fnGetData($treeNode,$currNode) { $sql=getSQLFromP($treeNode,$currNode); if(gettype($_SESSION['USER_ID'])=='string') $sql=str_replace('${_user_id}',$_SESSION['USER_ID']=='' ? 'null' : '\''.$_SESSION['USER_ID'].'\'',$sql); else $sql=str_replace('${_user_id}',$_SESSION['USER_ID']=='' ? 'null' : $_SESSION['USER_ID'],$sql); global $db; try { return $db->query($sql); } catch (Exception $e) { sendError($e->getMessage()."\n\n".$sql); } return null; } //end of function fnGetData if (!isset($_SESSION['USER_ID'])) $_SESSION['USER_ID']=''; //По умолчанию анонимный пользователь //sendError("Вы не авторизованы!"); //Открываем XML структуры дерева $objXMLDocument = new DOMDocument(); try { $objXMLDocument->load($treexml); //Объявлен в нешнем файле $treexml } catch (Exception $e) { sendError($e->getMessage()); } $mainNode = $objXMLDocument->documentElement; // Соединяемся с базой данных $db=null; try { $db = new PDO($db_connection, $db_login, $db_password); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e) { sendError('Connect error '.$_SERVER['HTTP_HOST'].': "'.$e->getMessage().'"!'); } //Отправить клиенту заранее построеный файл (чтоб каждый раз не запрашивал данные) if(isset($_REQUEST['fn'])) $fn=$_REQUEST['fn']; else $fn=''; if(isset($_REQUEST['name'])) $name=$_REQUEST['name']; else $name=''; if(isset($_REQUEST['path'])) $path=$_REQUEST['path']; else $path=''; if($fn=='0') //Генерить XML фаил дерева { echo ''; echo "Начинаем строить дерево

"; $xmlstr=getTreeArray(findNode($mainNode,'type'),null,$db,true,$path); if($handle = fopen($name, 'w')) { echo strtolower(afterLast($name,'.')).'
'; if(strtolower(afterLast($name,'.'))=='js') { $xmlstr = str_replace("\n","",$xmlstr); $xmlstr = str_replace("'","\'",$xmlstr); fwrite($handle, 'var '.beforeFirst($name,'.')."='"); fwrite($handle, $xmlstr); fwrite($handle, "';"); }else { fwrite($handle, $xmlstr); } fclose($handle); } echo "
Построили
"; echo ''; Exit(); } //принимаем XML данные для заполнения фильтра $docReq = new DOMDocument(); try { $docReq->loadXML(file_get_contents("php://input")); } catch (Exception $e) { sendError($e->getMessage()); } $reqNode=$docReq->documentElement; if ($reqNode) { $fn=$reqNode->getAttribute("fn"); $treeid=$reqNode->getAttribute("treeid"); $htmlid=$reqNode->getAttribute("htmlid"); }else exit(); if($fn=='1') { header('Content-type: text/xml'); //Прочитать подготовленый файл в поток readfile('test_tree.xml'); Exit(); }else if($fn=='2') { $xmlstring=""; $xmlnode=""; //находим нужный узел в tree.xml для того чтобы выполнить запрос $mainNode=findFirstNodeOnAttribute($mainNode,"type","id",$treeid); if($mainNode!=null) { //перебераем все дочерние элементы и для каждого выполняем запрос c фильтрацией $currNode = $mainNode->firstChild; //из tree.xml while ($currNode != null) { $tmpNode=$currNode; //если узел goto if($tmpNode->nodeName=="goto") //если встретилась "зацикливалка" { $treeid=$tmpNode->getAttribute("id"); $tmpNode=findFirstNodeOnAttribute($objXMLDocument->documentElement,"type","id",$treeid); if($tmpNode==null) { $currNode = $currNode->nextSibling; continue; } } if($tmpNode->nodeName=="type") //если выборка из базы { $treeid=$tmpNode->getAttribute("id"); $caption=$tmpNode->getAttribute("c"); //$j=0; $res=fnGetData($reqNode,$tmpNode);//currNode из tree.xml if($res==null) { sendError('fnGetData==null!'); } while ($row = $res->fetch(PDO::FETCH_ASSOC)) { if(array_key_exists('id', $row)) $fid=$row['id']; else $fid=''; //Уникальный id записи if(array_key_exists('icon_id', $row)) $iid=$row['icon_id']; else $iid=''; //id значка if(array_key_exists($caption, $row)) $val=$row[$caption]; else $val=''; //Заголовок $visible=''; if($tmpNode->getAttribute("visible")=="0") $visible=' visible="0" '; //Для проверки есть ли дети составляем XML запрос и отправляем в вункцию как будто он пришел от клиента //c - Есть ли под узлы по умолчанию есть //fid - id записи //iid - id иконки //treeid - id ветки дерева //ObjectID - название поля с уникальным идентификатором записи $xmlnode=''; $xmlnode.=''; $xmlnode.=''; //сохраняем параметры фильтра для дочерних элементов с текщем состоянием //перебираем фильтры которые должны быть заполненны для каждого узла даные для фильтра беруться из результ сета $xmlnode.=''; //считываем название поля и находим данные в результсете $nodeParam = findFirstNode($tmpNode, 'columns'); //tree.xml if($nodeParam!=null) $nodeParam=$nodeParam->firstChild; while ($nodeParam != null) { if($nodeParam->nodeName=="param") { $fname=$nodeParam->getAttribute("n"); try { if(array_key_exists($fname, $row)) $fval=$row[$fname]; else $fval=getCdataValue($nodeParam); } catch (Exception $e) { sendError($e->getMessage()); } $xmlnode.=''; } $nodeParam = $nodeParam->nextSibling; } $xmlnode.=''; $xmlnode.=''; //парсим созданную ветку дерева в DOMDocument потом посылаем в функцию взятия данных как будто их все открыли //если есть данные то у этого узла дерева есть дети c="1" инече нет c="0". $child=0; $objXMLDocTree = new DOMDocument(); try { $objXMLDocTree->loadXML($xmlnode); } catch (Exception $e) { sendError($e->getMessage()); } $testNodeTree=$objXMLDocTree->documentElement; $testNode = $tmpNode->firstChild; //Текущий узел из tree.xml while ($testNode != null) { $tmpNode2=$testNode; if($tmpNode2->nodeName=="goto") { $treeid=$tmpNode2->getAttribute("id"); $tmpNode2=findFirstNodeOnAttribute($objXMLDocument->documentElement,"type","id",$treeid); if($tmpNode2==null) { $testNode = $testNode->nextSibling; continue; } } if($tmpNode2->nodeName=="type") { $testrs=fnGetData($testNodeTree,$tmpNode2); if(($testrs!=null)&&($testrs->rowCount()>0)) { $child=1; break; } } $testNode = $testNode->nextSibling; } $testNodeTree->setAttribute("c",$child); $xmlstring.=$objXMLDocTree->saveXML($objXMLDocTree->documentElement); //Закончили проверку на детей } $res->closeCursor(); } $currNode = $currNode->nextSibling; } }else { sendError('Can\'t find "type" node id='.$treeid.' in "'.$treexml.'"!'); } $xmlstring=''.$xmlstring.''; header('Content-type: text/xml'); echo $xmlstring; exit(); }