/** * <p>Метод изменяет параметры свойства с кодом <i>ID</i>. Перед изменением параметров вызываются обработчики события <a href="http://dev.1c-bitrix.ru/api_help/iblock/events/onbeforeiblockpropertyupdate.php">OnBeforeIBlockPropertyUpdate</a> из которых можно отменить изменения или переопределить поля. А после изменения параметром вызывается событие <a href="http://dev.1c-bitrix.ru/api_help/iblock/events/onafteriblockpropertyupdate.php">OnAfterIBlockPropertyUpdate</a>. Метод динамичный.</p> * * * @param int $ID ID изменяемой записи. </htm * * @param array $arFields Массив Array("поле"=>"значение", ...). Содержит значения <a * href="http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fproperty">всех полей</a> изменяемого * свойства. Кроме того, с помощью поля "VALUES", значением которого * должен быть массив вида Array(Array("VALUE"=>"значение", "DEF"=>"по * умолчанию (Y/N)", "SORT"=>"индекс сортировки"),...), можно установить * варианты выбора для свойств типа "список" (подробнее смотрите * метод <a href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/index.php">CIBlockProperty</a>::<a * href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/updateenum.php">UpdateEnum()</a>). * * @return bool * * <h4>Example</h4> * <pre> * <?<br>$arFields = Array(<br> "NAME" => "Цвет",<br> "ACTIVE" => "Y",<br> "SORT" => "100",<br> "CODE" => "color",<br> "PROPERTY_TYPE" => "L",<br> "IBLOCK_ID" => 11<br> );<br><br>$arFields["VALUES"][0] = Array(<br> "VALUE" => "Красный",<br> "DEF" => "N",<br> "SORT" => "100"<br>}<br><br>$arFields["VALUES"][1] = Array(<br> "VALUE" => "Желтый",<br> "DEF" => "N",<br> "SORT" => "200"<br>}<br><br>$arFields["VALUES"][2] = Array(<br> "VALUE" => "Зеленый",<br> "DEF" => "Y",<br> "SORT" => "300"<br>}<br><br>$ibp = new CIBlockProperty;<br>if(!$ibp->Update($ID, $arFields))<br> echo $ibp->LAST_ERROR;<br>? * * В случае обновления информации в пользовательском типе свойства для сохранения ключа USER_TYPE_SETTINGS необходимо указать еще ключ USER_TYPE с реальным значением. В противном случае ключ USER_TYPE_SETTINGS не обновится. Неверными будут следующие варианты: * * * $arFields = array( * 'PROPERTY_TYPE' => 'E', * 'USER_TYPE_SETTINGS' => array( * 'WIDTH' => '10', * 'HEIGHT' => '10', * ), * ); * $ibp = new CIBlockProperty(); * $ibp->Update($ID, $arFields)); * * $arFields = array( * 'PROPERTY_TYPE' => 'E', * 'USER_TYPE_SETTINGS' => array( * 'WIDTH' => '10', * 'HEIGHT' => '10', * ), * 'USER_TYPE' => '', * ); * $ibp = new CIBlockProperty(); * $ibp->Update($ID, $arFields)); * * $arFields = array( * 'PROPERTY_TYPE' => 'E', * 'USER_TYPE_SETTINGS' => array( * 'WIDTH' => '10', * 'HEIGHT' => '10', * ), * 'USER_TYPE' => 'xxx' * ); * $ibp = new CIBlockProperty(); * $ibp->Update($ID, $arFields)); * * //включить индексацию свойства для поиска * $arFields = Array( * 'SEARCHABLE'=>'Y' * ); * $ibp = new CIBlockProperty; * if(!$ibp->Update($prop['ID'], $arFields)) * echo $ibp->LAST_ERROR; * * * * // добавление свойства в умный фильтр: * $arFields = Array('SMART_FILTER' => 'Y', 'IBLOCK_ID' => 123); * $ibp = new CIBlockProperty(); * if(!$ibp->Update($prop['ID'], $arFields)) * echo $ibp->LAST_ERROR; * * //IBLOCK_ID в arFields указывать обязательно, иначе свойство не будет включено в умный фильтр, и при этом не выдаст ошибки. * //Чтобы исключить свойство из умного фильтра в arFileds заменить: 'SMART_FILTER'=>'N' * </pre> * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/add.php">CIBlockProperty::Add</a> * </li> <li><a href="http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fproperty">Поля свойства</a></li> * <li><a * href="http://dev.1c-bitrix.ru/api_help/iblock/events/onbeforeiblockpropertyupdate.php">OnBeforeIBlockPropertyUpdate</a></li> * <li><a * href="http://dev.1c-bitrix.ru/api_help/iblock/events/onafteriblockpropertyupdate.php">OnAfterIBlockPropertyUpdate</a></li> * </ul> <br><p><b>Примечание:</b> если используются <b>Инфоблоки 2.0</b> и * изменяется базовый тип свойства, то все текущие значения свойств * у существующих элементов очищаются.</p> <br><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/update.php * @author Bitrix */ public function Update($ID, $arFields, $bCheckDescription = false) { global $DB; $ID = IntVal($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"]); $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; } } 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); } } global $BX_IBLOCK_PROP_CACHE; if (is_set($arFields, "IBLOCK_ID")) { unset($BX_IBLOCK_PROP_CACHE[$arFields["IBLOCK_ID"]]); } else { $BX_IBLOCK_PROP_CACHE = array(); } $Result = true; } $arFields["ID"] = $ID; $arFields["RESULT"] =& $Result; foreach (GetModuleEvents("iblock", "OnAfterIBlockPropertyUpdate", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } return $Result; }
isset($_POST["SECTION_PROPERTY"]) && is_array($_POST["SECTION_PROPERTY"]) && array_key_exists($p["ID"], $_POST["SECTION_PROPERTY"]) && $_POST["SECTION_PROPERTY"][$p["ID"]]["SHOW"] === "Y" ) CIBlockSectionPropertyLink::Add(0, $p["ID"], array( "SMART_FILTER" => $_POST["SECTION_PROPERTY"][$p["ID"]]["SMART_FILTER"], )); } if (is_array($arCatalog)) { $props = CIBlockProperty::GetList(array(), array("IBLOCK_ID" => $arCatalog["IBLOCK_ID"], "CHECK_PERMISSIONS" => "N")); while($p = $props->Fetch()) { CIBlockSectionPropertyLink::Delete(0, $p["ID"]); if( isset($_POST["SECTION_PROPERTY"]) && is_array($_POST["SECTION_PROPERTY"]) && array_key_exists($p["ID"], $_POST["SECTION_PROPERTY"]) && $_POST["SECTION_PROPERTY"][$p["ID"]]["SHOW"] === "Y" ) { CIBlockSectionPropertyLink::Add(0, $p["ID"], array( "SMART_FILTER" => $_POST["SECTION_PROPERTY"][$p["ID"]]["SMART_FILTER"], "IBLOCK_ID" => $IBLOCK_ID, )); } } }