update
\Bitrix\Main\ORM\Data\UpdateResult public static \Bitrix\Iblock\IblockTable::update( mixed $primary, array $data );
Изменяет поля записи инфоблока в таблице b_iblock через ORM. Статический метод. Унаследован от \Bitrix\Main\ORM\Data\DataManager.
Для изменения настроек действующего инфоблока используйте \CIBlock::Update. ORM-метод не синхронизирует связанные данные: например, изменение LID не обновит привязки к сайтам, а изменение VERSION не преобразует хранение свойств.
Параметры
| Параметр | Описание |
|---|---|
$primary |
Идентификатор инфоблока либо массив ['ID' => идентификатор]. Параметр обязателен |
$data |
Массив имя поля => значение из карты IblockTable. Также допустима обертка ['fields' => массив полей, 'auth_context' => объект контекста]; auth_context — необязательный объект \Bitrix\Main\Authentication\Context. Передавайте только изменяемые поля; остальные сохраняют прежние значения, кроме автоматически обновляемого TIMESTAMP_X |
Например, NAME задает название инфоблока, ACTIVE — активность (Y или N), SORT — индекс сортировки. Для переданных полей действуют валидаторы карты: длина NAME — до 255 символов, CODE и IBLOCK_TYPE_ID — до 50. Переданное обязательное поле не может быть пустым.
Полный состав полей описан в getMap. Связи TYPE и PROPERTIES не являются скалярными столбцами таблицы.
Возвращаемое значение
Объект \Bitrix\Main\ORM\Data\UpdateResult. Проверяйте isSuccess(); сообщения об ошибках доступны через getErrorMessages(). После SQL-обновления getAffectedRowsCount() возвращает число затронутых строк по данным драйвера базы.
Успешный результат не подтверждает, что инфоблок с таким идентификатором существовал: метод не выполняет отдельную проверку наличия записи. При необходимости получите ее до обновления.
Особенности
Метод вызывает события ORM OnBeforeUpdate, OnUpdate и OnAfterUpdate. Обработчик IblockTable::onBeforeUpdate подставляет текущую дату в TIMESTAMP_X, если поле отсутствует или равно null. Поэтому даже пустой массив $data при стандартных обработчиках обновляет дату изменения.
Первичный ключ ID не изменяется через $data. После обновления метод и обработчик onAfterUpdate очищают кеш.
ORM-метод не выполняет действия \CIBlock::Update для связанных настроек. Используйте классический API, если меняете настройки сайта, права или режим хранения свойств.
Исключения
Ошибки настройки ORM, формата данных и выполнения SQL могут привести к исключению. Ошибки проверки полей и отмена операции обработчиком ORM возвращаются в объекте результата. Проверяйте isSuccess() и обрабатывайте исключения отдельно.
Некорректный первичный ключ, например пустой массив или неизвестное имя ключа, вызывает \Bitrix\Main\ArgumentException.
Пример
Пример показывает \CIBlock::Update: создает тестовый инфоблок через классический API, изменяет его название и сортировку, затем удаляет его.
<?php
use Bitrix\Iblock\TypeTable;
use Bitrix\Main\Loader;
use Bitrix\Main\SiteTable;
$iblockId = null;
try
{
if (!Loader::includeModule('iblock'))
{
echo 'Не удалось подключить модуль iblock';
return;
}
$type = TypeTable::getRow(['select' => ['ID'], 'order' => ['ID' => 'ASC']]);
$site = SiteTable::getRow(['select' => ['LID'], 'order' => ['LID' => 'ASC']]);
if ($type === null || $site === null)
{
echo 'Для примера нужны существующий тип инфоблоков и сайт';
return;
}
$iblock = new \CIBlock();
$apiCode = uniqid('DocsExample', false);
$newId = $iblock->Add([
'IBLOCK_TYPE_ID' => $type['ID'],
'SITE_ID' => [$site['LID']],
'NAME' => 'Тестовый инфоблок',
'API_CODE' => $apiCode,
'ACTIVE' => 'N',
]);
if (!$newId)
{
echo htmlspecialchars($iblock->LAST_ERROR, ENT_QUOTES, 'UTF-8');
return;
}
$iblockId = (int)$newId;
$updated = $iblock->Update($iblockId, [
'NAME' => 'Обновленный тестовый инфоблок',
'SORT' => 100,
]);
if (!$updated)
{
echo 'Не удалось обновить инфоблок: ';
echo htmlspecialchars($iblock->LAST_ERROR, ENT_QUOTES, 'UTF-8');
return;
}
echo 'Обновлен инфоблок: ' . $iblockId;
}
catch (\Throwable $exception)
{
echo 'Ошибка: ' . htmlspecialchars($exception->getMessage(), ENT_QUOTES, 'UTF-8');
}
finally
{
if ($iblockId !== null && !\CIBlock::Delete($iblockId))
{
echo 'Не удалось удалить тестовый инфоблок: ' . $iblockId;
}
}