В процессе разработки довольно часто приходится программно обновлять значения свойств элементов инфоблока. Под катом небольшая шпаргалка по api-функциям для решения этой задачи и форматам передаваемых в них данных.

Api-функции

Обновлять свойства можно с помощью 4 функций:
CIBlockElement::Update — обновление полей и свойств элемента
CIBlockElement::SetPropertyValueCode — обновление одного свойства
CIBlockElement::SetPropertyValues — обновление одного или всех свойств
CIBlockElement::SetPropertyValuesEx — обновление произвольного количества свойств элемента

Для большинства случаев самой удобной является функция SetPropertyValuesEx. Именно ее я и буду использовать в качестве примера, описывая формат $value для одиночных, множественных и свойств с описанием.

CIBlockElement::SetPropertyValuesEx($elementID, $iblockID, array($PROPERTY_CODE => $value));

Строка, привязка к файлу на сервере

Для свойства «Привязка к файлу на сервере» в качестве значения передается путь от корня сайта, существование файла не проверяется.

$value = "Строка";
$value = array("Строка", "Строка 2");
$value = array(
                array("VALUE"=>"Строка", "DESCRIPTION"=>"Описание строки"),
                array("VALUE"=>"Строка 2", "DESCRIPTION"=>"Описание строки 2")
            );

Число, привязка к элементам, привязка к разделам, привязка к пользователю

При обновлении свойства типа «Число» не проверяется значение и записать можно любую строку. Для остальных типов передается id соответсвующего объекта и проверяется его существование.

$value = 1;
$value = array(1, 2);
$value = array(
                array("VALUE"=>1, "DESCRIPTION"=>"Описание"),
                array("VALUE"=>2, "DESCRIPTION"=>"Описание 2")
            );

Список

В качестве значения необходимо передавать id варианта списка. Корректность данных проверяется, если не установлен параметр DoNotValidateLists при вызове функции.

$value = 1;
$value = array(1, 2);

Дата

Дату нужно передавать в формате «dd.mm.yyyy hh:mm:ss». Валидации данных нет и запишется любая строка, но при попытке сохранить элемент через админку произойдет ошибка «Неверный формат Даты/Времени».

$value = "01.01.2013 00:00:01";
$value = array("01.01.2013 00:00:01", "31.12.2013 23:59:59");
$value = array(
                array("VALUE"=>"01.01.2013 00:00:01", "DESCRIPTION"=>"Описание"),
                array("VALUE"=>"31.12.2013 23:59:59", "DESCRIPTION"=>"Описание 2")
            );

HTML\text

В массиве обязательно должен содержаться элемент с ключом «TYPE» и значением html\text.

$value = array('VALUE'=>array('TYPE'=>'html', 'TEXT'=>"Строка"));
$value = array(
                array('VALUE'=>array('TYPE'=>'text', 'TEXT'=>"Строка")),
                array('VALUE'=>array('TYPE'=>'text', 'TEXT'=>"Строка 2"))
            );
$value = array(
                array('VALUE'=>array('TYPE'=>'text', 'TEXT'=>"Строка"), "DESCRIPTION"=>"Описание строки"),
                array('VALUE'=>array('TYPE'=>'text', 'TEXT'=>"Строка 2"), "DESCRIPTION"=>"Описание строки 2")
            );

Файл

При множественном значении нужно заполнять DESCRIPTION, в случае одиночного можно не передавать.

$value = array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/upload/file.avi"));
$value = array(
                array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/upload/file.avi"),"DESCRIPTION"=>"Описание файла"),
                array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/upload/file.flv"),"DESCRIPTION"=>"Описание файла 2"),
            );

Привязка к карте Google Maps, привязка к Яндекс.Карте

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

$value = "55.7539022426,37.6208299398";
$value = array("55.7539022426,37.6208299398", "55.7638691089,37.592124939");
$value = array(
                array("VALUE"=>"55.7539022426,37.6208299398", "DESCRIPTION"=>"Описание точки"),
                array("VALUE"=>"55.7638691089,37.592124939", "DESCRIPTION"=>"Описание точки 2")
            );

Видео

По состоянию на 14.04.2013 с последними бета-обновлениями функция SetPropertyValuesEx не обновляет свойства этого типа из-за ошибки в ядре. Используйте SetPropertyValues.

$value = array(
        "VALUE" => array(
                "PATH" => "/upload/file.flv",
                "WIDTH" => 400,
                "HEIGHT" => 300,
                "TITLE" => "Заголовок видео",
                "DURATION" => "00:30",
                "AUTHOR" => "Автор видео",
                "DATE" => "01.02.2011",
                "DESC" => "Описание видео"
            )
        );

Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!

Подписаться в telegram

2 комментария “Обновление свойств инфоблока

  1. Londeren

    Для множественного поля типа Файл без описания:

    $ELEMENT[‘MORE_PHOTO’] = array(
    CFile::MakeFileArray(…);
    );

    То есть не надо VALUE писать

  2. иван

    лажа, код не работает, зачем ты в переменной value пишешь каждый раз новые значения ? =))

Добавить комментарий

Ваш адрес email не будет опубликован.