Документация для разработчиков

SetPropertyValuesEx

CIBlockElement::SetPropertyValuesEx(
int ELEMENT_ID,
int IBLOCK_ID,
array PROPERTY_VALUES,
array FLAGS = array()
);
Метод сохраняет значения всех свойств элемента информационного блока. В отличие от SetPropertyValues может не содержать полный набор значений. Значения свойств, неуказанных в массиве PROPERTY_VALUES, будут сохранены. Этот метод более экономен в количестве запросов к БД. Метод статический.
Метод возвращает Null.

Если необходимо сохранить пустое значение для множественного свойства, то используйте значение false, так как просто пустой массив не сохранится.

Параметры вызова

ПараметрОписание
ELEMENT_ID Код элемента, значения свойств которого необходимо установить.
IBLOCK_ID Код информационного блока. Может быть не указан. В этом случае будет прочитан из базы данных по коду элемента.
PROPERTY_VALUES Массив значений свойств, в котором коду свойства ставится в соответствие значение свойства.
Должен быть вида Array("код свойства1"=>"значения свойства1", ....), где "код свойства" - числовой или символьный код свойства, "значения свойства" - одно или массив всех значений свойства (множественное).

Примечания:
  • При добавлении значений свойств типа "Файл" поле DESCRIPTION обязательно.
  • Если передаётся массив "свойство"=>"значение", то в качестве значения свойств типа "справочник" нужно указывать внешний код элемента справочника.

  • Для свойства типа Список следует передавать идентификатор значения свойства, а не значение.
FLAGS Необязательный параметр предоставляет информацию для оптимизации выполнения. Может содержать следующие ключи:
  • NewElement - можно указать если заведомо известно, что значений свойств у данного элемента нет. Экономит один запрос к БД.
  • DoNotValidateLists - для свойств типа "список" отключает проверку наличия значений в метаданных свойства.

См. также

Примеры использования

Пример 1:

<?
$ELEMENT_ID = 18; // код элемента
$PROPERTY_CODE = "PROP1"; // код свойства
$PROPERTY_VALUE = "Синий"; // значение свойства

// Установим новое значение для данного свойства данного элемента
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array($PROPERTY_CODE => $PROPERTY_VALUE));

?>

Пример 2 (изменение немножественного свойства типа HTML/Text):

$el_id = 125;
$iblock_id = 45;
$prop[$prop_code] = array('VALUE'=>array('TYPE'=>'HTML', 'TEXT'=>$prop_value));
CIBlockElement::SetPropertyValuesEx($el_id, $iblock_id, $prop);

Пример 3:

<input name="MyFile1" type="file" />
<input name="MyFile2" type="file" />

function makeCurentFilesArray($InputFileCode) {
   unset($arFiles, $TMPFILE);
   $arFiles = array();  // Массив всех файлов в свойстве []
   $TMPFILE = array(); // Временный массив для текщего файла
   if(is_array($_FILES[$InputFileCode])) {
      foreach($_FILES[$InputFileCode]['tmp_name'] as $key => $val) {
         if(file_exists($val)) { 
            foreach($_FILES[$InputFileCode] as $namekey => $nameval) {
               $TMPFILE[$namekey] = $nameval[$key];
            }
         $arFiles[] = array('VALUE' => $TMPFILE, 'DESCRIPTION' => $TMPFILE['name']); 
         }
      } 
   } 
   return $arFiles;
}

if (!empty($_FILES['MyFile1'])) $PropFileArr['MyFile1'] = makeCurentFilesArray('MyFile1');   
if (!empty($_FILES['MyFile2'])) $PropFileArr['MyFile2'] = makeCurentFilesArray('MyFile2');
                       
CIBlockElement::SetPropertyValuesEx($Element_ID, $IBlock_ID, $PropFileArr); // Обновляем массив свойств типа файл

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
6
Адель Юсупов
При файсетном индексе необходимо вызвать после вызова CIBlockElement::SetPropertyValuesEx
Код
\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex(инфоблок, элемент);
5
karpulix
Свойство должно быть активным, иначе изменить его не получится.
Это конечно может кому-то показаться логичным, но не всегда явным.
0
Александр Аваков
Стоит быть внимательным с регистром кодов свойств!
Хоть в битриксе и принято заводить свойства только в UPPERCASE, возможность создать свойство в camelCase тоже присутствует.
Если мы используем метод GetList, то регистр будет игнорироваться.
При работе с этим методом, регистр не игнорируется.

Код
// Здесь регистр игнорируется 
CIBlockElement::GetList([], ['PROPERTY_ORDERID' => 10], false, false, ['ID']); 
// А здесь нет 
CIBlockElement::SetPropertyValuesEx(5996, 9, [ 
    'orderID' => 123 
]);
7
xolegator
Установить значение свойства типа Справочник (highload блок)

Код
CIBlockElement::SetPropertyValuesEx(
    $elementId,
    $blockId,
    array('LINK_TO_MY_HIGHLOAD_BLOCK' => $newValue['UF_XML_ID'])
);
LINK_TO_MY_HIGHLOAD_BLOCK - код свойства элемента инфоблока типа Справочник. Значение $newValue['UF_XML_ID'] должно возвращать значение 'UF_XML_ID' одного из элементов highload блока, которое требуется установить свойству элемента инфоблока.
6
Хайк Минасян
Если нужно обновить значения во вкладе СЕО в форме редактирования элемента
Код
$arFields = Array(
   "ELEMENT_META_TITLE" => "Заголовок страницы",
   "ELEMENT_META_DESCRIPTION" => "Описание страницы",
   "ELEMENT_META_KEYWORDS" => "Ключевики",
);
$ipropTemplates = new \Bitrix\Iblock\InheritedProperty\ElementTemplates($IBLOCK_ID, $ID);
$ipropTemplates->set($arFields);
2
Родион Абдурахимов
Код
$PROPERTY_VALUE = array(
  0 => array("VALUE"=>"значение","DESCRIPTION"=>"описание значения"),
  1 => array("VALUE"=>"значение2","DESCRIPTION"=>"описание значения2") 
);
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array($PROPERTY_CODE => $PROPERTY_VALUE));
При добавлении множественного свойства с полем описания важно сохранять порядок ключей VALUE и DESCRIPTION.
Если в строке
Код
0 => array("VALUE"=>"значение","DESCRIPTION"=>"описание значения"),
поменять местами VALUE и DESCRIPTION - добавление свойства не произойдет
1
Дмитрий Ипатов
Для того чтобы записать множественное свойство привязка к разделом нужно передать массив с айди разделов, пример:

Код
$section_list = array();

while ($arOtrasliItem = $rsOtrasliItem->Fetch())                  
{                  
   $db_sec = CIBlockSection::GetList(array(), 
      array(
         "IBLOCK_ID" => IBLOCK_OTRASLI,
         "XML_ID" => $arOtrasliItem['VALUE']
      ),
      false,
      array('IBLOCK_ID', 'ID')
   );      

   if($ar_sec = $db_sec->Fetch())
      $section_list[] = $ar_sec['ID'];                                       
}

if(!empty($section_list))
{
   $props['OTRASLI'] = $section_list;               
   CIBlockElement::SetPropertyValuesEx($elid, IBLOCK_CATALOG, $props);               
}
© «Битрикс», 2001-2018, «1С-Битрикс», 2018
Наверх