%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/iblock/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/iblock/classes/general/iblockproperty.php |
<?
use Bitrix\Iblock;
global $IBLOCK_CACHE_PROPERTY;
$IBLOCK_CACHE_PROPERTY = Array();
IncludeModuleLangFile(__FILE__);
class CAllIBlockProperty
{
public $LAST_ERROR = "";
public static function GetList($arOrder=Array(), $arFilter=Array())
{
global $DB;
$strSql = "
SELECT BP.*
FROM b_iblock_property BP
";
$bJoinIBlock = false;
$arSqlSearch = array();
foreach($arFilter as $key => $val)
{
$val = $DB->ForSql($val);
$key = strtoupper($key);
switch($key)
{
case "ACTIVE":
case "SEARCHABLE":
case "FILTRABLE":
case "IS_REQUIRED":
case "MULTIPLE":
if($val=="Y" || $val=="N")
$arSqlSearch[] = "BP.".$key." = '".$val."'";
break;
case "?CODE":
case "?NAME":
$arSqlSearch[] = CIBlock::FilterCreate("BP.".substr($key, 1), $val, "string", "E");
break;
case "CODE":
case "NAME":
$arSqlSearch[] = "UPPER(BP.".$key.") LIKE UPPER('".$val."')";
break;
case "XML_ID":
case "EXTERNAL_ID":
$arSqlSearch[] = "BP.XML_ID LIKE '".$val."'";
break;
case "!XML_ID":
case "!EXTERNAL_ID":
$arSqlSearch[] = "(BP.XML_ID IS NULL OR NOT (BP.XML_ID LIKE '".$val."'))";
break;
case "TMP_ID":
$arSqlSearch[] = "BP.TMP_ID LIKE '".$val."'";
break;
case "!TMP_ID":
$arSqlSearch[] = "(BP.TMP_ID IS NULL OR NOT (BP.TMP_ID LIKE '".$val."'))";
break;
case "PROPERTY_TYPE":
$ar = explode(":", $val);
if (count($ar) == 2)
{
$val = $ar[0];
$arSqlSearch[] = "BP.USER_TYPE = '".$ar[1]."'";
}
$arSqlSearch[] = "BP.".$key." = '".$val."'";
break;
case "USER_TYPE":
$arSqlSearch[] = "BP.".$key." = '".$val."'";
break;
case "ID":
case "IBLOCK_ID":
case "LINK_IBLOCK_ID":
case "VERSION":
$arSqlSearch[] = "BP.".$key." = ".(int)$val;
break;
case "IBLOCK_CODE":
$arSqlSearch[] = "UPPER(B.CODE) = UPPER('".$val."')";
$bJoinIBlock = true;
break;
}
}
if($bJoinIBlock)
$strSql .= "
INNER JOIN b_iblock B ON B.ID = BP.IBLOCK_ID
";
if(!empty($arSqlSearch))
$strSql .= "
WHERE ".implode("\n\t\t\t\tAND ", $arSqlSearch)."
";
$allowKeys = array(
"ID" => true,
"IBLOCK_ID" => true,
"NAME" => true,
"ACTIVE" => true,
"SORT" => true,
"FILTRABLE" => true,
"SEARCHABLE" => true
);
$orderKeys = array();
$arSqlOrder = array();
foreach($arOrder as $by => $order)
{
$by = strtoupper($by);
if (!isset($allowKeys[$by]))
$by = "TIMESTAMP_X";
if (isset($orderKeys[$by]))
continue;
$orderKeys[$by] = true;
$order = strtoupper($order) == "ASC"? "ASC": "DESC";
$arSqlOrder[] = "BP.".$by." ".$order;
}
if(!empty($arSqlOrder))
$strSql .= "
ORDER BY ".implode(", ", $arSqlOrder)."
";
$res = $DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$res = new CIBlockPropertyResult($res);
return $res;
}
///////////////////////////////////////////////////////////////////
// Delete by property ID
///////////////////////////////////////////////////////////////////
public static function Delete($ID)
{
/** @var CMain $APPLICATION */
global $DB, $APPLICATION;
$ID = (int)$ID;
$APPLICATION->ResetException();
foreach (GetModuleEvents("iblock", "OnBeforeIBlockPropertyDelete", true) as $arEvent)
{
if(ExecuteModuleEventEx($arEvent, array($ID))===false)
{
$err = GetMessage("MAIN_BEFORE_DEL_ERR").' '.$arEvent['TO_NAME'];
if($ex = $APPLICATION->GetException())
$err .= ': '.$ex->GetString();
$APPLICATION->ThrowException($err);
return false;
}
}
foreach (GetModuleEvents("iblock", "OnIBlockPropertyDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($ID));
if(!CIBlockPropertyEnum::DeleteByPropertyID($ID, true))
return false;
CIBlockSectionPropertyLink::DeleteByProperty($ID);
Iblock\PropertyFeatureTable::deleteByProperty($ID);
$rsProperty = CIBlockProperty::GetByID($ID);
$arProperty = $rsProperty->Fetch();
if($arProperty["VERSION"] == 2)
{
if($arProperty["PROPERTY_TYPE"]=="F")
{
if($arProperty["MULTIPLE"]=="Y")
{
$strSql = "
SELECT VALUE
FROM b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
WHERE IBLOCK_PROPERTY_ID=".$ID."
";
}
else
{
$strSql = "
SELECT PROPERTY_".$ID." VALUE
FROM b_iblock_element_prop_s".$arProperty["IBLOCK_ID"]."
WHERE PROPERTY_".$ID." is not null
";
}
$res = $DB->Query($strSql);
while($arr = $res->Fetch())
CFile::Delete($arr["VALUE"]);
}
if(!$DB->Query("DELETE FROM b_iblock_section_element WHERE ADDITIONAL_PROPERTY_ID=".$ID, true))
return false;
$strSql = "
DELETE
FROM b_iblock_element_prop_m".$arProperty["IBLOCK_ID"]."
WHERE IBLOCK_PROPERTY_ID=".$ID."
";
if(!$DB->Query($strSql))
return false;
$arSql = CIBlockProperty::DropColumnSQL("b_iblock_element_prop_s".$arProperty["IBLOCK_ID"], array("PROPERTY_".$ID,"DESCRIPTION_".$ID));
foreach($arSql as $strSql)
{
if(!$DB->DDL($strSql))
return false;
}
}
else
{
$res = $DB->Query("SELECT EP.VALUE FROM b_iblock_property P, b_iblock_element_property EP WHERE P.ID=".$ID." AND P.ID=EP.IBLOCK_PROPERTY_ID AND P.PROPERTY_TYPE='F'");
while($arr = $res->Fetch())
CFile::Delete($arr["VALUE"]);
if(!$DB->Query("DELETE FROM b_iblock_section_element WHERE ADDITIONAL_PROPERTY_ID=".$ID, true))
return false;
if(!$DB->Query("DELETE FROM b_iblock_element_property WHERE IBLOCK_PROPERTY_ID=".$ID, true))
return false;
}
$seq = new CIBlockSequence($arProperty["IBLOCK_ID"], $ID);
$seq->Drop();
CIBlock::clearIblockTagCache($arProperty["IBLOCK_ID"]);
$res = $DB->Query("DELETE FROM b_iblock_property WHERE ID=".$ID, true);
foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($arProperty));
return $res;
}
///////////////////////////////////////////////////////////////////
// Add
///////////////////////////////////////////////////////////////////
function Add($arFields)
{
global $DB;
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
if(!isset($arFields["SEARCHABLE"]) || $arFields["SEARCHABLE"] != "Y")
$arFields["SEARCHABLE"]="N";
if(!isset($arFields["FILTRABLE"]) || $arFields["FILTRABLE"] != "Y")
$arFields["FILTRABLE"]="N";
if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!="Y")
$arFields["MULTIPLE"]="N";
if(is_set($arFields, "LIST_TYPE") && $arFields["LIST_TYPE"]!="C")
$arFields["LIST_TYPE"]="L";
if(!$this->CheckFields($arFields))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
$arFields["VERSION"] = CIBlockElement::GetIBVersion($arFields["IBLOCK_ID"]);
unset($arFields["ID"]);
if(isset($arFields["USER_TYPE"]))
{
$arUserType = CIBlockProperty::GetUserType($arFields["USER_TYPE"]);
if(array_key_exists("ConvertToDB", $arUserType))
{
$arValue = array(
"VALUE" => $arFields["DEFAULT_VALUE"],
"DEFAULT_VALUE" => true
);
$arValue = call_user_func_array($arUserType["ConvertToDB"], array($arFields, $arValue));
if(is_array($arValue) && isset($arValue["VALUE"]) && strlen($arValue["VALUE"]))
$arFields["DEFAULT_VALUE"] = $arValue["VALUE"];
else
$arFields["DEFAULT_VALUE"] = false;
}
if(array_key_exists("PrepareSettings", $arUserType))
{
$arFieldsResult = call_user_func_array($arUserType["PrepareSettings"], array($arFields));
if (is_array($arFieldsResult) && array_key_exists('USER_TYPE_SETTINGS', $arFieldsResult))
{
$arFields = array_merge($arFields, $arFieldsResult);
$arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
}
else
{
$arFields["USER_TYPE_SETTINGS"] = serialize($arFieldsResult);
}
}
else
{
$arFields["USER_TYPE_SETTINGS"] = false;
}
}
else
{
$arFields["USER_TYPE_SETTINGS"] = false;
}
$ID = $DB->Add("b_iblock_property", $arFields, array('USER_TYPE_SETTINGS'), "iblock");
if($arFields["VERSION"]==2)
{
if($this->_Add($ID, $arFields))
{
$Result = $ID;
$arFields["ID"] = &$ID;
}
else
{
$DB->Query("DELETE FROM b_iblock_property WHERE ID = ".(int)$ID);
$this->LAST_ERROR = GetMessage("IBLOCK_PROPERTY_ADD_ERROR",array(
"#ID#"=>$ID,
"#CODE#"=>"[14]".$DB->GetErrorSQL(),
));
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
}
else
{
$Result = $ID;
$arFields["ID"] = &$ID;
}
if($Result)
{
if(array_key_exists("VALUES", $arFields))
$this->UpdateEnum($ID, $arFields["VALUES"]);
if(CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y")
{
if(
!array_key_exists("SECTION_PROPERTY", $arFields)
|| $arFields["SECTION_PROPERTY"] !== "N"
)
{
$arLink = array(
"SMART_FILTER" => $arFields["SMART_FILTER"],
);
if (array_key_exists("DISPLAY_TYPE", $arFields))
$arLink["DISPLAY_TYPE"] = $arFields["DISPLAY_TYPE"];
if (array_key_exists("DISPLAY_EXPANDED", $arFields))
$arLink["DISPLAY_EXPANDED"] = $arFields["DISPLAY_EXPANDED"];
if (array_key_exists("FILTER_HINT", $arFields))
$arLink["FILTER_HINT"] = $arFields["FILTER_HINT"];
CIBlockSectionPropertyLink::Add(0, $ID, $arLink);
}
}
if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
{
$featureResult = Iblock\Model\PropertyFeature::addFeatures(
$ID,
$arFields['FEATURES']
);
//TODO: add error handling
unset($featureResult);
}
}
}
global $BX_IBLOCK_PROP_CACHE;
if (isset($arFields["IBLOCK_ID"]))
{
unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]);
CIBlock::clearIblockTagCache($arFields["IBLOCK_ID"]);
}
$arFields["RESULT"] = &$Result;
foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyAdd", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
return $Result;
}
///////////////////////////////////////////////////////////////////
// This one called before any Update or Add
///////////////////////////////////////////////////////////////////
function CheckFields(&$arFields, $ID=false, $bFormValidate=false)
{
/** @var CMain $APPLICATION */
global $APPLICATION;
$this->LAST_ERROR = "";
if ($ID===false || array_key_exists("NAME", $arFields))
{
if (strlen($arFields["NAME"]) <= 0)
$this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_BAD_NAME")."<br>";
}
if(array_key_exists("CODE", $arFields) && strlen($arFields["CODE"]))
{
if(strpos("0123456789", substr($arFields["CODE"], 0, 1))!==false)
$this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_CODE_FIRST_LETTER").": ".$arFields["CODE"]."<br>";
if(preg_match("/[^A-Za-z0-9_]/", $arFields["CODE"]))
$this->LAST_ERROR .= GetMessage("IBLOCK_PROPERTY_WRONG_CODE")."<br>";
}
if(!$bFormValidate)
{
if($ID===false && !is_set($arFields, "IBLOCK_ID"))
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."<br>";
if(is_set($arFields, "IBLOCK_ID"))
{
$arFields["IBLOCK_ID"] = (int)$arFields["IBLOCK_ID"];
$r = CIBlock::GetList(array(), array("ID"=>$arFields["IBLOCK_ID"], "CHECK_PERMISSIONS" => "N"));
if(!$r->Fetch())
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID")."<br>";
}
}
if(isset($arFields["USER_TYPE"]))
{
$arUserType = CIBlockProperty::GetUserType($arFields["USER_TYPE"]);
if(isset($arUserType["CheckFields"]))
{
$value=array("VALUE"=>$arFields["DEFAULT_VALUE"]);
$arError = call_user_func_array($arUserType["CheckFields"],array($arFields,$value));
if(is_array($arError) && count($arError)>0)
$this->LAST_ERROR .= implode("<br>", $arError)."<br>";
}
}
if(!$bFormValidate)
{
$APPLICATION->ResetException();
if($ID===false)
{
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockPropertyAdd", true);
}
else
{
$arFields["ID"] = $ID;
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockPropertyUpdate", true);
}
foreach($db_events as $arEvent)
{
$bEventRes = ExecuteModuleEventEx($arEvent, array(&$arFields));
if($bEventRes===false)
{
if($err = $APPLICATION->GetException())
{
$this->LAST_ERROR .= $err->GetString()."<br>";
}
else
{
$APPLICATION->ThrowException("Unknown error");
$this->LAST_ERROR .= "Unknown error.<br>";
}
break;
}
}
}
if(strlen($this->LAST_ERROR)>0)
return false;
return true;
}
///////////////////////////////////////////////////////////////////
// Update method
///////////////////////////////////////////////////////////////////
function Update($ID, $arFields, $bCheckDescription = false)
{
global $DB;
$ID = (int)$ID;
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
if(is_set($arFields, "SEARCHABLE") && $arFields["SEARCHABLE"]!="Y")
$arFields["SEARCHABLE"]="N";
if(is_set($arFields, "FILTRABLE") && $arFields["FILTRABLE"]!="Y")
$arFields["FILTRABLE"]="N";
if(is_set($arFields, "MULTIPLE") && $arFields["MULTIPLE"]!="Y")
$arFields["MULTIPLE"]="N";
if(is_set($arFields, "LIST_TYPE") && $arFields["LIST_TYPE"]!="C")
$arFields["LIST_TYPE"]="L";
if(!$this->CheckFields($arFields, $ID))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
elseif(!$this->_Update($ID, $arFields, $bCheckDescription))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
if(isset($arFields["USER_TYPE"]))
{
$arUserType = CIBlockProperty::GetUserType($arFields["USER_TYPE"]);
if(array_key_exists("ConvertToDB", $arUserType))
{
$arValue = array(
"VALUE" => $arFields["DEFAULT_VALUE"],
"DEFAULT_VALUE" => true
);
$arValue = call_user_func_array($arUserType["ConvertToDB"], array($arFields, $arValue));
if(is_array($arValue) && isset($arValue["VALUE"]) && strlen($arValue["VALUE"]))
$arFields["DEFAULT_VALUE"] = $arValue["VALUE"];
else
$arFields["DEFAULT_VALUE"] = false;
}
if(array_key_exists("PrepareSettings", $arUserType))
{
if (!isset($arFields["USER_TYPE_SETTINGS"]))
{
$oldData = Iblock\PropertyTable::getList(array(
'select' => array('ID', 'PROPERTY_TYPE', 'USER_TYPE', 'USER_TYPE_SETTINGS'),
'filter' => array('=ID' => $ID)
))->fetch();
if (!empty($oldData) && is_array($oldData))
{
if ($arFields["USER_TYPE"] == $oldData["USER_TYPE"] && !empty($oldData["USER_TYPE_SETTINGS"]))
{
$arFields["USER_TYPE_SETTINGS"] = (
is_array($oldData["USER_TYPE_SETTINGS"])
? $oldData["USER_TYPE_SETTINGS"]
: unserialize($oldData["USER_TYPE_SETTINGS"])
);
}
}
unset($oldData);
}
$arFieldsResult = call_user_func_array($arUserType["PrepareSettings"], array($arFields));
if (is_array($arFieldsResult) && array_key_exists('USER_TYPE_SETTINGS', $arFieldsResult))
{
$arFields = array_merge($arFields, $arFieldsResult);
$arFields["USER_TYPE_SETTINGS"] = serialize($arFields["USER_TYPE_SETTINGS"]);
}
else
{
$arFields["USER_TYPE_SETTINGS"] = serialize($arFieldsResult);
}
}
else
{
$arFields["USER_TYPE_SETTINGS"] = false;
}
}
unset($arFields["ID"]);
unset($arFields["VERSION"]);
unset($arFields["TIMESTAMP_X"]);
$strUpdate = $DB->PrepareUpdate("b_iblock_property", $arFields);
if(strlen($strUpdate) > 0)
{
$strSql = "UPDATE b_iblock_property SET ".$strUpdate." WHERE ID=".$ID;
$DB->QueryBind($strSql, array("USER_TYPE_SETTINGS"=>$arFields["USER_TYPE_SETTINGS"]));
}
if(is_set($arFields, "VALUES"))
$this->UpdateEnum($ID, $arFields["VALUES"]);
if(
array_key_exists("IBLOCK_ID", $arFields)
&& CIBlock::GetArrayByID($arFields["IBLOCK_ID"], "SECTION_PROPERTY") === "Y"
)
{
if(
!array_key_exists("SECTION_PROPERTY", $arFields)
|| $arFields["SECTION_PROPERTY"] !== "N"
)
{
$arLink = array(
"SMART_FILTER" => $arFields["SMART_FILTER"],
);
if (array_key_exists("DISPLAY_TYPE", $arFields))
$arLink["DISPLAY_TYPE"] = $arFields["DISPLAY_TYPE"];
if (array_key_exists("DISPLAY_EXPANDED", $arFields))
$arLink["DISPLAY_EXPANDED"] = $arFields["DISPLAY_EXPANDED"];
if (array_key_exists("FILTER_HINT", $arFields))
$arLink["FILTER_HINT"] = $arFields["FILTER_HINT"];
CIBlockSectionPropertyLink::Set(0, $ID, $arLink);
}
else
{
CIBlockSectionPropertyLink::Delete(0, $ID);
}
}
if (!empty($arFields['FEATURES']) && is_array($arFields['FEATURES']))
{
$featureResult = Iblock\Model\PropertyFeature::setFeatures(
$ID,
$arFields['FEATURES']
);
//TODO: add error handling
unset($featureResult);
}
global $BX_IBLOCK_PROP_CACHE;
if (isset($arFields["IBLOCK_ID"]))
{
unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]);
CIBlock::clearIblockTagCache($arFields["IBLOCK_ID"]);
}
$Result = true;
}
$arFields["ID"] = $ID;
$arFields["RESULT"] = &$Result;
foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
return $Result;
}
///////////////////////////////////////////////////////////////////
// Get property information by ID
///////////////////////////////////////////////////////////////////
public static function GetByID($ID, $IBLOCK_ID=false, $IBLOCK_CODE=false)
{
global $DB;
if($IBLOCK_CODE && $IBLOCK_ID)
$cond = " AND (B.ID = ".(int)$IBLOCK_ID." OR B.CODE = '".$DB->ForSql($IBLOCK_CODE)."') ";
elseif($IBLOCK_CODE)
$cond = " AND B.CODE = '".$DB->ForSql($IBLOCK_CODE)."' ";
elseif($IBLOCK_ID)
$cond = " AND B.ID = ".(int)$IBLOCK_ID." ";
else
$cond = "";
$strSql =
"SELECT BP.* ".
"FROM b_iblock_property BP, b_iblock B ".
"WHERE BP.IBLOCK_ID=B.ID ".
$cond.
(is_numeric(substr($ID, 0, 1))
?
" AND BP.ID=".(int)$ID
:
" AND UPPER(BP.CODE)=UPPER('".$DB->ForSql($ID)."') "
);
$res = new CIBlockPropertyResult($DB->Query($strSql));
return $res;
}
public static function GetPropertyArray($ID, $IBLOCK_ID, $bCached=true)
{
global $DB;
$block_id = false;
$block_code = false;
if(is_array($IBLOCK_ID))
{
foreach($IBLOCK_ID as $k=>$v)
{
if(is_numeric($v))
{
if($block_id)
$block_id .= ", ";
else
$block_id = "";
$block_id .= IntVal($v);
}
elseif(strlen($v)>0)
{
if($block_code)
$block_code .= ", ";
else
$block_code = "";
$block_code .= "'".$DB->ForSQL($v, 200)."'";
}
}
}
elseif(is_numeric($IBLOCK_ID))
$block_id = IntVal($IBLOCK_ID);
elseif(strlen($IBLOCK_ID)>0)
$block_code = "'".$DB->ForSQL($IBLOCK_ID, 200)."'";
global $IBLOCK_CACHE_PROPERTY;
if($bCached && is_set($IBLOCK_CACHE_PROPERTY, $ID."|".$block_id."|".$block_code))
return $IBLOCK_CACHE_PROPERTY[$ID."|".$block_id."|".$block_code];
if($block_code && $block_id)
$cond = " AND (B.ID IN (".$block_id.") OR B.CODE IN (".$block_code.")) ";
elseif($block_code)
$cond = " AND B.CODE IN (".$block_code.") ";
elseif($block_id)
$cond = " AND B.ID IN (".$block_id.") ";
else
$cond = "";
$upperID = strtoupper($ID);
$strSql = "
SELECT BP.*
FROM
b_iblock_property BP
,b_iblock B
WHERE BP.IBLOCK_ID=B.ID
".$cond."
".(substr($upperID, -6)=='_VALUE'?
(is_numeric(substr($ID, 0, 1))?
"AND BP.ID=".IntVal($ID)
:
"AND ((UPPER(BP.CODE)='".$DB->ForSql($upperID)."' AND BP.PROPERTY_TYPE!='L') OR (UPPER(BP.CODE)='".$DB->ForSql(substr($upperID, 0, -6))."' AND BP.PROPERTY_TYPE='L'))"
)
:
(is_numeric(substr($ID, 0, 1))?
"AND BP.ID=".IntVal($ID)
:
"AND UPPER(BP.CODE)='".$DB->ForSql($upperID)."'"
)
);
$res = $DB->Query($strSql);
if($arr = $res->Fetch())
{
$arr["ORIG_ID"] = $arr["ID"]; //it saves original (digital) id
$arr["IS_CODE_UNIQUE"] = true; //boolean check for global code uniquess
$arr["IS_VERSION_MIXED"] = false;//boolean check if varios versions of ibformation block properties
while($arr2 = $res->Fetch())
{
$arr["IS_CODE_UNIQUE"] = false;
if($arr["VERSION"] != $arr2["VERSION"])
$arr["IS_VERSION_MIXED"] = true;
}
if(
substr($upperID, -6) == '_VALUE'
&& $arr["PROPERTY_TYPE"] == "L"
&& strtoupper($arr["CODE"]) == substr($upperID, 0, -6)
)
$arr["ID"] = substr($ID, 0, -6);
else
$arr["ID"] = $ID;
}
$IBLOCK_CACHE_PROPERTY[$ID."|".$block_id."|".$block_code] = $arr;
return $arr;
}
public static function GetPropertyEnum($PROP_ID, $arOrder = array("SORT"=>"asc"), $arFilter = array())
{
global $DB;
$strSqlSearch = "";
if(is_array($arFilter))
{
foreach($arFilter as $key => $val)
{
$key = strtoupper($key);
switch($key)
{
case "ID":
$strSqlSearch .= "AND (BPE.ID=".intval($val).")\n";
break;
case "IBLOCK_ID":
$strSqlSearch .= "AND (BP.IBLOCK_ID=".intval($val).")\n";
break;
case "VALUE":
$strSqlSearch .= "AND (BPE.VALUE LIKE '".$DB->ForSql($val)."')\n";
break;
case "EXTERNAL_ID":
case "XML_ID":
$strSqlSearch .= "AND (BPE.XML_ID LIKE '".$DB->ForSql($val)."')\n";
break;
}
}
}
$arSqlOrder = array();
if(is_array($arOrder))
{
foreach($arOrder as $by => $order)
{
$by = strtolower($by);
$order = strtolower($order);
if ($order!="asc")
$order = "desc";
if ($by == "value")
$arSqlOrder["BPE.VALUE"] = "BPE.VALUE ".$order;
elseif ($by == "id")
$arSqlOrder["BPE.ID"] = "BPE.ID ".$order;
elseif ($by == "external_id")
$arSqlOrder["BPE.XML_ID"] = "BPE.XML_ID ".$order;
elseif ($by == "xml_id")
$arSqlOrder["BPE.XML_ID"] = "BPE.XML_ID ".$order;
else
$arSqlOrder["BPE.SORT"] = "BPE.SORT ".$order;
}
}
if(empty($arSqlOrder))
$strSqlOrder = "";
else
$strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder);
$res = $DB->Query($s = "
SELECT BPE.*, BPE.XML_ID as EXTERNAL_ID
FROM
b_iblock_property_enum BPE
INNER JOIN b_iblock_property BP ON BP.ID = BPE.PROPERTY_ID
WHERE
".(
is_numeric(substr($PROP_ID, 0, 1))?
"BP.ID = ".intval($PROP_ID):
"BP.CODE = '".$DB->ForSql($PROP_ID)."'"
)."
".$strSqlSearch."
".$strSqlOrder."
");
return $res;
}
function UpdateEnum($ID, $arVALUES, $bForceDelete = true)
{
global $DB, $CACHE_MANAGER;
$ID = IntVal($ID);
if(!is_array($arVALUES) || (empty($arVALUES) && $bForceDelete))
{
CIBlockPropertyEnum::DeleteByPropertyID($ID);
return true;
}
$ar_XML_ID = array();
$db_res = $this->GetPropertyEnum($ID);
while($res = $db_res->Fetch())
{
$ar_XML_ID[rtrim($res["XML_ID"], " ")] = $res["ID"];
}
$sqlWhere = "";
if(!$bForceDelete)
{
$rsProp = CIBlockProperty::GetByID($ID);
if($arProp = $rsProp->Fetch())
{
if($arProp["VERSION"] == 1)
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_property
WHERE b_iblock_element_property.IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
AND b_iblock_element_property.VALUE_ENUM = b_iblock_property_enum.ID
)";
elseif($arProp["MULTIPLE"] == "N")
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_prop_s".$arProp["IBLOCK_ID"]."
WHERE b_iblock_element_prop_s".$arProp["IBLOCK_ID"].".PROPERTY_".$arProp["ID"]." = b_iblock_property_enum.ID
)";
else
$sqlWhere = "AND NOT EXISTS (
SELECT *
FROM b_iblock_element_prop_m".$arProp["IBLOCK_ID"]."
WHERE b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID
AND b_iblock_element_prop_m".$arProp["IBLOCK_ID"].".VALUE_ENUM = b_iblock_property_enum.ID
)";
}
}
$db_res = $this->GetPropertyEnum($ID);
while($res = $db_res->Fetch())
{
$VALUE = $arVALUES[$res["ID"]];
$VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
UnSet($arVALUES[$res["ID"]]);
if(strlen($VAL)<=0)
{
unset($ar_XML_ID[rtrim($res["XML_ID"], " ")]);
$strSql = "
DELETE FROM b_iblock_property_enum
WHERE ID=".$res["ID"]."
".$sqlWhere."
";
$DB->Query($strSql);
}
else
{
$DEF = "";
$SORT = 0;
$XML_ID = "";
if(is_array($VALUE))
{
if(array_key_exists("DEF", $VALUE))
$DEF = $VALUE["DEF"]=="Y"? "Y": "N";
if(array_key_exists("SORT", $VALUE))
$SORT = intval($VALUE["SORT"]);
if($SORT < 0)
$SORT = 0;
if(array_key_exists("XML_ID", $VALUE) && strlen($VALUE["XML_ID"]))
$XML_ID = substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
elseif(array_key_exists("EXTERNAL_ID", $VALUE) && strlen($VALUE["EXTERNAL_ID"]))
$XML_ID = substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
}
if($XML_ID)
{
unset($ar_XML_ID[strtolower(rtrim($res["XML_ID"], " "))]);
if (isset($ar_XML_ID[strtolower($XML_ID)]))
$XML_ID = md5(uniqid(""));
$ar_XML_ID[strtolower($XML_ID)] = $res["ID"];
}
$strSql = "
UPDATE b_iblock_property_enum
SET
".($DEF? " DEF = '".$DEF."', ":"")."
".($SORT? " SORT = ".$SORT.", ":"")."
".($XML_ID? " XML_ID = '".$DB->ForSQL($XML_ID, 200)."', ":"")."
VALUE = '".$DB->ForSQL($VAL, 255)."'
WHERE
ID = ".$res["ID"]."
";
$DB->Query($strSql);
}
}
foreach($arVALUES as $id => $VALUE)
{
$VAL = is_array($VALUE)? $VALUE["VALUE"]: $VALUE;
if(strlen($id) > 0 && strlen($VAL) > 0)
{
$DEF = "";
$SORT = 0;
$XML_ID = "";
if(is_array($VALUE))
{
if(array_key_exists("DEF", $VALUE))
$DEF = $VALUE["DEF"]=="Y"? "Y": "N";
if(array_key_exists("SORT", $VALUE))
$SORT = intval($VALUE["SORT"]);
if($SORT < 0)
$SORT = 0;
if(array_key_exists("XML_ID", $VALUE) && strlen($VALUE["XML_ID"]))
$XML_ID = substr(rtrim($VALUE["XML_ID"], " "), 0, 200);
elseif(array_key_exists("EXTERNAL_ID", $VALUE) && strlen($VALUE["EXTERNAL_ID"]))
$XML_ID = substr(rtrim($VALUE["EXTERNAL_ID"], " "), 0, 200);
}
if($XML_ID)
{
if (isset($ar_XML_ID[strtolower($XML_ID)]))
$XML_ID = md5(uniqid("", true));
}
else
{
$XML_ID = md5(uniqid("", true));
}
$ar_XML_ID[strtolower($XML_ID)] = 0;
$strSql = "
INSERT INTO b_iblock_property_enum
(
PROPERTY_ID
".($DEF? ",DEF": "")."
".($SORT? ",SORT": "")."
,VALUE
,XML_ID
) VALUES (
".$ID."
".($DEF? ",'".$DEF."'": "")."
".($SORT? ",".$SORT."": "")."
,'".$DB->ForSQL($VAL, 255)."'
,'".$DB->ForSQL($XML_ID, 200)."'
)
";
$DB->Query($strSql);
}
}
if(CACHED_b_iblock_property_enum !== false)
$CACHE_MANAGER->CleanDir("b_iblock_property_enum");
if (defined("BX_COMP_MANAGED_CACHE"))
$CACHE_MANAGER->ClearByTag("iblock_property_enum_".$ID);
return true;
}
public static function GetUserType($USER_TYPE = false)
{
static $CACHE = null;
if(!isset($CACHE))
{
$CACHE = array();
foreach(GetModuleEvents("iblock", "OnIBlockPropertyBuildList", true) as $arEvent)
{
$res = ExecuteModuleEventEx($arEvent);
if (is_array($res) && array_key_exists("USER_TYPE", $res))
{
$CACHE[$res["USER_TYPE"]] = $res;
}
}
}
if($USER_TYPE !== false)
{
if(array_key_exists($USER_TYPE, $CACHE))
return $CACHE[$USER_TYPE];
else
return array();
}
else
{
return $CACHE;
}
}
function FormatUpdateError($ID, $CODE)
{
return GetMessage("IBLOCK_PROPERTY_CHANGE_ERROR",array("#ID#"=>$ID,"#CODE#"=>$CODE));
}
function FormatNotFoundError($ID)
{
return GetMessage("IBLOCK_PROPERTY_NOT_FOUND",array("#ID#"=>$ID));
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyDateTime::GetUserTypeDescription()
*
* @return array
*/
public static function _DateTime_GetUserTypeDescription()
{
return CIBlockPropertyDateTime::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyDate::GetUserTypeDescription()
*
* @return array
*/
public static function _Date_GetUserTypeDescription()
{
return CIBlockPropertyDate::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyXmlID::GetUserTypeDescription()
*
* @return array
*/
public static function _XmlID_GetUserTypeDescription()
{
return CIBlockPropertyXmlID::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyFileMan::GetUserTypeDescription()
*
* @return array
*/
public static function _FileMan_GetUserTypeDescription()
{
return CIBlockPropertyFileMan::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyHTML::GetUserTypeDescription()
*
* @return array
*/
public static function _HTML_GetUserTypeDescription()
{
return CIBlockPropertyHTML::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyElementList::GetUserTypeDescription()
*
* @return array
*/
public static function _ElementList_GetUserTypeDescription()
{
return CIBlockPropertyElementList::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertySequence::GetUserTypeDescription()
*
* @return array
*/
public static function _Sequence_GetUserTypeDescription()
{
return CIBlockPropertySequence::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertyElementAutoComplete::GetUserTypeDescription()
*
* @return array
*/
public static function _ElementAutoComplete_GetUserTypeDescription()
{
return CIBlockPropertyElementAutoComplete::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertySKU::GetUserTypeDescription()
*
* @return array
*/
public static function _SKU_GetUserTypeDescription()
{
return CIBlockPropertySKU::GetUserTypeDescription();
}
/**
* @deprecated deprecated since iblock 17.0.9
* @see \CIBlockPropertySectionAutoComplete::GetUserTypeDescription()
*
* @return array
*/
public static function _SectionAutoComplete_GetUserTypeDescription()
{
return CIBlockPropertySectionAutoComplete::GetUserTypeDescription();
}
function _Update($ID, $arFields, $bCheckDescription = false)
{
return false;
}
function DropColumnSQL($strTable, $arColumns)
{
return array();
}
function _Add($ID, $arFields)
{
return false;
}
}