Пример #1
0
 /**
  * <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("поле"=&gt;"значение", ...). Содержит значения <a
  * href="http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fproperty">всех полей</a> изменяемого
  * свойства. Кроме того, с помощью поля "VALUES", значением которого
  * должен быть массив вида Array(Array("VALUE"=&gt;"значение", "DEF"=&gt;"по
  * умолчанию (Y/N)", "SORT"=&gt;"индекс сортировки"),...), можно установить
  * варианты выбора для свойств типа "список" (подробнее смотрите
  * метод <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>
  * &lt;?<br>$arFields = Array(<br>  "NAME" =&gt; "Цвет",<br>  "ACTIVE" =&gt; "Y",<br>  "SORT" =&gt; "100",<br>  "CODE" =&gt; "color",<br>  "PROPERTY_TYPE" =&gt; "L",<br>  "IBLOCK_ID" =&gt; 11<br>  );<br><br>$arFields["VALUES"][0] = Array(<br>  "VALUE" =&gt; "Красный",<br>  "DEF" =&gt; "N",<br>  "SORT" =&gt; "100"<br>}<br><br>$arFields["VALUES"][1] = Array(<br>  "VALUE" =&gt; "Желтый",<br>  "DEF" =&gt; "N",<br>  "SORT" =&gt; "200"<br>}<br><br>$arFields["VALUES"][2] = Array(<br>  "VALUE" =&gt; "Зеленый",<br>  "DEF" =&gt; "Y",<br>  "SORT" =&gt; "300"<br>}<br><br>$ibp = new CIBlockProperty;<br>if(!$ibp-&gt;Update($ID, $arFields))<br>	echo $ibp-&gt;LAST_ERROR;<br>?
  * 
  * В случае обновления информации в пользовательском типе свойства для сохранения ключа USER_TYPE_SETTINGS необходимо указать еще ключ USER_TYPE с реальным значением. В противном случае ключ USER_TYPE_SETTINGS не обновится. Неверными будут следующие варианты:
  * 
  * 
  * $arFields = array(
  *    'PROPERTY_TYPE' =&gt; 'E',
  *    'USER_TYPE_SETTINGS' =&gt; array(
  *       'WIDTH' =&gt; '10',
  *       'HEIGHT' =&gt; '10',
  *    ),
  * );
  * $ibp = new CIBlockProperty();
  * $ibp-&gt;Update($ID, $arFields));
  * 
  * $arFields = array(
  *    'PROPERTY_TYPE' =&gt; 'E',
  *    'USER_TYPE_SETTINGS' =&gt; array(
  *       'WIDTH' =&gt; '10',
  *       'HEIGHT' =&gt; '10',
  *    ),
  *    'USER_TYPE' =&gt; '',
  * );
  * $ibp = new CIBlockProperty();
  * $ibp-&gt;Update($ID, $arFields));
  * 
  * $arFields = array(
  *    'PROPERTY_TYPE' =&gt; 'E',
  *    'USER_TYPE_SETTINGS' =&gt; array(
  *       'WIDTH' =&gt; '10',
  *       'HEIGHT' =&gt; '10',
  *    ),
  *    'USER_TYPE' =&gt; 'xxx'
  * );
  * $ibp = new CIBlockProperty();
  * $ibp-&gt;Update($ID, $arFields));
  * 
  * //включить индексацию свойства для поиска
  *  $arFields = Array(
  *      'SEARCHABLE'=&gt;'Y'
  * );
  * $ibp = new CIBlockProperty;
  * if(!$ibp-&gt;Update($prop['ID'], $arFields))
  *      echo $ibp-&gt;LAST_ERROR;
  * 
  * 
  * 
  * // добавление свойства в умный фильтр: 
  * $arFields = Array('SMART_FILTER' =&gt; 'Y', 'IBLOCK_ID' =&gt; 123);
  * $ibp = new CIBlockProperty();
  * if(!$ibp-&gt;Update($prop['ID'], $arFields))
  * echo $ibp-&gt;LAST_ERROR; 
  * 
  * //IBLOCK_ID в arFields указывать обязательно, иначе свойство не будет включено в умный фильтр, и при этом не выдаст ошибки.
  * //Чтобы исключить свойство из умного фильтра в arFileds заменить:  'SMART_FILTER'=&gt;'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;
 }
Пример #2
0
				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,
					));
				}
			}
		}