CIBlockElement::SetPropertyValues в Битрикс — установка значений свойств элемента
Метод CIBlockElement::SetPropertyValues() используется для записи и обновления значений свойств элементов инфоблоков в 1С-Битрикс. С его помощью можно изменять текстовые свойства, списки, файлы, привязки к элементам и разделам, а также множественные свойства.
Краткий ответ
Для изменения свойства элемента необходимо вызвать метод CIBlockElement::SetPropertyValues(), передав ID элемента, ID инфоблока и массив значений свойств.
<?php
CIBlockElement::SetPropertyValues(
123,
5,
[
"PRICE" => 15000
]
);
Описание функции
Метод записывает значения свойств элемента инфоблока. Если свойство уже содержит данные, они будут заменены новыми значениями.
В отличие от метода CIBlockElement::Update(), который предназначен для изменения основных полей элемента, SetPropertyValues() работает исключительно со свойствами инфоблока.
Метод позволяет обновлять как одно свойство, так и сразу несколько свойств за один вызов.
При использовании метода необходимо учитывать, что если передается неполный набор множественных значений, остальные значения могут быть удалены.
Синтаксис
CIBlockElement::SetPropertyValues(
int $ELEMENT_ID,
int $IBLOCK_ID,
mixed $PROPERTY_VALUES,
string $PROPERTY_CODE = false
);
Параметры
| Параметр | Тип | Описание |
|---|---|---|
| $ELEMENT_ID | int | ID элемента инфоблока. |
| $IBLOCK_ID | int | ID инфоблока. |
| $PROPERTY_VALUES | mixed | Значение свойства или массив свойств. |
| $PROPERTY_CODE | string|false | Код конкретного свойства при обновлении одного значения. |
Пример использования
Изменение одного свойства
<?php
CIBlockElement::SetPropertyValues(
123,
5,
19990,
"PRICE"
);
Изменение нескольких свойств
<?php
CIBlockElement::SetPropertyValues(
123,
5,
[
"PRICE" => 19990,
"BRAND" => "Samsung",
"IN_STOCK" => "Y"
]
);
Запись множественного свойства
<?php
CIBlockElement::SetPropertyValues(
123,
5,
[
"TAGS" => [
"Битрикс",
"PHP",
"Разработка"
]
]
);
Обновление файлового свойства
<?php
CIBlockElement::SetPropertyValues(
123,
5,
[
"PHOTO" => CFile::MakeFileArray(
$_SERVER["DOCUMENT_ROOT"]."/upload/photo.jpg"
)
]
);
Установка привязки к элементу
<?php
CIBlockElement::SetPropertyValues(
123,
5,
[
"RELATED_PRODUCT" => 456
]
);
Типичные ошибки
Указан неверный ID инфоблока
CIBlockElement::SetPropertyValues(
123,
999,
[
"PRICE" => 1000
]
);
Если инфоблок указан неверно, свойства не будут сохранены.
Использование неверного кода свойства
[
"PRICE_TEST" => 1000
]
Код свойства должен точно совпадать с настройками инфоблока.
Потеря значений множественного свойства
[
"TAGS" => [
"Новое значение"
]
]
При таком обновлении старые значения будут удалены и заменены новым массивом.
Неправильная загрузка файлов
[
"PHOTO" => "/upload/image.jpg"
]
Для файловых свойств необходимо использовать CFile::MakeFileArray().
CIBlockElement::SetPropertyValuesEx
В современных проектах чаще используется метод CIBlockElement::SetPropertyValuesEx().
Он работает быстрее, обновляет только указанные свойства и не затрагивает остальные значения.
<?php
CIBlockElement::SetPropertyValuesEx(
123,
5,
[
"PRICE" => 19990
]
);
Для большинства новых разработок рекомендуется использовать именно SetPropertyValuesEx.
Аналог на D7
В ORM D7 свойства можно обновлять через сгенерированные классы инфоблоков.
<?php
use Bitrix\Iblock\Elements\ElementCatalogTable;
$result = ElementCatalogTable::update(
123,
[
"PRICE" => 19990,
"BRAND" => "Samsung"
]
);
if (!$result->isSuccess()) {
print_r(
$result->getErrorMessages()
);
}
Конкретная реализация зависит от структуры инфоблока и настроек ORM-классов.
FAQ
Что делает CIBlockElement::SetPropertyValues?
Метод записывает значения свойств элемента инфоблока.
Чем отличается SetPropertyValues от Update?
Update изменяет поля элемента, а SetPropertyValues работает только со свойствами инфоблока.
Можно ли обновить одно свойство?
Да, через параметр $PROPERTY_CODE.
CIBlockElement::SetPropertyValues(
123,
5,
1000,
"PRICE"
);
Что лучше использовать — SetPropertyValues или SetPropertyValuesEx?
Для новых проектов рекомендуется SetPropertyValuesEx, так как метод быстрее и безопаснее обновляет отдельные свойства.
Можно ли записывать файлы?
Да, через CFile::MakeFileArray().
Можно ли обновить несколько свойств одновременно?
Да, достаточно передать массив свойств и значений в третьем параметре метода.