Основы работы со свойствами

В этом посте я описал основные сложности, возникающие при работе с элементами, разделами и свойствами инфоблоков. Ну, и, естественно, решения этих сложностей.

Задача 1: достать значения всех свойств элемента, зная его ID
Бывает нужно, если у вас, например, есть массив айдишников элементов, и для каждого надо получить все свойства. Ну или сами можете придумать применение :)

<? $db_props = CIBlockElement::GetProperty(IBLOCK_ID, ELEMENT_ID, "sort", "asc", array());
$PROPS = array();
while($ar_props = $db_props->Fetch())
$PROPS[$ar_props['CODE']] = $ar_props['VALUE'];?>

Теперь символьный код свойства является ключом ассоциативного массива $PROPS, то есть, если вам нужно значение свойства с кодом price, то оно будет хранится в $PROPS['price'].

Задача 2: вытащить свойства элементов, используя метод CIBlockElement::GetList

<? $arSelect = array("ID", "NAME", "PROPERTY_prop_code_1", "PROPERTY_prop_code_2");
$res = CIBlockElement::GetList(array(), array(), false, array(), $arSelect);?>

Ну дальше цикл. И свойства с символьными кодами prop_code_1 и prop_code_2 у вас в руках.

Задача 3: забить свойство типа TEXT/html для элемента
Не нашёл этого в документации, однако, операция это довольно частая.
Если свойство не множественное:

<? $element = new CIBlockElement;
$PROP = array();
$PROP['символьный код свойства']['VALUE']['TYPE'] = 'text'; // или html
$PROP['символьный код свойства']['VALUE']['TEXT'] = 'значение, которое нужно забить'; 
$arLoadArray = array(
  "IBLOCK_ID"      => IBLOCK_ID,
  "PROPERTY_VALUES"=> $PROP,
  "NAME"           => "Название элемента"
  );
$element->Add($arLoadArray);?>

Если свойство множественное, то получится на пару строк больше:

<? // В $ITEMS хранятся значения множественного свойства, которое нужно забить
foreach($ITEMS as $item)
{
	$VALUES[]['VALUE']['TYPE']= 'text'; // или html 
	$VALUES[]['VALUE']['TEXT']= $item;
}
$element = new CIBlockElement;
$PROPS = array();
$PROPS['символьный код свойства'] = $VALUES;
$arLoadArray = array(
  "IBLOCK_ID"      => IBLOCK_ID,
  "PROPERTY_VALUES"=> $PROPS,
  "NAME"           => "Название элемента"
  );
$element->Add($arLoadArray);?>

Задача 4: забить множественное свойство типа «Файл»

Довольно часто при добавлении элемента в инфоблок может понадобиться привязать к нему несколько файлов. Для этого удобно создать у инфоблока множественное свойство типа «Файл» и хранить файлы в нём. Пример заполнения свойства:

<?
$arFiles = array();
for($i = 1; $i < 10; $i++)
{
	if(file_exists($_SERVER['DOCUMENT_ROOT'].'/images/image_'.$i.'.jpg')) 
	{
		$arFiles[] = array('VALUE' => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"].'/images/image_'.$i.'.jpg'), 'DESCRIPTION' => '');
	}
}
?>

После этого массив $arFiles передается как значение свойства при добавлении элемента.

Задача 5: забить множественное свойство типа «Список» с отображением в виде флажков

В данном случае у каждого элемента списка значений есть свой ID. Посмотреть эти ID можно, зайдя в детальное редактирование свойства. Заполняется свойство следующим образом:

<?
if($first_condition == true) $values[] = array('VALUE' => 1); 
if($second_condition == true) $values[] = array('VALUE' => 2); 
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array('property_code' => $values));
?>

В данном случае при выполнении первого и второго условий мы отмечаем флажками элементы списка с ID =1 и ID=2 соответственно. Заменить следует $ELEMENT_ID, $IBLOCK_ID и property_code на нужные значения.

Задача 6: вытащить пользовательское свойство раздела

<? $section_props = CIBlockSection::GetList(array(), array('IBLOCK_ID' => IBLOCK_ID, 'ID' => SECTION_ID),	true, array("UF_ADDITIONAL_PRICE"));
$props_array = $section_props->GetNext(); ?>

// Теперь в $props_array['UF_ADDITIONAL_PRICE'] лежит значение свойства UF_ADDITIONAL_PRICE раздела инфоблока. Почему оно не доступно по обычному GeyById я не знаю.

Дата: 29 ноября 2009
Теги: инфоблоки, элементы, свойства
Добавить в закладки:

Комментарии (8)

ALELO, 10 Февраля 2010

Хулюганы !!! За статью спасибо! Весьма полезно. Второй пункт если можно больше расписать. не совсем понятно как использовать полученные переменные.
Хулюганы !!! За статью спасибо! Весьма полезно. Второй пункт если можно больше расписать. не совсем понятно как использовать полученные переменные.

Александр Живетьев
Александр Живетьев, 10 Февраля 2010

ALELO, посмотрите в документации метод CIBlockElement::GetList(). Всё то же самое, поэтому, я думаю, нет смысла копировать
ALELO, посмотрите в документации метод CIBlockElement::GetList(). Всё то же самое, поэтому, я думаю, нет смысла копировать

Николай, 15 Ноября 2010

Здравствуйте, Александр. Подскажите пожалуйста по такому вопросу. Нужно проставить в каталоге в title страницы название модели товара. Это свойство элемента инфоблока. var_dump($options), где $options = CIBlockElement::GetProperty(12, 6038, "sort", "asc", array()); не выдает никакой конкретики.
Здравствуйте, Александр. Подскажите пожалуйста по такому вопросу. Нужно проставить в каталоге в title страницы название модели товара. Это свойство элемента инфоблока. var_dump($options), где $options = CIBlockElement::GetProperty(12, 6038, "sort", "asc", array()); не выдает никакой конкретики.

Александр Живетьев
Александр Живетьев, 15 Ноября 2010

Здравствуйте, Николай. Вам нужен массив, а у вас пока $options - это объект. Попробуйте создать массив с помощью метода fetch (как в задаче 1 в этом посте).
Здравствуйте, Николай. Вам нужен массив, а у вас пока $options - это объект. Попробуйте создать массив с помощью метода fetch (как в задаче 1 в этом посте).

Александр Живетьев
Александр Живетьев, 15 Ноября 2010

Это уже зависит от реализации. Если вы используете какой-то встроенный компонент, то id элемента, как правило, всегда есть в массие $RESULT (попробуйте распечатать этот массив в шаблоне компонента).
Это уже зависит от реализации. Если вы используете какой-то встроенный компонент, то id элемента, как правило, всегда есть в массие $RESULT (попробуйте распечатать этот массив в шаблоне компонента).

Александр, 4 Июля 2011

Спасибо!!!
Спасибо!!!

Артур, 16 Февраля 2012

Спасибо, второй пример (Задача 2) помог решить задачу с получением свойств элемента.
Спасибо, второй пример (Задача 2) помог решить задачу с получением свойств элемента.

аноним, 23 Мая 2012

А зачем создавать экземпляр класса - $element = new CIBlockElement; тем самым инициализируя весь класс, если нам нужен только один метод, который по сути является статичным?
А зачем создавать экземпляр класса - $element = new CIBlockElement; тем самым инициализируя весь класс, если нам нужен только один метод, который по сути является статичным?


Администратор запретил оставлять комментарии