/** * <p>Метод устанавливает значения перечислений свойства типа "список". Метод динамичный.</p> * * * @param int $ID Код свойства. * * @param array $arVALUES Массив всех значений в формате Array("код существующего * значения"=>"массив полей значения", ..., "массив полей нового * значения", ...). Где массив полей имеет вид: Array("VALUE"=>"значение"[, * "SORT"=>"порядок сортировки"][, "DEF"=>"является значением по * умолчанию (Y|N)"][, "XML_ID"=>"внешний код"]). * * @param bool $bForceDelete = true Если принимает значение <i>true</i>, то удаляются варианты значений, у * которых <i>VALUE</i> пустой. Значение <i>false</i> позволяет сохранить * значения, использованные хотя бы у одного элемента. * Необязательный параметр. * * @return mixed * * <h4>Example</h4> * <pre> * <? * $cnt = 0;<br>$ar_all_values = Array();<br>$db_enum_list = CIBlockProperty::GetPropertyEnum($PROP_ID, Array('SORT'=>'ASC'));<br>while($ar_enum = $db_enum_list->Fetch())<br>{<br> $cnt++;<br> $ar_all_values[$ar_enum['ID']] = Array('SORT'=>$cnt, 'VALUE'=>$ar_enum['VALUE']);<br>}<br>$CIBlockProp = new CIBlockProperty; * $CIBlockProp->UpdateEnum($PROP_ID, $ar_all_values); ?> * </pre> * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fiblockpropertyenum">Поля значений * свойства типа "список</a><a * href="http://dev.1c-bitrix.ru/api_help/main/reference/ceventmessage/index.php#flds">" </a> </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockpropertyenum/index.php">CIBlockPropetyEnum</a>::<a * href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockpropertyenum/update.php">Update()</a> </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockpropertyenum/index.php">CIBlockPropetyEnum</a>::<a * href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockpropertyenum/add.php">Add()</a> </li> </ul> <a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/updateenum.php * @author Bitrix */ public 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[$res["XML_ID"]] = $res["ID"]; } $sqlWhere = ""; if (!$bForceDelete) { $rsProp = CIBlockProperty::GetByID($ID); if ($arProp = $rsProp->Fetch()) { if ($arProp["VERSION"] == 1) { $sqlWhere = "AND NOT EXISTS (\n\t\t\t\t\t\tSELECT *\n\t\t\t\t\t\tFROM b_iblock_element_property\n\t\t\t\t\t\tWHERE b_iblock_element_property.IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID\n\t\t\t\t\t\tAND b_iblock_element_property.VALUE_ENUM = b_iblock_property_enum.ID\n\t\t\t\t\t)"; } elseif ($arProp["MULTIPLE"] == "N") { $sqlWhere = "AND NOT EXISTS (\n\t\t\t\t\t\tSELECT *\n\t\t\t\t\t\tFROM b_iblock_element_prop_s" . $arProp["IBLOCK_ID"] . "\n\t\t\t\t\t\tWHERE b_iblock_element_prop_s" . $arProp["IBLOCK_ID"] . ".PROPERTY_" . $arProp["ID"] . " = b_iblock_property_enum.ID\n\t\t\t\t\t)"; } else { $sqlWhere = "AND NOT EXISTS (\n\t\t\t\t\t\tSELECT *\n\t\t\t\t\t\tFROM b_iblock_element_prop_m" . $arProp["IBLOCK_ID"] . "\n\t\t\t\t\t\tWHERE b_iblock_element_prop_m" . $arProp["IBLOCK_ID"] . ".IBLOCK_PROPERTY_ID = b_iblock_property_enum.PROPERTY_ID\n\t\t\t\t\t\tAND b_iblock_element_prop_m" . $arProp["IBLOCK_ID"] . ".VALUE_ENUM = b_iblock_property_enum.ID\n\t\t\t\t\t)"; } } } $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[$res["XML_ID"]]); $strSql = "\n\t\t\t\t\tDELETE FROM b_iblock_property_enum\n\t\t\t\t\tWHERE ID=" . $res["ID"] . "\n\t\t\t\t\t" . $sqlWhere . "\n\t\t\t\t"; $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($VALUE["XML_ID"], 0, 200); } elseif (array_key_exists("EXTERNAL_ID", $VALUE) && strlen($VALUE["EXTERNAL_ID"])) { $XML_ID = substr($VALUE["EXTERNAL_ID"], 0, 200); } } if ($XML_ID) { unset($ar_XML_ID[$res["XML_ID"]]); if (array_key_exists($XML_ID, $ar_XML_ID)) { $XML_ID = md5(uniqid("")); } $ar_XML_ID[$XML_ID] = $res["ID"]; } $strSql = "\n\t\t\t\t\tUPDATE b_iblock_property_enum\n\t\t\t\t\tSET\n\t\t\t\t\t\t" . ($DEF ? " DEF = '" . $DEF . "', " : "") . "\n\t\t\t\t\t\t" . ($SORT ? " SORT = " . $SORT . ", " : "") . "\n\t\t\t\t\t\t" . ($XML_ID ? " XML_ID = '" . $DB->ForSQL($XML_ID, 200) . "', " : "") . "\n\t\t\t\t\t\tVALUE = '" . $DB->ForSQL($VAL, 255) . "'\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tID = " . $res["ID"] . "\n\t\t\t\t"; $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($VALUE["XML_ID"], 0, 200); } elseif (array_key_exists("EXTERNAL_ID", $VALUE) && strlen($VALUE["EXTERNAL_ID"])) { $XML_ID = substr($VALUE["EXTERNAL_ID"], 0, 200); } } if ($XML_ID) { if (array_key_exists($XML_ID, $ar_XML_ID)) { $XML_ID = md5(uniqid("", true)); } $ar_XML_ID[$XML_ID] = 0; } else { $XML_ID = md5(uniqid("", true)); $ar_XML_ID[$XML_ID] = 0; } $strSql = "\n\t\t\t\t\tINSERT INTO b_iblock_property_enum\n\t\t\t\t\t(\n\t\t\t\t\t\tPROPERTY_ID\n\t\t\t\t\t\t" . ($DEF ? ",DEF" : "") . "\n\t\t\t\t\t\t" . ($SORT ? ",SORT" : "") . "\n\t\t\t\t\t\t,VALUE\n\t\t\t\t\t\t,XML_ID\n\t\t\t\t\t) VALUES (\n\t\t\t\t\t\t" . $ID . "\n\t\t\t\t\t\t" . ($DEF ? ",'" . $DEF . "'" : "") . "\n\t\t\t\t\t\t" . ($SORT ? "," . $SORT . "" : "") . "\n\t\t\t\t\t\t,'" . $DB->ForSQL($VAL, 255) . "'\n\t\t\t\t\t\t,'" . $DB->ForSQL($XML_ID, 200) . "'\n\t\t\t\t\t)\n\t\t\t\t"; $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; }