Первая копия
3
metadata/tree/.htaccess
Normal file
@ -0,0 +1,3 @@
|
||||
RewriteEngine on
|
||||
# Убирает версию файла из file_v1234567890.js в file.js
|
||||
RewriteRule ^(.*)_v[0-9]*\.(css|js|gif|png|jpg)$ $1.$2 [L]
|
||||
BIN
metadata/tree/blank.gif
Normal file
|
After Width: | Height: | Size: 43 B |
BIN
metadata/tree/icons/Loading.gif
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
metadata/tree/icons/blank.gif
Normal file
|
After Width: | Height: | Size: 55 B |
BIN
metadata/tree/icons/ico16_-1.png
Normal file
|
After Width: | Height: | Size: 131 B |
BIN
metadata/tree/icons/ico16_0.png
Normal file
|
After Width: | Height: | Size: 131 B |
BIN
metadata/tree/icons/ico16_1.png
Normal file
|
After Width: | Height: | Size: 774 B |
BIN
metadata/tree/icons/ico16_10.png
Normal file
|
After Width: | Height: | Size: 475 B |
BIN
metadata/tree/icons/ico16_11.png
Normal file
|
After Width: | Height: | Size: 500 B |
BIN
metadata/tree/icons/ico16_12.png
Normal file
|
After Width: | Height: | Size: 841 B |
BIN
metadata/tree/icons/ico16_13.png
Normal file
|
After Width: | Height: | Size: 597 B |
BIN
metadata/tree/icons/ico16_14.png
Normal file
|
After Width: | Height: | Size: 624 B |
BIN
metadata/tree/icons/ico16_15.png
Normal file
|
After Width: | Height: | Size: 636 B |
BIN
metadata/tree/icons/ico16_16.png
Normal file
|
After Width: | Height: | Size: 703 B |
BIN
metadata/tree/icons/ico16_17.png
Normal file
|
After Width: | Height: | Size: 526 B |
BIN
metadata/tree/icons/ico16_18.png
Normal file
|
After Width: | Height: | Size: 729 B |
BIN
metadata/tree/icons/ico16_19.png
Normal file
|
After Width: | Height: | Size: 611 B |
BIN
metadata/tree/icons/ico16_2.png
Normal file
|
After Width: | Height: | Size: 218 B |
BIN
metadata/tree/icons/ico16_20.png
Normal file
|
After Width: | Height: | Size: 841 B |
BIN
metadata/tree/icons/ico16_21.png
Normal file
|
After Width: | Height: | Size: 344 B |
BIN
metadata/tree/icons/ico16_22.png
Normal file
|
After Width: | Height: | Size: 622 B |
BIN
metadata/tree/icons/ico16_23.png
Normal file
|
After Width: | Height: | Size: 590 B |
BIN
metadata/tree/icons/ico16_24.png
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
metadata/tree/icons/ico16_25.png
Normal file
|
After Width: | Height: | Size: 620 B |
BIN
metadata/tree/icons/ico16_26.png
Normal file
|
After Width: | Height: | Size: 587 B |
BIN
metadata/tree/icons/ico16_27.png
Normal file
|
After Width: | Height: | Size: 304 B |
BIN
metadata/tree/icons/ico16_28.png
Normal file
|
After Width: | Height: | Size: 751 B |
BIN
metadata/tree/icons/ico16_29.png
Normal file
|
After Width: | Height: | Size: 802 B |
BIN
metadata/tree/icons/ico16_3.png
Normal file
|
After Width: | Height: | Size: 697 B |
BIN
metadata/tree/icons/ico16_30.png
Normal file
|
After Width: | Height: | Size: 641 B |
BIN
metadata/tree/icons/ico16_31.png
Normal file
|
After Width: | Height: | Size: 153 B |
BIN
metadata/tree/icons/ico16_32.png
Normal file
|
After Width: | Height: | Size: 855 B |
BIN
metadata/tree/icons/ico16_33.png
Normal file
|
After Width: | Height: | Size: 740 B |
BIN
metadata/tree/icons/ico16_34.png
Normal file
|
After Width: | Height: | Size: 625 B |
BIN
metadata/tree/icons/ico16_35.png
Normal file
|
After Width: | Height: | Size: 431 B |
BIN
metadata/tree/icons/ico16_36.png
Normal file
|
After Width: | Height: | Size: 511 B |
BIN
metadata/tree/icons/ico16_4.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
metadata/tree/icons/ico16_5.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
metadata/tree/icons/ico16_6.png
Normal file
|
After Width: | Height: | Size: 772 B |
BIN
metadata/tree/icons/ico16_7.png
Normal file
|
After Width: | Height: | Size: 440 B |
BIN
metadata/tree/icons/ico16_8.png
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
metadata/tree/icons/ico16_9.png
Normal file
|
After Width: | Height: | Size: 605 B |
BIN
metadata/tree/icons/ico24_2.png
Normal file
|
After Width: | Height: | Size: 214 B |
BIN
metadata/tree/icons/ico24_20.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
metadata/tree/icons/ico24_28.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
metadata/tree/icons/ico24_29.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
metadata/tree/icons/ico24_3.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
metadata/tree/icons/ico24_33.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
metadata/tree/icons/ico24_34.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
metadata/tree/icons/ico24_35.png
Normal file
|
After Width: | Height: | Size: 973 B |
BIN
metadata/tree/icons/ico24_36.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
metadata/tree/icons/ico24_6.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
metadata/tree/icons/ico32_2.png
Normal file
|
After Width: | Height: | Size: 225 B |
BIN
metadata/tree/icons/ico32_20.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
metadata/tree/icons/ico32_28.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
metadata/tree/icons/ico32_29.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
metadata/tree/icons/ico32_3.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
metadata/tree/icons/ico32_34.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
metadata/tree/icons/ico32_35.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
metadata/tree/icons/ico32_36.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
metadata/tree/icons/ico32_4.png
Normal file
|
After Width: | Height: | Size: 960 B |
BIN
metadata/tree/icons/ico32_6.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
metadata/tree/icons/minus.gif
Normal file
|
After Width: | Height: | Size: 884 B |
BIN
metadata/tree/icons/minus24.gif
Normal file
|
After Width: | Height: | Size: 931 B |
BIN
metadata/tree/icons/next.gif
Normal file
|
After Width: | Height: | Size: 108 B |
BIN
metadata/tree/icons/plus.gif
Normal file
|
After Width: | Height: | Size: 889 B |
BIN
metadata/tree/icons/plus24.gif
Normal file
|
After Width: | Height: | Size: 938 B |
29
metadata/tree/index.html
Normal file
@ -0,0 +1,29 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<title>Tree</title>
|
||||
<style type="text/css">
|
||||
html,body,div
|
||||
{
|
||||
height:100%;
|
||||
margin:0px;
|
||||
padding:0px;
|
||||
font-size: 14px;
|
||||
font-family: Arial;
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript" src="../dbms/tools.js"></script>
|
||||
<script type="text/javascript" src="tree.js"></script>
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
function onloadpage()
|
||||
{
|
||||
tree=new TTree(document.getElementById("maintree"),"tr_","tree.php","./",24);
|
||||
tree.Start();
|
||||
}
|
||||
//]]></script>
|
||||
</head>
|
||||
<body onload="onloadpage()">
|
||||
<div id="maintree"></div>
|
||||
</body>
|
||||
</html>
|
||||
518
metadata/tree/tools.php
Normal file
@ -0,0 +1,518 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Обвернуть строку в кавычки в соответствии с типом.
|
||||
* @param String $t Тип
|
||||
* @param String $v Значение
|
||||
* @return String Строка
|
||||
*/
|
||||
function getSQLValue($t,$v)
|
||||
{
|
||||
if($t=='object' && gettype($v)=='string') $t='string'; //Если id шники uuid
|
||||
|
||||
if($t=='object')
|
||||
{ if (($v=='-1')||($v=='')) $v='NULL';
|
||||
}else
|
||||
if($t=='i4' || $t=='integer')
|
||||
{ if($v=='') $v='NULL';
|
||||
}else
|
||||
if($t=='f8')
|
||||
{ if($v=='')$v='NULL';
|
||||
$v=str_replace(',','.',$v); //Разделитель целой и дробной части точка
|
||||
}else
|
||||
if($t=='b')
|
||||
{ if($v=='') $v='NULL'; else
|
||||
if($v=='1') $v='true'; else
|
||||
if($v=='0') $v='false';
|
||||
}else
|
||||
if($t=='string' || $t=='dateTime' || $t=='date')
|
||||
{ if($v=='')
|
||||
{ $v='NULL';
|
||||
}else
|
||||
{ $v=str_replace('\'','\\\'',$v); //так как в SQL строку вставляется
|
||||
$v='\''.$v.'\'';
|
||||
}
|
||||
}else
|
||||
$v='\''.$v.'\'';
|
||||
return $v;
|
||||
}
|
||||
|
||||
/** Перенести параметры из родительского в sql строку дочернего элемента
|
||||
* @param object $nParent
|
||||
* @param object $nChild
|
||||
* @result Строка
|
||||
*/
|
||||
function getSQL($nParent,$nChild)
|
||||
{
|
||||
if($nChild==null) return '';
|
||||
$nPs=findNode($nParent, 'columns');
|
||||
$nFs=findNode($nChild, 'filter');
|
||||
//Переносим значения в фильтр
|
||||
if($nFs!=null)
|
||||
{
|
||||
if($nPs!=null) $nP=$nPs->firstChild; else $nP=null;
|
||||
while ($nP != null)
|
||||
{
|
||||
if ($nP->nodeName=='param')
|
||||
{
|
||||
$val=getCdata($nP)->nodeValue;
|
||||
|
||||
$nF=findNodeOnAttribute($nFs, 'column', 'pn', $nP->getAttribute("n"));
|
||||
if($nF!=null) getCdata($nF)->nodeValue=$val;
|
||||
}
|
||||
$nP = $nP->nextSibling;
|
||||
}
|
||||
}
|
||||
//Переносим значения в SQL запрос из фильтра
|
||||
$sql=getCdataValue(findNode($nChild,'sql-query'));
|
||||
$nFs=findNode($nChild, 'filter');
|
||||
if($nFs!=null)
|
||||
{ $nF=$nFs->firstChild;
|
||||
while($nF != null)
|
||||
{
|
||||
if($nF->nodeName=='column')
|
||||
{
|
||||
$sql=str_replace('${'.$nF->getAttribute("n").'}',getSQLValue($nF->getAttribute("vt"),getCdata($nF)->nodeValue),$sql);
|
||||
}
|
||||
$nF=$nF->nextSibling;
|
||||
}
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
//Функция по заданному пути выдаёт все под пути в виде асоциативного массива (тоесть + 1 уровень дерева)
|
||||
//$db - PDO соединение с базой данных
|
||||
//$path - путь "id дерева из XML; id записи из базы; id дерева из XML; id записи из базы;"
|
||||
//$nParent - родительский узел нужен для рекурсии по умолчанию ставить null
|
||||
function GetSubNodes($path,$nParent,&$title)
|
||||
{
|
||||
global $v_db;
|
||||
if($nParent==null) return array();
|
||||
|
||||
$dt=''; //Разделитель для заголовка смотри ниже по тексту "->"
|
||||
|
||||
//По заданному пути спускаемся к нужному узлу дерева
|
||||
$mas=split(';',$path);
|
||||
for($i=0;$i<(count($mas)-1)/2;$i++)
|
||||
{
|
||||
$nChild=findNodeOnAttribute($nParent, 'type', 'id', $mas[$i*2]); //Ищем нужную ветку XML дерева
|
||||
$sql=getSQL($nParent,$nChild); //Выбираем параметры из родительского в дочерний потом из текущего в sql запрос
|
||||
//Выполняем и ищем запись с нужным id
|
||||
$res = $v_db->query($sql);
|
||||
|
||||
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
|
||||
{
|
||||
if($row[$nChild->getAttribute('ObjectID')]==$mas[$i*2+1])
|
||||
{
|
||||
$title.=$dt.$row[$nChild->getAttribute('c')]; //Чтоб отобразить заголовок в виде пути
|
||||
$dt='->';
|
||||
|
||||
//Записываем параметры из текущей записи в параметры для передачи в в следующую итерацию
|
||||
$nPs=findNode($nChild,'columns');
|
||||
$nP=$nPs->firstChild;
|
||||
while ($nP != null)
|
||||
{
|
||||
if ($nP->nodeName=='param')
|
||||
getCdata($nP)->nodeValue=$row[$nP->getAttribute("n")];
|
||||
$nP = $nP->nextSibling;
|
||||
}
|
||||
$nParent=$nChild;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Добрались до самого последнего элемента пути теперь выбераем из всех дочерних узлов
|
||||
$result=array();
|
||||
$nChild=$nParent->firstChild;
|
||||
while ($nChild != null)
|
||||
{
|
||||
if($nChild->nodeName=='goto')
|
||||
{
|
||||
$nType=findFirstNodeOnAttribute($nChild->ownerDocument->documentElement,"type","id",$nChild->getAttribute("id"));
|
||||
if($nType==null) { $nChild = $nChild->nextSibling; continue; }
|
||||
}else $nType=$nChild;
|
||||
|
||||
if ($nType->nodeName=='type')
|
||||
{
|
||||
$sql=getSQL($nParent,$nType);//Получаем SQL запрос перенося параметры из родительского в дочерний а потом в SQL дочернего
|
||||
$res = $v_db->query($sql);
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
|
||||
{
|
||||
$cnt=count($result);
|
||||
$result[$cnt]['name']=$row[$nType->getAttribute('c')];
|
||||
$result[$cnt]['path']=$path.$nType->getAttribute('id').';'.$row[$nChild->getAttribute('ObjectID')].';';
|
||||
}
|
||||
}
|
||||
$nChild = $nChild->nextSibling;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
//Из пути получить асоциативный массив заголовков + путь
|
||||
//$path - путь "id дерева из XML; id записи из базы; id дерева из XML; id записи из базы;"
|
||||
//$nParent - XML узел с которого будет начинаться поиск
|
||||
//$db - База данных PDO
|
||||
function getTXTPath($path,$nParent,$db)
|
||||
{
|
||||
$result=array(); $pos=0;
|
||||
$mas=explode(';',$path);
|
||||
for($i=0;$i<(count($mas)-1)/2;$i++)
|
||||
{
|
||||
$nChild=findNodeOnAttribute($nParent, 'type', 'id', $mas[$i*2]); //Ищем нужную ветку XML дерева
|
||||
if($nChild==null) $nChild=findFirstNodeOnAttribute($nParent->ownerDocument->documentElement, 'type', 'id', $mas[$i*2]);
|
||||
if($nChild==null) continue;
|
||||
|
||||
|
||||
//print $nParent->ownerDocument->saveXML($nParent).'<br>';
|
||||
$sql=getSQL($nParent,$nChild); //Выбираем параметры из родительского в дочерний потом из текущего в sql запрос
|
||||
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);
|
||||
//print $sql.'<br>';
|
||||
|
||||
|
||||
//Выполняем и ищем запись с нужным id
|
||||
$res = $db->query($sql);
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
|
||||
{
|
||||
if($row[$nChild->getAttribute('ObjectID')]==$mas[$i*2+1])
|
||||
{
|
||||
$result[$pos]['name']=$row[$nChild->getAttribute('c')];
|
||||
$result[$pos]['path']=$mas[$i*2].';'.$mas[$i*2+1].';';
|
||||
|
||||
|
||||
//Записываем параметры из текущей записи в параметры для передачи в в следующую итерацию
|
||||
$nP=findNode($nChild, 'columns');
|
||||
if($nP!=null) $nP=$nP->firstChild;
|
||||
while ($nP != null)
|
||||
{
|
||||
if ($nP->nodeName=='param')
|
||||
{
|
||||
if(isset($row[$nP->getAttribute("n")]))
|
||||
getCdata($nP)->nodeValue=$row[$nP->getAttribute("n")];
|
||||
if(isset($row[$nP->getAttribute("n")]))
|
||||
$result[$pos][$nP->getAttribute("n")]=$row[$nP->getAttribute("n")];
|
||||
|
||||
//getCdata($nP)->nodeValue=$row[$nP->getAttribute("n")];
|
||||
//$result[$pos][$nP->getAttribute("n")]=$row[$nP->getAttribute("n")];
|
||||
}
|
||||
$nP = $nP->nextSibling;
|
||||
}
|
||||
$nParent=$nChild;
|
||||
|
||||
$pos++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
//получить путь по id дерева и по id записи в виде строки (поднимается вверх по дереву)
|
||||
// $tid - id дерева
|
||||
// $fid - id записи
|
||||
// $nParent - родительский XML узел
|
||||
// $db - Открытая база данных
|
||||
function getPathOnId($tid,$fid,$nParent,$db)
|
||||
{
|
||||
if($nParent==null || $db==null) return '';
|
||||
$str='';
|
||||
|
||||
$nChild=findFirstNodeOnAttribute($nParent, 'type', 'id', $tid);
|
||||
if($nChild==null) return '';
|
||||
//Пробуем найти родительский id по переданому
|
||||
$nFs=findNode($nChild, 'filter');
|
||||
$sql=findNode($nChild,'sql-query');
|
||||
if($sql==null) return '';
|
||||
$sql=getCdata($sql)->nodeValue;
|
||||
if($nFs!=null)
|
||||
{ $nF=$nFs->firstChild;
|
||||
while($nF != null)
|
||||
{
|
||||
if($nF->nodeName=='column')
|
||||
{
|
||||
if($nF->getAttribute('n')==$nChild->getAttribute('ObjectID'))
|
||||
getCdata($nF)->nodeValue=$fid;
|
||||
else getCdata($nF)->nodeValue=''; //Очищаем фильтр
|
||||
|
||||
$sql=str_replace('${'.$nF->getAttribute("n").'}',getSQLValue($nF->getAttribute("vt"),getCdata($nF)->nodeValue),$sql);
|
||||
}
|
||||
$nF=$nF->nextSibling;
|
||||
}
|
||||
}
|
||||
|
||||
$res = $db->query($sql);
|
||||
if($res->rowCount()>1) return ''; //В результ сете может быть только 1 запись так как фильтруем по id
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
|
||||
{
|
||||
$fid=$row[$nChild->getAttribute('ParentID')];
|
||||
|
||||
//Мы не знаем id шник какого родителя ведь есть goto! (Для них должно выполняться условие их родитель всегда должен быть не пустым те. быть не на первом уровне вложенности)
|
||||
$nGoto=findFirstNodeOnAttribute($nParent, 'goto', 'id', $tid);
|
||||
if($nGoto!=null) $nGoto=$nGoto->parentNode;
|
||||
if($nGoto!=null && $nGoto->nodeName=='type')
|
||||
{
|
||||
$sTmp=getPathOnId($nGoto->getAttribute('id'),$fid,$nParent,$db);
|
||||
if($sTmp!='') //Не тупик ли
|
||||
{
|
||||
$str=$nChild->getAttribute('id').';'.$fid.';'.$str;
|
||||
$str=$sTmp.$str;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//Для случаяв если по goto не удалось пройтись
|
||||
$nChild=$nChild->parentNode;
|
||||
if($nChild!=null && $nChild->nodeName=='type' && $nChild->getAttribute('id')!='-1')
|
||||
{
|
||||
$str=$fid.';'.$str;
|
||||
$str=$nChild->getAttribute('id').';'.$str;
|
||||
$str=getPathOnId($nChild->getAttribute('id'),$fid,$nParent,$db).$str;
|
||||
}
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
//Получить XML дерево в виде строки (рекурсией в массив с заданным уровнем вложенности)
|
||||
// $nParent - родительский XML узел
|
||||
// $nParams - Первоначальные параметры фильтра (и для рекурсии)
|
||||
// $db - соединение с базой данных
|
||||
// $first - как вызванно через рекурсию или нет
|
||||
// $path - путь к нужному узлу в виде "id node tree;id data;id node tree;id data;..."
|
||||
function getTreeArray($nParent,$nParams,$db,$first,$path)
|
||||
{
|
||||
if($nParent==null || $db==null) return null;
|
||||
$result='';
|
||||
if($first) $result.='<?xml version="1.0" encoding="utf-8"?><metadata fn="2" htmlid="0">'."\n";
|
||||
|
||||
//Если параметры переданны как объект то парсим их в DOM дерево
|
||||
if(gettype($nParams)=='string')
|
||||
{
|
||||
$doc = new DOMDocument();
|
||||
try
|
||||
{ $doc->loadXML('<metadata>'.$nParams.'</metadata>');
|
||||
} catch (Exception $e)
|
||||
{ $nParams=null;
|
||||
}
|
||||
$nParams = $doc->documentElement;
|
||||
}
|
||||
|
||||
$mpath = explode(';', $path); //Путь к заветному узлу в виде массива
|
||||
|
||||
//перебераем все дочерние элементы и для каждого выполняем запрос c фильтрацией
|
||||
$currNode = $nParent->firstChild; //из tree.xml
|
||||
while ($currNode != null)
|
||||
{
|
||||
$tmpNode=$currNode; //если узел goto
|
||||
|
||||
if($tmpNode->nodeName=="goto") //если встретилась "зацикливалка"
|
||||
{
|
||||
$treeid=$tmpNode->getAttribute("id");
|
||||
$tmpNode=findFirstNodeOnAttribute($tmpNode->ownerDocument->documentElement,"type","id",$treeid);
|
||||
if($tmpNode==null) { $currNode = $currNode->nextSibling; continue; }
|
||||
}
|
||||
|
||||
if($tmpNode->nodeName=="type" && $tmpNode->getAttribute("hide") != '1')
|
||||
{
|
||||
$treeid=$tmpNode->getAttribute("id"); //Идентификатор XML узла
|
||||
//Пропускаем узлы которые не в заданном пути
|
||||
if(!(count($mpath)>=3 && $mpath[0]!=$treeid))
|
||||
{
|
||||
$caption=$tmpNode->getAttribute("c"); //Название поля для заголовка
|
||||
|
||||
//$sql=getSQL($nParent,$tmpNode);
|
||||
$sql=getSQL($nParams,$tmpNode);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
$res=null;
|
||||
try
|
||||
{ $res=$db->query($sql);
|
||||
} catch (Exception $e)
|
||||
{ return null;
|
||||
}
|
||||
|
||||
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))
|
||||
{
|
||||
if(array_key_exists('id', $row)) $fid=$row['id']; else $fid=''; //id записи
|
||||
if(count($mpath)>=3 && $mpath[1]!=$fid) continue; //Пропускаем записи которые не в пути
|
||||
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 - название поля с уникальным идентификатором записи
|
||||
|
||||
|
||||
|
||||
//сохраняем параметры фильтра для дочерних элементов с текщим состоянием
|
||||
//перебираем фильтры которые должны быть заполненны для каждого узла даные для фильтра беруться из результ сета
|
||||
$rСol='<columns>'."\n";
|
||||
//считываем название поля и находим данные в результсете
|
||||
$nColumn = findFirstNode($tmpNode, 'columns'); //tree.xml
|
||||
if($nColumn!=null) $nColumn=$nColumn->firstChild;
|
||||
while ($nColumn != null)
|
||||
{
|
||||
if($nColumn->nodeName=="param")
|
||||
{
|
||||
$fname=$nColumn->getAttribute("n");
|
||||
|
||||
if(array_key_exists($fname, $row)) //Если поле есть в результсете
|
||||
{ //getCdata($nColumn)->nodeValue=$row[$fname]; //Заполняем парамерт значением для рекурсии при следующей итерации затрётся
|
||||
$fval=$row[$fname];
|
||||
}else $fval=getCdataValue($nColumn);
|
||||
|
||||
$rСol.='<param n="'.$fname.'"><![CDATA['.$fval.']]></param>'."\n";
|
||||
}
|
||||
$nColumn = $nColumn->nextSibling;
|
||||
}
|
||||
$rСol.='</columns>'."\n";
|
||||
|
||||
$path='';
|
||||
for($i=1;$i<(count($mpath)-1)/2;$i++) $path.=$mpath[i].';'.$mpath[i].';'; //Оставшийся путь минус текущий
|
||||
// !!! Рекурсия !!!
|
||||
|
||||
$rSub=getTreeArray($tmpNode,$rСol,$db,false,$path);
|
||||
|
||||
$result.='<tree c="'.($rSub == '' ? '0' : '1').'" fid="'.$fid.'" iid="'.$iid.'" treeid="'.$treeid.'" t="'.$tmpNode->getAttribute("n").'" ObjectID="'.$tmpNode->getAttribute("ObjectID").'"'.$visible.'>'."\n";
|
||||
$result.='<![CDATA['.$val.']]>'."\n";
|
||||
$result.=$rСol;
|
||||
$result.=$rSub;
|
||||
$result.='</tree>'."\n";
|
||||
|
||||
$rSub='';
|
||||
}
|
||||
$res->closeCursor();
|
||||
}
|
||||
}
|
||||
$currNode = $currNode->nextSibling;
|
||||
}
|
||||
|
||||
if($first) $result.='</metadata>';
|
||||
return $result; //XML строка
|
||||
}
|
||||
|
||||
//Похожее на верхнее только получаем XML карту сайта
|
||||
// $nParent - родительский XML узел
|
||||
// $nParams - Первоначальные параметры фильтра (и для рекурсии)
|
||||
// $db - соединение с базой данных
|
||||
// $first - как вызванно через рекурсию или нет
|
||||
function getSiteMap($nParent,$nParams,$db,$first,$path)
|
||||
{
|
||||
if($nParent==null || $db==null) return null;
|
||||
$result='';
|
||||
if($first) $result.='<?xml version="1.0" encoding="utf-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
|
||||
|
||||
//Если параметры переданны как объект то парсим их в DOM дерево
|
||||
if(gettype($nParams)=='string')
|
||||
{
|
||||
$doc = new DOMDocument();
|
||||
try
|
||||
{ $doc->loadXML('<metadata>'.$nParams.'</metadata>');
|
||||
} catch (Exception $e)
|
||||
{ $nParams=null;
|
||||
}
|
||||
$nParams = $doc->documentElement;
|
||||
}
|
||||
|
||||
//перебераем все дочерние элементы и для каждого выполняем запрос c фильтрацией
|
||||
$currNode = $nParent->firstChild; //из tree.xml
|
||||
while ($currNode != null)
|
||||
{
|
||||
$tmpNode=$currNode; //если узел goto
|
||||
|
||||
if($tmpNode->nodeName=="goto") //если встретилась "зацикливалка"
|
||||
{
|
||||
$treeid=$tmpNode->getAttribute("id");
|
||||
$tmpNode=findFirstNodeOnAttribute($tmpNode->ownerDocument->documentElement,"type","id",$treeid);
|
||||
if($tmpNode==null) { $currNode = $currNode->nextSibling; continue; }
|
||||
}
|
||||
|
||||
if($tmpNode->nodeName=="type")
|
||||
{
|
||||
$treeid=$tmpNode->getAttribute("id"); //Идентификатор XML узла
|
||||
|
||||
$sql=getSQL($nParams,$tmpNode);
|
||||
|
||||
if(isset($_SESSION['USER_ID']))
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
$res=null;
|
||||
try
|
||||
{ $res=$db->query($sql);
|
||||
} catch (Exception $e)
|
||||
{ return null;
|
||||
}
|
||||
|
||||
while ($row = $res->fetch(PDO::FETCH_ASSOC))
|
||||
{
|
||||
if(array_key_exists('id', $row)) { $fid=$row['id']; } else { $fid=''; } //id записи
|
||||
if(array_key_exists('seq', $row)) { $date=date('Y-m-d',946620000+$row['seq']); } else { $date=date('Y-m-d'); } //Дата модификации страницы
|
||||
if(array_key_exists('url', $row)) { $url=$row['url']; } else { $url=''; } //id записи
|
||||
|
||||
//сохраняем параметры фильтра для дочерних элементов с текщим состоянием
|
||||
//перебираем фильтры которые должны быть заполненны для каждого узла даные для фильтра беруться из результ сета
|
||||
$rСol='<columns>'."\n";
|
||||
//считываем название поля и находим данные в результсете
|
||||
$nColumn = findFirstNode($tmpNode, 'columns'); //tree.xml
|
||||
if($nColumn!=null) $nColumn=$nColumn->firstChild;
|
||||
while ($nColumn != null)
|
||||
{
|
||||
if($nColumn->nodeName=="param")
|
||||
{
|
||||
$fname=$nColumn->getAttribute("n");
|
||||
|
||||
if(array_key_exists($fname, $row)) //Если поле есть в результсете
|
||||
{ //getCdata($nColumn)->nodeValue=$row[$fname]; //Заполняем парамерт значением для рекурсии при следующей итерации затрётся
|
||||
$fval=$row[$fname];
|
||||
}else
|
||||
{ $fval=getCdataValue($nColumn);
|
||||
}
|
||||
|
||||
$rСol.='<param n="'.$fname.'"><![CDATA['.$fval.']]></param>'."\n";
|
||||
}
|
||||
$nColumn = $nColumn->nextSibling;
|
||||
}
|
||||
$rСol.='</columns>'."\n";
|
||||
|
||||
if($url=='')
|
||||
{ $url=getHashFromPath($path.$treeid.';'.$fid.';');
|
||||
}
|
||||
$result.=' <url>'."\n";
|
||||
$result.=' <loc>http://'.$_SERVER["SERVER_NAME"].'/shop/'.$url.'.html</loc>'."\n";
|
||||
$result.=' <lastmod>'.$date.'</lastmod>'."\n";
|
||||
$result.=' <changefreq>daily</changefreq>'."\n";
|
||||
$result.=' </url>'."\n";
|
||||
|
||||
// !!! Рекурсия !!!
|
||||
$result.=getSiteMap($tmpNode,$rСol,$db,false,$path.$treeid.';'.$fid.';');
|
||||
}
|
||||
$res->closeCursor();
|
||||
|
||||
}
|
||||
$currNode = $currNode->nextSibling;
|
||||
}
|
||||
|
||||
if($first) $result.='</urlset>';
|
||||
return $result; //XML строка
|
||||
}
|
||||
|
||||
39
metadata/tree/tree.css
Normal file
@ -0,0 +1,39 @@
|
||||
.tmmenu
|
||||
{
|
||||
cursor: pointer;
|
||||
background-color: #dddddd;
|
||||
border: solid 1px #cdcdcd;
|
||||
padding: 3px;
|
||||
color: #0000f4;
|
||||
}
|
||||
|
||||
.tmmenu a:link
|
||||
{ color: #000000;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tmmenu a:visited
|
||||
{
|
||||
color: #545454;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tmenu
|
||||
{
|
||||
position: absolute;
|
||||
/*position: relative;*/
|
||||
z-index: 9999;
|
||||
/*border-color: red;*/
|
||||
background-color: rgba(255,255,255,0.9);
|
||||
border: 1px solid #dddddd;
|
||||
/*color: white;*/
|
||||
display: none;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
.tmenu a:link
|
||||
{ color: #000000;
|
||||
}
|
||||
1058
metadata/tree/tree.js
Normal file
266
metadata/tree/tree.php
Normal file
@ -0,0 +1,266 @@
|
||||
<?
|
||||
/*
|
||||
$pos=strripos ( $_SERVER['SERVER_NAME'] , '.' , 0 ) - strlen($_SERVER['SERVER_NAME']) - 1;
|
||||
$pos=strripos ( $_SERVER['SERVER_NAME'] , '.' , $pos );
|
||||
ini_set('session.cookie_domain', $pos ? substr($_SERVER['SERVER_NAME'],$pos) : '.'.$_SERVER['SERVER_NAME']);
|
||||
*/
|
||||
if(isset($_GET[session_name()]) && $_GET[session_name()]!='') //Чтоб ID сессии переданная гетом был главней а не создавался заново
|
||||
session_id($_GET[session_name()]);
|
||||
@session_start();
|
||||
if(isset($_SESSION['REMOTE_ADDR']) && $_SESSION['REMOTE_ADDR'] != $_SERVER['REMOTE_ADDR']) unset($_SESSION["USER_ID"]); //Делаемся не авторизованным если зашли с другого ip адреса
|
||||
|
||||
//sleep(1); //Тестирование с задержкой
|
||||
|
||||
//require_once("../../config.php"); Должно быть обьявлено во внешнем файле
|
||||
require_once("tools.php");
|
||||
|
||||
/**
|
||||
* Отправить клиенту информацию о ошибке
|
||||
* @param type $e - Наименование ошибки
|
||||
* @param type $winid - Идентификатор окна
|
||||
*/
|
||||
function sendError($e)
|
||||
{
|
||||
header('Content-type: text/xml');
|
||||
header("Cache-Control: no-cache, must-revalidate");
|
||||
echo '<?xml version="1.0" encoding="utf-8"?><metadata fn="0"><![CDATA['.$e.']]></metadata>';
|
||||
Exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Взять данные из базы данных в результсет
|
||||
* @param unknown_type $treeNode - DOM узел переданной клиентом
|
||||
* @param unknown_type $currNode - DOM узел из файла tree.xml параметрам фильтра которого будут присвоенны значения из treeNode (недостающие фильтры возтмуться из nodeMetadata)
|
||||
* @return PDOStatement|NULL Результ-сет
|
||||
*/
|
||||
function fnGetData($treeNode,$currNode)
|
||||
{
|
||||
$sql=getSQL($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_connstr, $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 '<html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body>';
|
||||
echo "Начинаем строить дерево<br><br>";
|
||||
$xmlstr=getTreeArray(findNode($mainNode,'type'),null,$db,true,$path);
|
||||
if($handle = fopen($name, 'w'))
|
||||
{
|
||||
echo strtolower(afterLast($name,'.')).'<br>';
|
||||
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 "<br>Построили<br>";
|
||||
echo '</body></html>';
|
||||
|
||||
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='<?xml version="1.0" encoding="utf-8"?>';
|
||||
$xmlnode.='<tree c="1" fid="'.$fid.'" iid="'.$iid.'" treeid="'.$treeid.'" t="'.$tmpNode->getAttribute("n").'" ObjectID="'.$tmpNode->getAttribute("ObjectID").'"'.$visible.'>';
|
||||
$xmlnode.='<![CDATA['.$val.']]>';
|
||||
//сохраняем параметры фильтра для дочерних элементов с текщем состоянием
|
||||
//перебираем фильтры которые должны быть заполненны для каждого узла даные для фильтра беруться из результ сета
|
||||
$xmlnode.='<columns>';
|
||||
|
||||
//считываем название поля и находим данные в результсете
|
||||
$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.='<param n="'.$fname.'"><![CDATA['.$fval.']]></param>';
|
||||
}
|
||||
$nodeParam = $nodeParam->nextSibling;
|
||||
}
|
||||
|
||||
$xmlnode.='</columns>';
|
||||
$xmlnode.='</tree>';
|
||||
|
||||
//парсим созданную ветку дерева в 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='<?xml version="1.0" encoding="utf-8"?><metadata fn="1" htmlid="'.$htmlid.'">'.$xmlstring.'</metadata>';
|
||||
header('Content-type: text/xml');
|
||||
echo $xmlstring;
|
||||
exit();
|
||||
}
|
||||
105
metadata/tree/tree.xml
Normal file
@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<metadata name="Обьекты базы даных">
|
||||
<type id="-1">
|
||||
<columns><!--Список параметров которые будут взяты из текущего результсета и переданных нижнему уровню-->
|
||||
</columns>
|
||||
<type n="Cities" d="Города" c="caption" ObjectID="id" id="0">
|
||||
<sql-query><![CDATA[select id,caption,icon_id,lon,lat from "Cities" where del='f' and name!='' order by caption]]></sql-query>
|
||||
<columns>
|
||||
<param n="id"><![CDATA[]]></param>
|
||||
</columns>
|
||||
<type n="BusinessTypes" d="" c="name" ObjectID="id" id="1">
|
||||
<sql-query>
|
||||
<![CDATA[
|
||||
select
|
||||
bt.id,
|
||||
${id} as city_id,
|
||||
bt.name,
|
||||
bt.icon_id
|
||||
from
|
||||
"BusinessTypes" bt
|
||||
where
|
||||
bt.del='f'
|
||||
and id in(select bt_id from "BusinessSubTypes" where id in (select bst_id from "Business" where del='f' and city_id=${id}))
|
||||
order by bt.name
|
||||
]]></sql-query>
|
||||
<columns>
|
||||
<param n="id"><![CDATA[]]></param>
|
||||
<param n="city_id"><![CDATA[]]></param>
|
||||
</columns>
|
||||
<type n="BusinessSubTypes" d="" c="name" ObjectID="id" id="2">
|
||||
<sql-query>
|
||||
<![CDATA[
|
||||
select
|
||||
bst.id,
|
||||
${city_id} as city_id,
|
||||
bst.name,
|
||||
bst.icon_id
|
||||
from
|
||||
"BusinessSubTypes" bst
|
||||
where
|
||||
bst.del='f'
|
||||
and bst.bt_id=${id}
|
||||
and bst.id in (select b.bst_id from "Business" b where b.del='f' and b.city_id=${city_id})
|
||||
order by bst.name
|
||||
]]>
|
||||
</sql-query>
|
||||
<columns>
|
||||
<param n="id"><![CDATA[]]></param>
|
||||
<param n="city_id"><![CDATA[]]></param>
|
||||
</columns>
|
||||
<type n="Business" d="Список рубрик" c="name" ObjectID="id" id="3">
|
||||
<sql-query>
|
||||
<![CDATA[
|
||||
select
|
||||
b.id,
|
||||
b.name,
|
||||
b.icon_id,
|
||||
b.city_id,
|
||||
b.lon,
|
||||
b.lat
|
||||
from
|
||||
"Business" b
|
||||
where
|
||||
b.del='f'
|
||||
and b.city_id=${city_id}
|
||||
and business_id is null
|
||||
and bst_id=${id}
|
||||
order by b.name
|
||||
]]>
|
||||
</sql-query>
|
||||
<columns>
|
||||
<param n="id"><![CDATA[]]></param>
|
||||
<param n="city_id"><![CDATA[]]></param>
|
||||
</columns>
|
||||
<type n="Business" d="Список рубрик" c="name" ObjectID="id" id="4">
|
||||
<sql-query>
|
||||
<![CDATA[
|
||||
select
|
||||
b.id,
|
||||
b.name,
|
||||
b.icon_id,
|
||||
b.city_id,
|
||||
b.lon,
|
||||
b.lat
|
||||
from
|
||||
"Business" b
|
||||
where
|
||||
b.del='f'
|
||||
and b.city_id=${city_id}
|
||||
and business_id=${id}
|
||||
order by b.name
|
||||
]]>
|
||||
</sql-query>
|
||||
<columns>
|
||||
<param n="id"><![CDATA[]]></param>
|
||||
<param n="city_id"><![CDATA[]]></param>
|
||||
</columns>
|
||||
<goto id="4"/>
|
||||
</type>
|
||||
</type>
|
||||
</type>
|
||||
</type>
|
||||
</type>
|
||||
</type>
|
||||
</metadata>
|
||||
6
metadata/tree/tree_b.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
require_once("../../config.php");
|
||||
require_once("../include/xmltools.php");
|
||||
$treexml='tree.xml';
|
||||
require_once("tree.php");
|
||||
?>
|
||||