/** * @param bool|array $arOrder * @param array $arFilter * @return array */ function GetProperties($arOrder = false, $arFilter = array()) { if ($arOrder === false) { $arOrder = array("sort" => "asc", "id" => "asc", "enum_sort" => "asc", "value_id" => "asc"); } if (count($arFilter) == 0 && is_array($this->props)) { $arAllProps = array(); foreach ($this->props as $arProp) { if (strlen(trim($arProp["CODE"])) > 0) { $PIND = $arProp["CODE"]; } else { $PIND = $arProp["ID"]; } $arProp["VALUE"] = $this->fields["PROPERTY_" . $arProp["ID"]]; $arProp["DESCRIPTION"] = $this->fields["DESCRIPTION_" . $arProp["ID"]]; if ($arProp["MULTIPLE"] == "N") { if ($arProp["PROPERTY_TYPE"] == "L") { $arProp["VALUE_ENUM_ID"] = $val = $arProp["VALUE"]; $arEnum = CIBlockPropertyEnum::GetByID($val); if ($arEnum !== false) { $arProp["~VALUE"] = $arEnum["VALUE"]; if (is_array($arProp["VALUE"]) || preg_match("/[;&<>\"]/", $arProp["VALUE"])) { $arProp["VALUE"] = htmlspecialcharsex($arEnum["VALUE"]); } else { $arProp["VALUE"] = $arEnum["VALUE"]; } $arProp["VALUE_ENUM"] = $arProp["VALUE"]; $arProp["VALUE_XML_ID"] = htmlspecialcharsex($arEnum["XML_ID"]); $arProp["VALUE_SORT"] = $arEnum["SORT"]; } else { $arProp["~VALUE"] = ""; $arProp["VALUE"] = ""; } } elseif (is_array($arProp["VALUE"]) || strlen($arProp["VALUE"])) { if ($arProp["PROPERTY_TYPE"] == "N") { $arProp["VALUE"] = htmlspecialcharsex(CIBlock::NumberFormat($arProp["VALUE"])); } $arProp["~VALUE"] = $this->fields["~PROPERTY_" . $arProp["ID"]]; $arProp["~DESCRIPTION"] = $this->fields["~DESCRIPTION_" . $arProp["ID"]]; } else { $arProp["VALUE"] = $arProp["~VALUE"] = ""; $arProp["DESCRIPTION"] = $arProp["~DESCRIPTION"] = ""; } } else { $arList = $arProp["VALUE"]; $arListTilda = $this->fields["~PROPERTY_" . $arProp["ID"]]; if ($arProp["PROPERTY_TYPE"] == "L") { $arProp["~VALUE"] = $arProp["VALUE"] = $arProp["VALUE_ENUM_ID"] = false; $arProp["VALUE_XML_ID"] = false; foreach ($arList as $key => $val) { if (strlen($val) > 0) { $arEnum = CIBlockPropertyEnum::GetByID($key); if ($arEnum !== false) { $xml_id = htmlspecialcharsex($arEnum["XML_ID"]); $sort = $arEnum["SORT"]; } else { $xml_id = false; $sort = false; } if (is_array($arProp["VALUE"])) { $arProp["VALUE_ENUM_ID"][] = $key; $arProp["~VALUE"][] = $val; if (is_array($val) || preg_match("/[;&<>\"]/", $val)) { $arProp["VALUE"][] = htmlspecialcharsex($val); } else { $arProp["VALUE"][] = $val; } $arProp["VALUE_XML_ID"][] = $xml_id; $arProp["VALUE_SORT"][] = $sort; } else { $arProp["VALUE_ENUM_ID"] = array($key); $arProp["~VALUE"] = array($val); if (is_array($val) || preg_match("/[;&<>\"]/", $val)) { $arProp["VALUE"] = array(htmlspecialcharsex($val)); } else { $arProp["VALUE"] = array($val); } $arProp["VALUE_XML_ID"] = array($xml_id); $arProp["VALUE_SORT"] = array($sort); } } } $arProp["VALUE_ENUM"] = $arProp["VALUE"]; } else { $arDesc = $arProp["DESCRIPTION"]; $arDescTilda = $this->fields["~DESCRIPTION_" . $arProp["ID"]]; $arProp["~VALUE"] = $arProp["VALUE"] = false; $arProp["~DESCRIPTION"] = $arProp["DESCRIPTION"] = false; foreach ($arList as $key => $val) { if (is_array($val) || strlen($val) > 0) { if (is_array($arProp["VALUE"])) { $arProp["~VALUE"][] = $arListTilda[$key]; if ($arProp["PROPERTY_TYPE"] == "N") { $val = htmlspecialcharsex(CIBlock::NumberFormat($val)); } $arProp["VALUE"][] = $val; $arProp["~DESCRIPTION"][] = $arDescTilda[$key]; $arProp["DESCRIPTION"][] = $arDesc[$key]; } else { $arProp["~VALUE"] = array($arListTilda[$key]); if ($arProp["PROPERTY_TYPE"] == "N") { $val = htmlspecialcharsex(CIBlock::NumberFormat($val)); } $arProp["VALUE"] = array($val); $arProp["~DESCRIPTION"] = array($arDescTilda[$key]); $arProp["DESCRIPTION"] = array($arDesc[$key]); } } } } } $arAllProps[$PIND] = $arProp; } return $arAllProps; } if (array_key_exists("ID", $arFilter) && !is_numeric(substr($arFilter["ID"], 0, 1))) { $arFilter["CODE"] = $arFilter["ID"]; unset($arFilter["ID"]); } if (!array_key_exists("ACTIVE", $arFilter)) { $arFilter["ACTIVE"] = "Y"; } $props = CIBlockElement::GetProperty($this->fields["IBLOCK_ID"], $this->fields["ID"], $arOrder, $arFilter); $arAllProps = array(); while ($arProp = $props->Fetch()) { if (strlen(trim($arProp["CODE"])) > 0) { $PIND = $arProp["CODE"]; } else { $PIND = $arProp["ID"]; } if ($arProp["PROPERTY_TYPE"] == "L") { $arProp["VALUE_ENUM_ID"] = $arProp["VALUE"]; $arProp["VALUE"] = $arProp["VALUE_ENUM"]; } if (is_array($arProp["VALUE"]) || strlen($arProp["VALUE"]) > 0) { $arProp["~VALUE"] = $arProp["VALUE"]; if (is_array($arProp["VALUE"]) || preg_match("/[;&<>\"]/", $arProp["VALUE"])) { $arProp["VALUE"] = htmlspecialcharsex($arProp["VALUE"]); } $arProp["~DESCRIPTION"] = $arProp["DESCRIPTION"]; if (preg_match("/[;&<>\"]/", $arProp["DESCRIPTION"])) { $arProp["DESCRIPTION"] = htmlspecialcharsex($arProp["DESCRIPTION"]); } } else { $arProp["VALUE"] = $arProp["~VALUE"] = ""; $arProp["DESCRIPTION"] = $arProp["~DESCRIPTION"] = ""; } if ($arProp["MULTIPLE"] == "Y") { if (array_key_exists($PIND, $arAllProps)) { $arTemp =& $arAllProps[$PIND]; if ($arProp["VALUE"] !== "") { if (is_array($arTemp["VALUE"])) { $arTemp["VALUE"][] = $arProp["VALUE"]; $arTemp["~VALUE"][] = $arProp["~VALUE"]; $arTemp["DESCRIPTION"][] = $arProp["DESCRIPTION"]; $arTemp["~DESCRIPTION"][] = $arProp["~DESCRIPTION"]; $arTemp["PROPERTY_VALUE_ID"][] = $arProp["PROPERTY_VALUE_ID"]; if ($arProp["PROPERTY_TYPE"] == "L") { $arTemp["VALUE_ENUM_ID"][] = $arProp["VALUE_ENUM_ID"]; $arTemp["VALUE_ENUM"][] = $arProp["VALUE_ENUM"]; $arTemp["VALUE_XML_ID"][] = $arProp["VALUE_XML_ID"]; //$arTemp["VALUE_SORT"][] = $arProp["VALUE_SORT"]; } } else { $arTemp["VALUE"] = array($arProp["VALUE"]); $arTemp["~VALUE"] = array($arProp["~VALUE"]); $arTemp["DESCRIPTION"] = array($arProp["DESCRIPTION"]); $arTemp["~DESCRIPTION"] = array($arProp["~DESCRIPTION"]); $arTemp["PROPERTY_VALUE_ID"] = array($arProp["PROPERTY_VALUE_ID"]); if ($arProp["PROPERTY_TYPE"] == "L") { $arTemp["VALUE_ENUM_ID"] = array($arProp["VALUE_ENUM_ID"]); $arTemp["VALUE_ENUM"] = array($arProp["VALUE_ENUM"]); $arTemp["VALUE_XML_ID"] = array($arProp["VALUE_XML_ID"]); $arTemp["VALUE_SORT"] = array($arProp["VALUE_SORT"]); } } } } else { $arProp["~NAME"] = $arProp["NAME"]; if (preg_match("/[;&<>\"]/", $arProp["NAME"])) { $arProp["NAME"] = htmlspecialcharsex($arProp["NAME"]); } $arProp["~DEFAULT_VALUE"] = $arProp["DEFAULT_VALUE"]; if (is_array($arProp["DEFAULT_VALUE"]) || preg_match("/[;&<>\"]/", $arProp["DEFAULT_VALUE"])) { $arProp["DEFAULT_VALUE"] = htmlspecialcharsex($arProp["DEFAULT_VALUE"]); } if ($arProp["VALUE"] !== "") { $arProp["VALUE"] = array($arProp["VALUE"]); $arProp["~VALUE"] = array($arProp["~VALUE"]); $arProp["DESCRIPTION"] = array($arProp["DESCRIPTION"]); $arProp["~DESCRIPTION"] = array($arProp["~DESCRIPTION"]); $arProp["PROPERTY_VALUE_ID"] = array($arProp["PROPERTY_VALUE_ID"]); if ($arProp["PROPERTY_TYPE"] == "L") { $arProp["VALUE_ENUM_ID"] = array($arProp["VALUE_ENUM_ID"]); $arProp["VALUE_ENUM"] = array($arProp["VALUE_ENUM"]); $arProp["VALUE_XML_ID"] = array($arProp["VALUE_XML_ID"]); $arProp["VALUE_SORT"] = array($arProp["VALUE_SORT"]); } } else { $arProp["VALUE"] = false; $arProp["~VALUE"] = false; $arProp["DESCRIPTION"] = false; $arProp["~DESCRIPTION"] = false; $arProp["PROPERTY_VALUE_ID"] = false; if ($arProp["PROPERTY_TYPE"] == "L") { $arProp["VALUE_ENUM_ID"] = false; $arProp["VALUE_ENUM"] = false; $arProp["VALUE_XML_ID"] = false; $arProp["VALUE_SORT"] = false; } } $arAllProps[$PIND] = $arProp; } } else { $arProp["~NAME"] = $arProp["NAME"]; if (preg_match("/[;&<>\"]/", $arProp["NAME"])) { $arProp["NAME"] = htmlspecialcharsex($arProp["NAME"]); } $arProp["~DEFAULT_VALUE"] = $arProp["DEFAULT_VALUE"]; if (is_array($arProp["DEFAULT_VALUE"]) || preg_match("/[;&<>\"]/", $arProp["DEFAULT_VALUE"])) { $arProp["DEFAULT_VALUE"] = htmlspecialcharsex($arProp["DEFAULT_VALUE"]); } $arAllProps[$PIND] = $arProp; } } return $arAllProps; }
function Fetch() { /** @global CCacheManager $CACHE_MANAGER */ global $CACHE_MANAGER; /** @global CDatabase $DB */ global $DB; $res = parent::Fetch(); if (!is_object($this)) { return $res; } $arUpdate = array(); if ($res) { if (is_array($this->arIBlockLongProps)) { foreach ($res as $k => $v) { if (preg_match("#^ALIAS_(\\d+)_(.*)\$#", $k, $match)) { $res[$this->arIBlockLongProps[$match[1]] . $match[2]] = $v; unset($res[$k]); } } } if (isset($res["IBLOCK_ID"]) && defined("BX_COMP_MANAGED_CACHE") && $res["IBLOCK_ID"] != $this->_LAST_IBLOCK_ID) { CIBlock::registerWithTagCache($res["IBLOCK_ID"]); $this->_LAST_IBLOCK_ID = $res["IBLOCK_ID"]; } if (isset($res["ID"]) && $res["ID"] != "" && is_array($this->arIBlockMultProps)) { foreach ($this->arIBlockMultProps as $field_name => $db_prop) { if (array_key_exists($field_name, $res)) { if (is_object($res[$field_name])) { $res[$field_name] = $res[$field_name]->load(); } if (preg_match("/(_VALUE)\$/", $field_name)) { $descr_name = preg_replace("/(_VALUE)\$/", "_DESCRIPTION", $field_name); } else { $descr_name = preg_replace("/^(PROPERTY_)/", "DESCRIPTION_", $field_name); } if (strlen($res[$field_name]) <= 0) { $strSql = "\n\t\t\t\t\t\t\t\tSELECT VALUE,DESCRIPTION\n\t\t\t\t\t\t\t\tFROM b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"] . "\n\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\tIBLOCK_ELEMENT_ID = " . intval($res["ID"]) . "\n\t\t\t\t\t\t\t\t\tAND IBLOCK_PROPERTY_ID = " . intval($db_prop["ORIG_ID"]) . "\n\t\t\t\t\t\t\t\tORDER BY ID\n\t\t\t\t\t\t\t"; $rs = $DB->Query($strSql); $res[$field_name] = array(); $res[$descr_name] = array(); while ($ar = $rs->Fetch()) { $res[$field_name][] = $ar["VALUE"]; $res[$descr_name][] = $ar["DESCRIPTION"]; } $arUpdate["b_iblock_element_prop_s" . $db_prop["IBLOCK_ID"]]["PROPERTY_" . $db_prop["ORIG_ID"]] = serialize(array("VALUE" => $res[$field_name], "DESCRIPTION" => $res[$descr_name])); } else { $tmp = unserialize($res[$field_name]); $res[$field_name] = $tmp["VALUE"]; $res[$descr_name] = $tmp["DESCRIPTION"]; } if (is_array($res[$field_name]) && $db_prop["PROPERTY_TYPE"] == "L") { $arTemp = array(); foreach ($res[$field_name] as $key => $val) { $arEnum = CIBlockPropertyEnum::GetByID($val); if ($arEnum !== false) { $arTemp[$val] = $arEnum["VALUE"]; } } $res[$field_name] = $arTemp; } } } foreach ($arUpdate as $strTable => $arFields) { $strUpdate = $DB->PrepareUpdate($strTable, $arFields); if ($strUpdate != "") { $strSql = "UPDATE " . $strTable . " SET " . $strUpdate . " WHERE IBLOCK_ELEMENT_ID = " . intval($res["ID"]); $DB->QueryBind($strSql, $arFields); } } } if (is_array($this->arIBlockConvProps)) { foreach ($this->arIBlockConvProps as $strFieldName => $arCallback) { if (is_array($res[$strFieldName])) { foreach ($res[$strFieldName] as $key => $value) { $arValue = call_user_func_array($arCallback["ConvertFromDB"], array($arCallback["PROPERTY"], array("VALUE" => $value, "DESCRIPTION" => ""))); $res[$strFieldName][$key] = $arValue["VALUE"]; } } else { $arValue = call_user_func_array($arCallback["ConvertFromDB"], array($arCallback["PROPERTY"], array("VALUE" => $res[$strFieldName], "DESCRIPTION" => ""))); $res[$strFieldName] = $arValue["VALUE"]; } } } if (is_array($this->arIBlockNumProps)) { foreach ($this->arIBlockNumProps as $field_name => $db_prop) { if (strlen($res[$field_name]) > 0) { $res[$field_name] = htmlspecialcharsex(CIBlock::NumberFormat($res[$field_name])); } } } if (isset($res["UC_ID"])) { $res["CREATED_BY_FORMATTED"] = CUser::FormatName($this->nameTemplate, array("NAME" => $res["UC_NAME"], "LAST_NAME" => $res["UC_LAST_NAME"], "SECOND_NAME" => $res["UC_SECOND_NAME"], "EMAIL" => $res["UC_EMAIL"], "ID" => $res["UC_ID"], "LOGIN" => $res["UC_LOGIN"]), true, false); unset($res["UC_NAME"]); unset($res["UC_LAST_NAME"]); unset($res["UC_SECOND_NAME"]); unset($res["UC_EMAIL"]); unset($res["UC_ID"]); unset($res["UC_LOGIN"]); } } elseif (defined("BX_COMP_MANAGED_CACHE") && $this->_LAST_IBLOCK_ID == "" && count($this->_FILTER_IBLOCK_ID)) { foreach ($this->_FILTER_IBLOCK_ID as $iblock_id => $t) { CIBlock::registerWithTagCache($iblock_id); } } return $res; }
public static function GetProperty($IBLOCK_ID, $ELEMENT_ID, $by = "sort", $order = "asc", $arFilter = array()) { global $DB; if (is_array($by)) { if ($order != "asc") { $arFilter = $order; } $arOrder = $by; } else { $arOrder = false; } $IBLOCK_ID = intval($IBLOCK_ID); $ELEMENT_ID = intval($ELEMENT_ID); $VERSION = CIBlockElement::GetIBVersion($IBLOCK_ID); $strSqlSearch = ""; foreach ($arFilter as $key => $val) { switch (strtoupper($key)) { case "ACTIVE": if ($val == "Y" || $val == "N") { $strSqlSearch .= "AND BP.ACTIVE='" . $val . "'\n"; } break; case "SEARCHABLE": if ($val == "Y" || $val == "N") { $strSqlSearch .= "AND BP.SEARCHABLE='" . $val . "'\n"; } break; case "NAME": if (strlen($val) > 0) { $strSqlSearch .= "AND " . CIBLock::_Upper("BP.NAME") . " LIKE " . CIBlock::_Upper("'" . $DB->ForSql($val) . "'") . "\n"; } break; case "ID": if (is_array($val)) { if (!empty($val)) { $strSqlSearch .= "AND BP.ID in (" . implode(", ", array_map("intval", $val)) . ")\n"; } } elseif (strlen($val) > 0) { $strSqlSearch .= "AND BP.ID=" . IntVal($val) . "\n"; } break; case "PROPERTY_TYPE": if (strlen($val) > 0) { $strSqlSearch .= "AND BP.PROPERTY_TYPE='" . $DB->ForSql($val) . "'\n"; } break; case "CODE": if (strlen($val) > 0) { $strSqlSearch .= "AND " . CIBLock::_Upper("BP.CODE") . " LIKE " . CIBLock::_Upper("'" . $DB->ForSql($val) . "'") . "\n"; } break; case "EMPTY": if (strlen($val) > 0) { if ($val == "Y") { $strSqlSearch .= "AND BEP.ID IS NULL\n"; } elseif ($VERSION != 2) { $strSqlSearch .= "AND BEP.ID IS NOT NULL\n"; } } break; } } $arSqlOrder = array(); if ($arOrder) { foreach ($arOrder as $by => $order) { $order = strtolower($order); if ($order != "desc") { $order = "asc"; } $by = strtolower($by); if ($by == "sort") { $arSqlOrder["BP.SORT"] = $order; } elseif ($by == "id") { $arSqlOrder["BP.ID"] = $order; } elseif ($by == "name") { $arSqlOrder["BP.NAME"] = $order; } elseif ($by == "active") { $arSqlOrder["BP.ACTIVE"] = $order; } elseif ($by == "value_id") { $arSqlOrder["BEP.ID"] = $order; } elseif ($by == "enum_sort") { $arSqlOrder["BEPE.SORT"] = $order; } else { $arSqlOrder["BP.SORT"] = $order; } } } else { if ($by == "id") { $arSqlOrder["BP.ID"] = "asc"; } elseif ($by == "name") { $arSqlOrder["BP.NAME"] = "asc"; } elseif ($by == "active") { $arSqlOrder["BP.ACTIVE"] = "asc"; } elseif ($by == "value_id") { $arSqlOrder["BEP.ID"] = $order; } elseif ($by == "enum_sort") { $arSqlOrder["BEPE.SORT"] = $order; } else { $arSqlOrder["BP.SORT"] = "asc"; $by = "sort"; } if ($order != "desc") { $arSqlOrder["BP.SORT"] = "asc"; $arSqlOrder["BP.ID"] = "asc"; $arSqlOrder["BEPE.SORT"] = "asc"; $arSqlOrder["BEP.ID"] = "asc"; $order = "asc"; } else { $arSqlOrder["BP.SORT"] = "desc"; $arSqlOrder["BP.ID"] = "desc"; $arSqlOrder["BEPE.SORT"] = "desc"; $arSqlOrder["BEP.ID"] = "desc"; } } $strSqlOrder = ""; foreach ($arSqlOrder as $key => $val) { $strSqlOrder .= ", " . $key . " " . $val; } if ($strSqlOrder != "") { $strSqlOrder = ' ORDER BY ' . substr($strSqlOrder, 1); } if ($VERSION == 2) { $strTable = "b_iblock_element_prop_m" . $IBLOCK_ID; } else { $strTable = "b_iblock_element_property"; } $strSql = "\n\t\t\tSELECT BP.*, BEP.ID as PROPERTY_VALUE_ID, BEP.VALUE, BEP.DESCRIPTION, BEPE.VALUE VALUE_ENUM, BEPE.XML_ID VALUE_XML_ID, BEPE.SORT VALUE_SORT\n\t\t\tFROM b_iblock B\n\t\t\t\tINNER JOIN b_iblock_property BP ON B.ID=BP.IBLOCK_ID\n\t\t\t\tLEFT JOIN " . $strTable . " BEP ON (BP.ID = BEP.IBLOCK_PROPERTY_ID AND BEP.IBLOCK_ELEMENT_ID = " . $ELEMENT_ID . ")\n\t\t\t\tLEFT JOIN b_iblock_property_enum BEPE ON (BP.PROPERTY_TYPE = 'L' AND BEPE.ID=BEP.VALUE_ENUM AND BEPE.PROPERTY_ID=BP.ID)\n\t\t\tWHERE B.ID = " . $IBLOCK_ID . "\n\t\t\t\t" . $strSqlSearch . "\n\t\t\t" . $strSqlOrder; if ($VERSION == 2) { $result = array(); $arElements = array(); $rs = $DB->Query($strSql); while ($ar = $rs->Fetch()) { if ($ar["VERSION"] == 2 && $ar["MULTIPLE"] == "N") { if (!array_key_exists($ELEMENT_ID, $arElements)) { $strSql = "\n\t\t\t\t\t\t\tSELECT *\n\t\t\t\t\t\t\tFROM b_iblock_element_prop_s" . $ar["IBLOCK_ID"] . "\n\t\t\t\t\t\t\tWHERE IBLOCK_ELEMENT_ID = " . $ELEMENT_ID . "\n\t\t\t\t\t\t"; $rs2 = $DB->Query($strSql); $arElements[$ELEMENT_ID] = $rs2->Fetch(); } if (!isset($arFilter["EMPTY"]) || $arFilter["EMPTY"] == "Y" || strlen($arElements[$ELEMENT_ID]["PROPERTY_" . $ar["ID"]]) > 0) { $val = $arElements[$ELEMENT_ID]["PROPERTY_" . $ar["ID"]]; $ar["PROPERTY_VALUE_ID"] = $ELEMENT_ID . ":" . $ar["ID"]; if ($ar["PROPERTY_TYPE"] == "L" && intval($val) > 0) { $arEnum = CIBlockPropertyEnum::GetByID($val); if ($arEnum !== false) { $ar["VALUE_ENUM"] = $arEnum["VALUE"]; $ar["VALUE_XML_ID"] = $arEnum["XML_ID"]; $ar["VALUE_SORT"] = $arEnum["SORT"]; } } else { $ar["VALUE_ENUM"] = ""; } if ($ar["PROPERTY_TYPE"] == "N" && strlen($val) > 0) { $val = CIBlock::NumberFormat($val); } $ar["DESCRIPTION"] = $arElements[$ELEMENT_ID]["DESCRIPTION_" . $ar["ID"]]; $ar["VALUE"] = $val; } else { continue; } } if ($arFilter["EMPTY"] == "N" && $ar["PROPERTY_VALUE_ID"] == "") { continue; } $result[] = $ar; } $rs = new CIBlockPropertyResult(); $rs->InitFromArray($result); } else { $rs = new CIBlockPropertyResult($DB->Query($strSql)); } return $rs; }
function Fetch() { global $DB; if (isset($this->lastRes)) { $res = $this->lastRes; $this->lastRes = null; } else { $res = parent::Fetch(); } if ($res && $res["USER_TYPE"] != "") { $arUserType = CIBlockProperty::GetUserType($res["USER_TYPE"]); if (isset($arUserType["ConvertFromDB"])) { if (array_key_exists("VALUE", $res)) { $value = array("VALUE" => $res["VALUE"], "DESCRIPTION" => ""); $value = call_user_func_array($arUserType["ConvertFromDB"], array($res, $value)); $res["VALUE"] = $value["VALUE"]; } if (array_key_exists("DEFAULT_VALUE", $res)) { $value = array("VALUE" => $res["DEFAULT_VALUE"], "DESCRIPTION" => ""); $value = call_user_func_array($arUserType["ConvertFromDB"], array($res, $value)); $res["DEFAULT_VALUE"] = $value["VALUE"]; } } if (strlen($res["USER_TYPE_SETTINGS"])) { $res["USER_TYPE_SETTINGS"] = unserialize($res["USER_TYPE_SETTINGS"]); } } if ($res && !empty($this->arProperties)) { $this->initPropertiesValues($res["IBLOCK_ELEMENT_ID"]); if ($this->VERSION == 2) { $arUpdate = array(); foreach ($this->arProperties as $arProp) { $field_name = "PROPERTY_" . $arProp["ID"]; if ($arProp["MULTIPLE"] == "Y") { $descr_name = "DESCRIPTION_" . $arProp["ID"]; $value_id_name = "PROPERTY_VALUE_ID_" . $arProp["ID"]; if (is_object($res[$field_name])) { $res[$field_name] = $res[$field_name]->load(); } $update = false; if (strlen($res[$field_name]) <= 0) { $update = true; } else { $tmp = unserialize($res[$field_name]); if (!isset($tmp['ID'])) { $update = true; } } if ($update) { $strSql = "\n\t\t\t\t\t\t\t\tSELECT ID, VALUE, DESCRIPTION\n\t\t\t\t\t\t\t\tFROM b_iblock_element_prop_m" . $arProp["IBLOCK_ID"] . "\n\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\tIBLOCK_ELEMENT_ID = " . (int) $res["IBLOCK_ELEMENT_ID"] . "\n\t\t\t\t\t\t\t\t\tAND IBLOCK_PROPERTY_ID = " . (int) $arProp["ID"] . "\n\t\t\t\t\t\t\t\tORDER BY ID\n\t\t\t\t\t\t\t"; $rs = $DB->Query($strSql); $res[$field_name] = array(); $res[$descr_name] = array(); $res[$value_id_name] = array(); while ($ar = $rs->Fetch()) { $res[$field_name][] = $ar["VALUE"]; $res[$descr_name][] = $ar["DESCRIPTION"]; $res[$value_id_name][] = $ar['ID']; } $arUpdate["b_iblock_element_prop_s" . $arProp["IBLOCK_ID"]]["PROPERTY_" . $arProp["ID"]] = serialize(array("VALUE" => $res[$field_name], "DESCRIPTION" => $res[$descr_name], "ID" => $res[$value_id_name])); } else { $res[$field_name] = $tmp["VALUE"]; $res[$descr_name] = $tmp["DESCRIPTION"]; $res[$value_id_name] = $tmp["ID"]; } if ($this->extMode) { foreach ($res[$field_name] as $field_key => $VALUE) { $this->addPropertyValue($arProp["ID"], $VALUE); $this->addPropertyData($arProp["ID"], $res[$value_id_name][$field_key], $res[$descr_name][$field_key]); } } else { foreach ($res[$field_name] as $VALUE) { $this->addPropertyValue($arProp["ID"], $VALUE); } } } else { if ($res[$field_name] != "") { if ($this->extMode && $arProp["PROPERTY_TYPE"] == PropertyTable::TYPE_NUMBER) { $res[$field_name] = CIBlock::NumberFormat($res[$field_name]); } $this->addPropertyValue($arProp["ID"], $res[$field_name]); } if ($this->extMode) { $this->addPropertyData($arProp["ID"], $res["IBLOCK_ELEMENT_ID"] . ':' . $arProp["ID"], $res["DESCRIPTION_" . $arProp["ID"]]); } } } foreach ($arUpdate as $strTable => $arFields) { $strUpdate = $DB->PrepareUpdate($strTable, $arFields); if ($strUpdate != "") { $strSql = "UPDATE " . $strTable . " SET " . $strUpdate . " WHERE IBLOCK_ELEMENT_ID = " . intval($res["IBLOCK_ELEMENT_ID"]); $DB->QueryBind($strSql, $arFields); } } $res = $this->arPropertiesValues; if ($this->extMode) { $res['PROPERTY_VALUE_ID'] = $this->arPropertyValuesID; $res['DESCRIPTION'] = $this->arDescriptions; } } else { do { if (isset($this->arProperties[$res["IBLOCK_PROPERTY_ID"]])) { if ($this->arProperties[$res["IBLOCK_PROPERTY_ID"]]["PROPERTY_TYPE"] == "N" && !$this->extMode) { $this->addPropertyValue($res["IBLOCK_PROPERTY_ID"], $res["VALUE_NUM"]); } else { $this->addPropertyValue($res["IBLOCK_PROPERTY_ID"], $res["VALUE"]); } if ($this->extMode) { $this->addPropertyData($res["IBLOCK_PROPERTY_ID"], $res['PROPERTY_VALUE_ID'], $res['DESCRIPTION']); } } $res = parent::Fetch(); } while ($res && $res["IBLOCK_ELEMENT_ID"] == $this->arPropertiesValues["IBLOCK_ELEMENT_ID"]); $this->lastRes = $res; $res = $this->arPropertiesValues; $this->arPropertiesValues = array(); if ($this->extMode) { $res['PROPERTY_VALUE_ID'] = $this->arPropertyValuesID; $res['DESCRIPTION'] = $this->arDescriptions; $this->arPropertyValuesID = array(); $this->arDescriptions = array(); } } } return $res; }