Ejemplo n.º 1
0
 /**
  * <p>Метод устанавливает значения перечислений свойства типа "список". Метод динамичный.</p>
  *
  *
  * @param int $ID  Код свойства.
  *
  * @param array $arVALUES  Массив всех значений в формате Array("код существующего
  * значения"=&gt;"массив полей значения", ..., "массив полей нового
  * значения", ...). Где массив полей имеет вид: Array("VALUE"=&gt;"значение"[,
  * "SORT"=&gt;"порядок сортировки"][, "DEF"=&gt;"является значением по
  * умолчанию (Y|N)"][, "XML_ID"=&gt;"внешний код"]).
  *
  * @param bool $bForceDelete = true Если принимает значение <i>true</i>, то удаляются варианты значений, у
  * которых <i>VALUE</i> пустой. Значение <i>false</i> позволяет сохранить
  * значения, использованные хотя бы у одного элемента.
  * Необязательный параметр.
  *
  * @return mixed 
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * $cnt = 0;<br>$ar_all_values = Array();<br>$db_enum_list = CIBlockProperty::GetPropertyEnum($PROP_ID, Array('SORT'=&gt;'ASC'));<br>while($ar_enum = $db_enum_list-&gt;Fetch())<br>{<br>	$cnt++;<br>	$ar_all_values[$ar_enum['ID']] = Array('SORT'=&gt;$cnt, 'VALUE'=&gt;$ar_enum['VALUE']);<br>}<br>$CIBlockProp = new CIBlockProperty;
  * $CIBlockProp-&gt;UpdateEnum($PROP_ID, $ar_all_values); ?&gt;
  * </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;
 }