Your IP : 3.135.194.165
<?
IncludeModuleLangFile(__FILE__);
$GLOBALS["LEARNING_SITE_PATH"] = Array();
// 2012-04-16 Checked/modified for compatibility with new data model
class CAllSitePath
{
/*************** ADD, UPDATE, DELETE *****************/
// 2012-04-16 Checked/modified for compatibility with new data model
function CheckFields($ACTION, &$arFields, $ID = 0)
{
/*
if ((is_set($arFields, "TYPE") || $ACTION=="ADD") && strlen($arFields["TYPE"]) <= 0)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("LRN_GSP_EMPTY_TYPE"), "EMPTY_TYPE");
return false;
}
*/
if ((is_set($arFields, "PATH") || $ACTION=="ADD") && strlen($arFields["PATH"]) <= 0)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("LRN_GSP_EMPTY_PATH"), "EMPTY_PATH");
return false;
}
elseif (is_set($arFields, "PATH"))
{
$arFields["PATH"] = trim(str_replace("\\", "/", $arFields["PATH"]));
}
if ((is_set($arFields, "SITE_ID") || $ACTION=="ADD") && strlen($arFields["SITE_ID"]) <= 0)
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("LRN_GSP_EMPTY_SITE_ID"), "EMPTY_SITE_ID");
return false;
}
elseif (is_set($arFields, "SITE_ID"))
{
$dbResult = CSite::GetByID($arFields["SITE_ID"]);
if (!$dbResult->Fetch())
{
$GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arFields["SITE_ID"], GetMessage("LRN_GSP_ERROR_NO_SITE")), "ERROR_NO_SITE");
return false;
}
}
return True;
}
// 2012-04-16 Checked/modified for compatibility with new data model
function Delete($ID)
{
global $DB;
$ID = IntVal($ID);
$arPath = CSitePath::GetByID($ID);
if ($arPath)
unset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$arPath["SITE_ID"]]);
unset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID]);
return $DB->Query("DELETE FROM b_learn_site_path WHERE ID = ".$ID."", true);
}
//*************** SELECT *********************/
// 2012-04-16 Checked/modified for compatibility with new data model
function GetByID($ID)
{
global $DB;
$ID = IntVal($ID);
if (isset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID]) && is_array($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID]) && is_set($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID], "ID"))
{
return $GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID];
}
else
{
$strSql =
"SELECT P.ID, P.SITE_ID, P.PATH, P.TYPE ".
"FROM b_learn_site_path P ".
"WHERE P.ID = ".$ID."";
$dbResult = $DB->Query($strSql, False, "File: ".__FILE__."<br>Line: ".__LINE__);
if ($arResult = $dbResult->Fetch())
{
$GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$ID] = $arResult;
$GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$arResult["SITE_ID"]] = $arResult;
return $arResult;
}
}
return False;
}
// 2012-04-16 Checked/modified for compatibility with new data model
function GetBySiteID($siteID)
{
global $DB;
$siteID = Trim($siteID);
if (strlen($siteID) <= 0)
return False;
if (isset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$siteID]) && is_array($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$siteID]) && is_set($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$siteID], "ID"))
{
return $GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$siteID];
}
else
{
$strSql =
"SELECT P.ID, P.SITE_ID, P.PATH, P.TYPE ".
"FROM b_learn_site_path P ".
"WHERE P.SITE_ID = '".$DB->ForSql($siteID)."' AND P.TYPE is null";
$dbResult = $DB->Query($strSql, False, "File: ".__FILE__."<br>Line: ".__LINE__);
$arResults = array();
while($arResult = $dbResult->Fetch())
{
$GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$siteID] = $arResult;
$GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$arResult["ID"]] = $arResult;
$arResults[] = $arResult;
}
return $arResults;
}
return False;
}
// 2012-04-16 Checked/modified for compatibility with new data model
function DeleteBySiteID($siteID)
{
global $DB;
$siteID = Trim($siteID);
if (strlen($siteID) <= 0)
return False;
$result = false;
$dbPath = CSitePath::GetList(Array(), Array("SITE_ID" => $siteID));
while($arPath = $dbPath -> Fetch())
{
unset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH1_CACHE_".$arPath["SITE_ID"]]);
unset($GLOBALS["LEARNING_SITE_PATH"]["LEARNING_SITE_PATH_CACHE_".$arPath["ID"]]);
$result = $DB->Query("DELETE FROM b_learn_site_path WHERE ID = ".$arPath["ID"]."", true);
}
return $result;
}
// 2012-04-16 Checked/modified for compatibility with new data model
function GetFilterOperation($key)
{
$strNegative = "N";
if (substr($key, 0, 1)=="!")
{
$key = substr($key, 1);
$strNegative = "Y";
}
$strOrNull = "N";
if (substr($key, 0, 1)=="+")
{
$key = substr($key, 1);
$strOrNull = "Y";
}
if (substr($key, 0, 2)==">=")
{
$key = substr($key, 2);
$strOperation = ">=";
}
elseif (substr($key, 0, 1)==">")
{
$key = substr($key, 1);
$strOperation = ">";
}
elseif (substr($key, 0, 2)=="<=")
{
$key = substr($key, 2);
$strOperation = "<=";
}
elseif (substr($key, 0, 1)=="<")
{
$key = substr($key, 1);
$strOperation = "<";
}
elseif (substr($key, 0, 1)=="@")
{
$key = substr($key, 1);
$strOperation = "IN";
}
elseif (substr($key, 0, 1)=="~")
{
$key = substr($key, 1);
$strOperation = "LIKE";
}
elseif (substr($key, 0, 1)=="%")
{
$key = substr($key, 1);
$strOperation = "QUERY";
}
else
{
$strOperation = "=";
}
return array("FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull);
}
// 2012-04-16 Checked/modified for compatibility with new data model
function PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $obUserFieldsSql = false)
{
global $DB;
$strSqlSelect = "";
$strSqlFrom = "";
$strSqlWhere = "";
$strSqlGroupBy = "";
$strSqlOrderBy = "";
$arGroupByFunct = array("COUNT", "AVG", "MIN", "MAX", "SUM");
$arAlreadyJoined = array();
// GROUP BY -->
if (is_array($arGroupBy) && count($arGroupBy)>0)
{
$arSelectFields = $arGroupBy;
foreach ($arGroupBy as $key => $val)
{
$val = strtoupper($val);
$key = strtoupper($key);
if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct))
{
if (strlen($strSqlGroupBy) > 0)
$strSqlGroupBy .= ", ";
$strSqlGroupBy .= $arFields[$val]["FIELD"];
if (isset($arFields[$val]["FROM"])
&& strlen($arFields[$val]["FROM"]) > 0
&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$val]["FROM"];
$arAlreadyJoined[] = $arFields[$val]["FROM"];
}
}
}
}
// <-- GROUP BY
// SELECT -->
$arFieldsKeys = array_keys($arFields);
if (is_array($arGroupBy) && count($arGroupBy)==0)
{
$strSqlSelect = "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT ";
}
else
{
if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && strlen($arSelectFields)>0 && array_key_exists($arSelectFields, $arFields))
$arSelectFields = array($arSelectFields);
if (!isset($arSelectFields)
|| !is_array($arSelectFields)
|| count($arSelectFields)<=0
|| in_array("*", $arSelectFields))
{
foreach ($arFieldsKeys as $i => $value)
{
if (isset($arFields[$arFieldsKeys[$i]]["WHERE_ONLY"])
&& $arFields[$arFieldsKeys[$i]]["WHERE_ONLY"] == "Y")
{
continue;
}
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
if ($arFields[$arFieldsKeys[$i]]["TYPE"] == "datetime")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($arFieldsKeys[$i], $arOrder)))
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "FULL")." as ".$arFieldsKeys[$i];
}
elseif ($arFields[$arFieldsKeys[$i]]["TYPE"] == "date")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($arFieldsKeys[$i], $arOrder)))
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "SHORT")." as ".$arFieldsKeys[$i];
}
else
$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i];
if (isset($arFields[$arFieldsKeys[$i]]["FROM"])
&& strlen($arFields[$arFieldsKeys[$i]]["FROM"]) > 0
&& !in_array($arFields[$arFieldsKeys[$i]]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$arFieldsKeys[$i]]["FROM"];
$arAlreadyJoined[] = $arFields[$arFieldsKeys[$i]]["FROM"];
}
}
}
else
{
foreach ($arSelectFields as $key => $val)
{
$val = strtoupper($val);
$key = strtoupper($key);
if (array_key_exists($val, $arFields))
{
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
if (in_array($key, $arGroupByFunct))
{
$strSqlSelect .= $key."(".$arFields[$val]["FIELD"].") as ".$val;
}
else
{
if ($arFields[$val]["TYPE"] == "datetime")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($val, $arOrder)))
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "FULL")." as ".$val;
}
elseif ($arFields[$val]["TYPE"] == "date")
{
if ((strtoupper($DB->type)=="ORACLE" || strtoupper($DB->type)=="MSSQL") && (array_key_exists($val, $arOrder)))
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";
$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "SHORT")." as ".$val;
}
else
$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val;
}
if (isset($arFields[$val]["FROM"])
&& strlen($arFields[$val]["FROM"]) > 0
&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$val]["FROM"];
$arAlreadyJoined[] = $arFields[$val]["FROM"];
}
}
}
}
if (strlen($strSqlGroupBy) > 0)
{
if (strlen($strSqlSelect) > 0)
$strSqlSelect .= ", ";
$strSqlSelect .= "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT";
}
else
$strSqlSelect = "%%_DISTINCT_%% ".$strSqlSelect;
}
// <-- SELECT
// WHERE -->
$arSqlSearch = Array();
if (!is_array($arFilter))
$filter_keys = Array();
else
$filter_keys = array_keys($arFilter);
for ($i = 0; $i < count($filter_keys); $i++)
{
$vals = $arFilter[$filter_keys[$i]];
if (!is_array($vals))
$vals = array($vals);
$key = $filter_keys[$i];
$key_res = CSitePath::GetFilterOperation($key);
$key = $key_res["FIELD"];
$strNegative = $key_res["NEGATIVE"];
$strOperation = $key_res["OPERATION"];
$strOrNull = $key_res["OR_NULL"];
if (array_key_exists($key, $arFields))
{
$arSqlSearch_tmp = array();
for ($j = 0; $j < count($vals); $j++)
{
$val = $vals[$j];
if (isset($arFields[$key]["WHERE"]))
{
$arSqlSearch_tmp1 = call_user_func_array(
$arFields[$key]["WHERE"],
array($val, $key, $strOperation, $strNegative, $arFields[$key]["FIELD"], $arFields, $arFilter)
);
if ($arSqlSearch_tmp1 !== false)
$arSqlSearch_tmp[] = $arSqlSearch_tmp1;
}
else
{
if ($arFields[$key]["TYPE"] == "int")
{
if ((IntVal($val) == 0) && (strpos($strOperation, "=") !== False))
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND" : "OR")." ".(($strNegative == "Y") ? "NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".IntVal($val)." )";
}
elseif ($arFields[$key]["TYPE"] == "double")
{
$val = str_replace(",", ".", $val);
if ((DoubleVal($val) == 0) && (strpos($strOperation, "=") !== False))
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND" : "OR")." ".(($strNegative == "Y") ? "NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." 0)";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".DoubleVal($val)." )";
}
elseif ($arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
{
if ($strOperation == "QUERY")
{
$arSqlSearch_tmp[] = GetFilterQuery($arFields[$key]["FIELD"], $val, "Y");
}
else
{
if ((strlen($val) == 0) && (strpos($strOperation, "=") !== False))
$arSqlSearch_tmp[] = "(".$arFields[$key]["FIELD"]." IS ".(($strNegative == "Y") ? "NOT " : "")."NULL) ".(($strNegative == "Y") ? "AND NOT" : "OR")." (".$DB->Length($arFields[$key]["FIELD"])." <= 0) ".(($strNegative == "Y") ? "AND NOT" : "OR")." (".$arFields[$key]["FIELD"]." ".$strOperation." '".$DB->ForSql($val)."' )";
else
$arSqlSearch_tmp[] = (($strNegative == "Y") ? " ".$arFields[$key]["FIELD"]." IS NULL OR NOT " : "")."(".$arFields[$key]["FIELD"]." ".$strOperation." '".$DB->ForSql($val)."' )";
}
}
elseif ($arFields[$key]["TYPE"] == "datetime")
{
if (strlen($val) <= 0)
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
}
elseif ($arFields[$key]["TYPE"] == "date")
{
if (strlen($val) <= 0)
$arSqlSearch_tmp[] = ($strNegative=="Y"?"NOT":"")."(".$arFields[$key]["FIELD"]." IS NULL)";
else
$arSqlSearch_tmp[] = ($strNegative=="Y"?" ".$arFields[$key]["FIELD"]." IS NULL OR NOT ":"")."(".$arFields[$key]["FIELD"]." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "SHORT").")";
}
}
}
if (isset($arFields[$key]["FROM"])
&& strlen($arFields[$key]["FROM"]) > 0
&& !in_array($arFields[$key]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$key]["FROM"];
$arAlreadyJoined[] = $arFields[$key]["FROM"];
}
$strSqlSearch_tmp = "";
for ($j = 0; $j < count($arSqlSearch_tmp); $j++)
{
if ($j > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= "(".$arSqlSearch_tmp[$j].")";
}
if ($strOrNull == "Y")
{
if (strlen($strSqlSearch_tmp) > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." IS ".($strNegative=="Y" ? "NOT " : "")."NULL)";
if (strlen($strSqlSearch_tmp) > 0)
$strSqlSearch_tmp .= ($strNegative=="Y" ? " AND " : " OR ");
if ($arFields[$key]["TYPE"] == "int" || $arFields[$key]["TYPE"] == "double")
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" ? "<>" : "=")." 0)";
elseif ($arFields[$key]["TYPE"] == "string" || $arFields[$key]["TYPE"] == "char")
$strSqlSearch_tmp .= "(".$arFields[$key]["FIELD"]." ".($strNegative=="Y" ? "<>" : "=")." '')";
}
if ($strSqlSearch_tmp != "")
$arSqlSearch[] = "(".$strSqlSearch_tmp.")";
}
}
for ($i = 0; $i < count($arSqlSearch); $i++)
{
if (strlen($strSqlWhere) > 0)
$strSqlWhere .= " AND ";
$strSqlWhere .= "(".$arSqlSearch[$i].")";
}
// <-- WHERE
// ORDER BY -->
$arSqlOrder = Array();
foreach ($arOrder as $by => $order)
{
$by = strtoupper($by);
$order = strtoupper($order);
if ($order != "ASC")
$order = "DESC";
else
$order = "ASC";
if (array_key_exists($by, $arFields))
{
$arSqlOrder[] = " ".$arFields[$by]["FIELD"]." ".$order." ";
if (isset($arFields[$by]["FROM"])
&& strlen($arFields[$by]["FROM"]) > 0
&& !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
{
if (strlen($strSqlFrom) > 0)
$strSqlFrom .= " ";
$strSqlFrom .= $arFields[$by]["FROM"];
$arAlreadyJoined[] = $arFields[$by]["FROM"];
}
}
elseif($obUserFieldsSql)
{
$arSqlOrder[] = " ".$obUserFieldsSql->GetOrder($by)." ".$order." ";
}
}
$strSqlOrderBy = "";
DelDuplicateSort($arSqlOrder);
for ($i=0; $i<count($arSqlOrder); $i++)
{
if (strlen($strSqlOrderBy) > 0)
$strSqlOrderBy .= ", ";
if(strtoupper($DB->type)=="ORACLE")
{
if(substr($arSqlOrder[$i], -3)=="ASC")
$strSqlOrderBy .= $arSqlOrder[$i]." NULLS FIRST";
else
$strSqlOrderBy .= $arSqlOrder[$i]." NULLS LAST";
}
else
$strSqlOrderBy .= $arSqlOrder[$i];
}
// <-- ORDER BY
return array(
"SELECT" => $strSqlSelect,
"FROM" => $strSqlFrom,
"WHERE" => $strSqlWhere,
"GROUPBY" => $strSqlGroupBy,
"ORDERBY" => $strSqlOrderBy
);
}
}