/*
$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 '';
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 '
';
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();
}