С помощью какого метода можно получить свойство элемента
Описание
CDBResult
CIBlockElement::GetProperty(
int iblock_id,
int element_id,
array arOrder = Array(),
array arFilter = Array()
);
Метод возвращает значения свойства для элемента element_id. Метод статический.
Смотрите также
- CDBResult
- Поля свойств
Параметры вызова
Параметр | Описание |
---|---|
iblock_id | Код инфоблока. |
element_id | Код элемента. |
arOrder | Массив вида Array(by1=>order1[, by2=>order2 [, ..]]), где by — поле для сортировки, может принимать значения:
order — порядок сортировки, может принимать значения:
Необязательный. По умолчанию равен Array(«sort»=>»asc») Примечание: параметр не должен быть false, иначе метод отработает неправильно и результат не будет отобран по заданным критериям. |
arFilter | Массив вида array(«фильтруемое поле»=>»значения фильтра» [, …]) «фильтруемое поле» может принимать значения: ACTIVE — активность (Y/N),
Не обязательный параметр, по умолчанию равен array(). |
Примечание — Существуют ещё параметры, оставленные для сохранения совместимости: $by и $order .
Возвращаемое значение
Возвращается объект CDBResult, содержащий поля свойств и поля со значениями:
PROPERTY_VALUE_ID — код значения свойства,
VALUE — значение свойства,
DESCRIPTION — описание значения свойства,
VALUE_ENUM — текстовое значение элемента списочного свойства,
VALUE_XML_ID — внешний код значения свойства типа «список».
Примеры использования
Пример 1:
<?
$db_props = CIBlockElement::GetProperty($PRODUCT_IBLOCK_ID, $PRODUCT_ID, array(«sort» => «asc»), Array(«CODE»=>»FORUM_TOPIC_ID»));
if($ar_props = $db_props->Fetch())
$FORUM_TOPIC_ID = IntVal($ar_props[«VALUE»]);
else
$FORUM_TOPIC_ID = false;
?>
Пример 2 (получить значения для множественного свойства):
$VALUES = array();
$res = CIBlockElement::GetProperty(IKSO_CUSTOM::$IBLOCKS[‘brands’], $BRAND_ID, «sort», «asc», array(«CODE» => «BRAND_CLASS»));
while ($ob = $res->GetNext())
{
$VALUES[] = $ob[‘VALUE’];
}
Пример 3 (получить значения для немножественного свойства):
$res = CIBlockElement::GetProperty(IKSO_CUSTOM::$IBLOCKS[‘brands’], $BRAND_ID, «sort», «asc», array(«CODE» => «BRAND_CLASS»));
if ($ob = $res->GetNext())
{
$VALUE = $ob[‘VALUE’];
}
Пример 4:
Если значений у свойства нет и в фильтр не передается «EMPTY»=>»N», то метод вернет массив с с пустым ключом VALUE:
//используются Инфоблоки 2.0
$db_props = CIBlockElement::GetProperty(30, 14391, «sort», «asc», Array(«CODE»=>»XXX»)); // XXX — множественное свойства типа «Строка»
if($ar_props = $db_props->Fetch()):
echo «<pre>».print_r($ar_props, true).»<pre>»;
endif;
3 Артем Хлебус | ||
Если нужно получить имена значения типа список
| ||
4 stvbox |
Третий параметр метода не должен быть false. Не правильно происходит перегрузка функции и результат — все подряд, вместо отобранного по необходимым критериям. |
2 Сергей Фролов | ||
Если нужно получить значение типа список
| ||
3 Роберт Басыров | ||
CIBlockElement::GetProperty() возвращает результат в случае, если значения нет
отдает массив с пустым VALUE XXX — множественное свойства типа строка | ||
1 Игорь Павленко | ||||
Нужно также учитывать, что если получаем значения для множественного св-ва, то можно получать так:
Если получаем значения для не множественного св-ва, то можно так:
| ||||
2 PetrW | ||||
Возможно еще так:
| ||||
© «Битрикс»,
2001-2020,
«1С-Битрикс», 2020
Наверх
[ Посмотреть ответы ]
При оптимизации кода рекомендуется убрать лишние запросы. Лишний запрос это:
- запрос в цикле
- запросы, которые добирают данные в цикле
- запрос с неиспользуемыми данными ($arSelect)
Выборка историй изменения элемента осуществляется с помощью метода:
- CIBlockElement::GetList с настроенным фильтром «SHOW_HISTORY» => «Y»
- CIBlockElement::WF_GetLast
- CIBlockElement::WF_GetHistoryList
Переход к добавлению свойств для разделов инфоблока выполняется:
- на закладке «Свойства» страницы редактирования инфоблока
- с помощью ссылки «Добавить пользовательское свойство», расположенной на закладке «Доп. поля» страницы редактирования раздела инфоблока
- на закладке «Свойства» страницы редактирования раздела инфоблока
В чем отличие инфоблоков 2.0 от обычных?
- все значения свойств одного элемента хранятся в одной строке
- используется тип таблиц Innodb вместо MylSAM
- инфоблоки 2.0 хранят свои свойства в отдельной таблице
Если в инфоблоках 2.0 сменен тип свойства, то:
- изменяется тип хранения в самой базе данныхизменяется тип хранения в самой базе данных
- меняется логика интерпретации продуктом значения этого свойств
Параметры информационного блока позволяют:
- управлять выводом свойств инфоблока для публичной части
- управлять правами доступа пользователей к информационному блоку
- указывать пользовательские поля для инфоблоков
- настраивать параметры экспорта в RSS (если экспорт в RSS был разрешен в настройках типа инфоблока)
- определять сайт (или сайты), на котором может быть показан инфоблок
- создавать свойства элементов
- определять URL на страницы со списком всех элементов, разделов и элементов отдельного раздела информационного блока
Преимущества инфоблоков 2.0 проявляются:
- на справочниках с небольшим количеством часто изменяемых свойств
- при использовании составных индексов
- на справочниках с небольшим количеством редко изменяемых свойств
- при использовании инфоблоков 2.0 в качестве товарных предложений
Уровень вложенности разделов экспортируемых в формате CSV инфоблоков задается:
- в настройках модуля Информационные блоки
- в форме настроек экспорта инфоблока в формате CSV
- в настройках Главного модуля
Предположим, что для элементов некоторого инфоблока должны задаваться значения следующих двух свойств: автор и источник. Для этого данные свойства необходимо создать:
- на странице редактирования элементов, для которых будут задаваться значения этих свойств
- на странице настроек соответствующего типа инфоблоков
- на странице настроек соответствующего инфоблока
Флаг IS_FINAL для элемента участвующего в документообороте инфоблока выставляется: Флаг IS_FINAL для элемента участвующего в документообороте инфоблока выставляется:
- методами API Bitrix Framework
- правкой записи в базе данных
С помощью какого метода можно получить свойство элемента?
- CIBlockElement::SetPropertyValues
- CIBlockElement::GetProperty
- CIBlockProperty::Update
Общий порядок работы с инфоблоками при создании сайта
- Создание элементов инфоблока.
- Внимательное продумывание структуры инфоблоков.
- Кастомизация работы компонента под потребности ТЗ и дизайна сайта.
- Создание физической страницы (в случае использования комплексного компонента) или страниц (при использовании простых компонентов) и размещение на ней компонента (компонентов) с последующей настройкой его свойств.
- Создание нужного типа инфоблоков с настройкой параметров.
- Создание самих инфоблоков с настройкой параметров.
- Создание структуры внутри инфоблока.
С помощью каких типов свойств настраивается связь между информационными блоками? С помощью каких типов свойств настраивается связь между информационными блоками?
- привязка к файлу (на сервере)
- привязка к элементам
- привязка к разделам
- привязка к элементам в виде списка
- привязка к элементам по XML_ID
- привязка к элементам с автозаполнением
- привязка к товарам (SKU)
[ Посмотреть ответы ]
Примеры решения задач, возникающих при работе с элементами, разделами и свойствами инфоблоков.
Задача 1:
Получить значения всех свойств элемента, зная его ID.
1 <? $db_props = CIBlockElement::GetProperty(IBLOCK_ID, ELEMENT_ID, «sort», «asc», array());
2 $PROPS = array();
3 while($ar_props = $db_props->GetNext())
4 $PROPS[$ar_props[‘CODE’]] = $ar_props[‘VALUE’];?>
Теперь символьный код свойства является ключом ассоциативного массива $PROPS, то есть, если вам нужно значение свойства с кодом price, то оно будет храниться в $PROPS[‘price’].
Задача 2:
Получить свойства элементов, используя метод CIBlockElement::GetList
1 <? $arSelect = array(«ID», «NAME», «PROPERTY_prop_code_1», «PROPERTY_prop_code_2»);
2 $res = CIBlockElement::GetList(array(), array(), false, array(), $arSelect);?>
Дальше использовать цикл и получить свойства с символьными кодами prop_code_1 и prop_code_2.
Советы веб-разработчиков. Антон Долганин: Если для какого-либо изменения в БД предусмотрен специальный метод, следует использовать именно его, а не более общий метод изменения БД. Хороший пример: модуль интернет-магазина и работа с заказом. Можно изменить флаг оплаты заказа путем CSaleOrder::Update, а можно путем CSaleOrder::PayOrder. Так вот, следует применять именно PayOrder, потому что в нем произойдет вызов соответствующих обработчиков. |
Задача 3:
Добавить свойство типа TEXT/html для элемента.
Если свойство не множественное:
01 <? $element = new CIBlockElement;
02 $PROP = array();
03 $PROP[‘символьный код свойства’][‘VALUE’][‘TYPE’] = ‘text’; // или html
04 $PROP[‘символьный код свойства’][‘VALUE’][‘TEXT’] = ‘значение, которое нужно забить’;
05 $arLoadArray = array(
06 «IBLOCK_ID» => IBLOCK_ID,
07 «PROPERTY_VALUES»=> $PROP,
08 «NAME» => «Название элемента»
09 );
10 $element->Add($arLoadArray);?>
Если свойство множественное:
01 <? // В $ITEMS хранятся значения множественного свойства, которое нужно забить
02 foreach($ITEMS as $item)
03 {
04 $VALUES[][‘VALUE’] = array(
05 ‘TYPE’ => ‘text’, // или html
06 ‘TEXT’ => $item,
07 );
08 }
09 $element = new CIBlockElement;
10 $PROPS = array();
11 $PROPS[‘символьный код свойства’] = $VALUES;
12 $arLoadArray = array(
13 «IBLOCK_ID» => IBLOCK_ID,
14 «PROPERTY_VALUES»=> $PROPS,
15 «NAME» => «Название элемента»
16 );
17 $element->Add($arLoadArray);?>
Задача 4:
Заполнить множественное свойство типа Файл. Довольно часто при добавлении элемента в инфоблок может понадобиться привязать к нему несколько файлов. Для этого удобно создать у инфоблока множественное свойство типа Файл и хранить файлы в нём. Пример заполнения свойства:
01 <?
02 $arFiles = array();
03 for($i = 1; $i CFile::MakeFileArray($_SERVER[«DOCUMENT_ROOT»].’/images/image_’.$i.’.jpg’), ‘DESCRIPTION’ => »);
08 }
09 }
10 ?>
После этого массив $arFiles передается как значение свойства при добавлении элемента.
Задача 5:
Заполнить множественное свойство типа Список с отображением в виде флажков. В данном случае у каждого элемента списка значений есть свой ID. Посмотреть их можно, зайдя в детальное редактирование свойства. Заполняется свойство следующим образом:
1 <?
2 if($first_condition == true) $values[] = array(‘VALUE’ => 1);
3 if($second_condition == true) $values[] = array(‘VALUE’ => 2);
4 CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, array(‘property_code’ => $values));
5 ?>
В данном случае при выполнении первого и второго условий мы отмечаем флажками элементы списка с ID =1 и ID=2 соответственно. Заменить следует $ELEMENT_ID, $IBLOCK_ID и property_code на нужные значения.
Задача 6:
Получить пользовательское свойство раздела
1 <? $section_props = CIBlockSection::GetList(array(), array(‘IBLOCK_ID’ => IBLOCK_ID, ‘ID’ => SECTION_ID),
true, array(«UF_ADDITIONAL_PRICE»));
2 $props_array = $section_props->GetNext(); ?>
Теперь в $props_array[‘UF_ADDITIONAL_PRICE’] лежит значение свойства UF_ADDITIONAL_PRICE раздела инфоблока.
Совет от веб-разработчиков. Алексей Коваленко: При работе с инфоблоками удобнее все коды свойств именовать заглавными буквами. В таком случае вы сможете избежать небольших несостыковок в своей работе. Например, значение свойства с кодом foto при работе с компонентами часто доступно через [PROPERTIES][foto][VALUE]?, а при использовании метода GetList вы можете получить PROPERTY_FOTO_VALUE. |
Пример создания своего типа данных для пользовательского свойства
В качестве значения свойства попробуем завести картинку с превью. Это могут быть например фотографии гостиницы на туристическом сайте или что-то подобное. В варианте такого применения и рассмотрим решение задачи.
Один из вариантов реализации: хранить изображения в отдельном инфоблоке и показывать как привязку к элементу. Пример кода:
AddEventHandler(«iblock», «OnIBlockPropertyBuildList», array(«CIBlockPropertyPicture», «GetUserTypeDescription»));
AddEventHandler(«iblock», «OnBeforeIBlockElementDelete», array(«CIBlockPropertyPicture», «OnBeforeIBlockElementDelete»));
class CIBlockPropertyPicture
{
function GetUserTypeDescription()
{
return array(
«PROPERTY_TYPE» =>»E»,
«USER_TYPE» =>»Picture»,
«DESCRIPTION» =>»Картинка»,
«GetPropertyFieldHtml» =>array(«CIBlockPropertyPicture», «GetPropertyFieldHtml»),
«GetPublicViewHTML» =>array(«CIBlockPropertyPicture», «GetPublicViewHTML»),
«ConvertToDB» =>array(«CIBlockPropertyPicture», «ConvertToDB»),
//»GetPublicEditHTML» =>array(«CIBlockPropertyPicture»,»GetPublicEditHTML»),
//»GetAdminListViewHTML» =>array(«CIBlockPropertyPicture»,»GetAdminListViewHTML»),
//»CheckFields» =>array(«CIBlockPropertyPicture»,»CheckFields»),
//»ConvertFromDB» =>array(«CIBlockPropertyPicture»,»ConvertFromDB»),
//»GetLength» =>array(«CIBlockPropertyPicture»,»GetLength»),
);
}
function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
$LINK_IBLOCK_ID = intval($arProperty[«LINK_IBLOCK_ID»]);
if($LINK_IBLOCK_ID)
{
$ELEMENT_ID = intval($value[«VALUE»]);
if($ELEMENT_ID)
{
$rsElement = CIBlockElement::GetList(array(), array(«IBLOCK_ID» => $arProperty[«LINK_IBLOCK_ID»],
«ID» => $value[«VALUE»]), false, false, array(«ID», «PREVIEW_PICTURE», «DETAIL_PICTURE»));
$arElement = $rsElement->Fetch();
if(is_array($arElement))
$file_id = $arElement[«DETAIL_PICTURE»];
else
$file_id = 0;
}
else
{
$file_id = 0;
}
if($file_id)
{
$db_img = CFile::GetByID($file_id);
$db_img_arr = $db_img->Fetch();
if($db_img_arr)
{
$strImageStorePath = COption::GetOptionString(«main», «upload_dir», «upload»);
$sImagePath = «/».$strImageStorePath.»/».$db_img_arr[«SUBDIR»].»/».$db_img_arr[«FILE_NAME»];
return ‘<label><input name=»‘.$strHTMLControlName[«VALUE»].'[del]» value=»Y» type=»checkbox»>
Удалить файл ‘.$sImagePath.'</label>’
.'<input name=»‘.$strHTMLControlName[«VALUE»].'[old]» value=»‘.$ELEMENT_ID.'» type=»hidden»>’;
}
}
return ‘<input type=»file» size=»‘.$arProperty[«COL_COUNT»].'» name=»‘.$strHTMLControlName[«VALUE»].'»/>’;
}
else
{
return «Ошибка настройки свойства. Укажите инфоблок в котором будут храниться картинки.»;
}
}
function GetPublicViewHTML($arProperty, $value, $strHTMLControlName)
{
$LINK_IBLOCK_ID = intval($arProperty[«LINK_IBLOCK_ID»]);
if($LINK_IBLOCK_ID)
{
$ELEMENT_ID = intval($value[«VALUE»]);
if($ELEMENT_ID)
{
$rsElement = CIBlockElement::GetList(array(), array(«IBLOCK_ID» => $arProperty[«LINK_IBLOCK_ID»],
«ID» => $value[«VALUE»]), false, false, array(«ID», «PREVIEW_PICTURE», «DETAIL_PICTURE»));
$arElement = $rsElement->Fetch();
if(is_array($arElement))
return CFile::Show2Images($arElement[«PREVIEW_PICTURE»], $arElement[«DETAIL_PICTURE»]);
}
}
return «»;
}
function ConvertToDB($arProperty, $value)
{
$arResult = array(«VALUE» => «», «DESCRIPTION» => «»);
$LINK_IBLOCK_ID = intval($arProperty[«LINK_IBLOCK_ID»]);
if($LINK_IBLOCK_ID)
{
if(
is_array($value[«VALUE»])
&& is_array($value[«VALUE»][«error»])
&& $value[«VALUE»][«error»][«VALUE»] == 0
&& $value[«VALUE»][«size»][«VALUE»] > 0
)
{
$arDetailPicture = array(
«name» => $value[«VALUE»][«name»][«VALUE»],
«type» => $value[«VALUE»][«type»][«VALUE»],
«tmp_name» => $value[«VALUE»][«tmp_name»][«VALUE»],
«error» => $value[«VALUE»][«error»][«VALUE»],
«size» => $value[«VALUE»][«size»][«VALUE»],
);
$obElement = new CIBlockElement;
$arResult[«VALUE»] = $obElement->Add(array(
«IBLOCK_ID» => $LINK_IBLOCK_ID,
«NAME» => $arDetailPicture[«name»],
«DETAIL_PICTURE» => $arDetailPicture,
), false, false, true);
}
elseif(
is_array($value[«VALUE»])
&& isset($value[«VALUE»][«size»])
&& !is_array($value[«VALUE»][«size»])
&& $value[«VALUE»][«size»] > 0
)
{
$arDetailPicture = array(
«name» => $value[«VALUE»][«name»],
«type» => $value[«VALUE»][«type»],
«tmp_name» => $value[«VALUE»][«tmp_name»],
«error» => intval($value[«VALUE»][«error»]),
«size» => $value[«VALUE»][«size»],
);
$obElement = new CIBlockElement;
$arResult[«VALUE»] = $obElement->Add(array(
«IBLOCK_ID» => $LINK_IBLOCK_ID,
«NAME» => $arDetailPicture[«name»],
«DETAIL_PICTURE» => $arDetailPicture,
), false, false, true);
}
elseif($value[«VALUE»][«del»])
{
$obElement = new CIBlockElement;
$obElement->Delete($value[«VALUE»][«old»]);
}
elseif($value[«VALUE»][«old»])
{
$arResult[«VALUE»] = $value[«VALUE»][«old»];
}
elseif(!is_array($value[«VALUE»]) && intval($value[«VALUE»]))
{
$arResult[«VALUE»] = $value[«VALUE»];
}
}
return $arResult;
}
function OnBeforeIBlockElementDelete($ELEMENT_ID)
{
$arProperties = array();
$rsElement = CIBlockElement::GetList(array(), array(«ID» => $ELEMENT_ID), false, false, array(«ID», «IBLOCK_ID»));
$arElement = $rsElement->Fetch();
if($arElement)
{
$rsProperties = CIBlockProperty::GetList(array(), array(«IBLOCK_ID» => $arElement[«IBLOCK_ID»], «USER_TYPE» => «Picture»));
while($arProperty = $rsProperties->Fetch())
$arProperties[] = $arProperty;
}
$arElements = array();
foreach($arProperties as $arProperty)
{
$rsPropValues = CIBlockElement::GetProperty($arElement[«IBLOCK_ID»], $arElement[«ID»], array(), array(
«EMPTY» => «N»,
«ID» => $arProperty[«ID»],
));
while($arPropValue = $rsPropValues->Fetch())
{
$ID = intval($arPropValue[«VALUE»]);
if($ID > 0)
$arElements[$ID] = $ID;
}
}
foreach($arElements as $to_delete)
{
CIBlockElement::Delete($to_delete);
}
}
}
Что мы в итоге имеем:
- Интерфейс редактирования элемента с возможностью добавления и удаления изображений.
- При удалении элемента связанная с ним информация удаляется.
- Поддержка компонент публичной части.
Инструкция по применению:
- Этот код разместите в файле /bitrix/php_interface/init.php.
- Создайте инфоблок для хранения изображений и в его настройках укажите параметры генерации картинки предварительного просмотра из детальной (на вкладке Поля).
- В инфоблоке Гостиницы добавьте свойство типа Картинка и в дополнительных настройках этого свойства укажите созданный на первом шаге инфоблок. Не забудьте указать символьный код свойства.
- Создайте элемент и «поиграйтесь» со значениями этого свойства.
- В публичной части, например в компоненте news, в параметрах настройки списка элементов выбрать это свойство.
Как удалить файл в свойстве элемента инфоблока
Обновить любое свойство можно с помощью методов:
- Update
- SetPropertyValues
- SetPropertyValuesEx
При использовании любого метода на ключ массива обновления идет код свойства, а значение — новое значение. Для удаления файла нам надо передать вот такой простой массив:
array(‘MY_FILE’ => array(‘XXX’ => array(‘del’ => ‘Y’)));
Способ универсален и подходит что для инфоблоков, что для инфоблоков 2.0, что для документооборота. MY_FILE — это код вашего свойства типа Файл. А что такое ХХХ? В нём содержится ID значения_ свойства. То есть не ID свойства, а именно ID значения.
CModule::IncludeModule(‘iblock’);
$IB = 24;
$ID = 220304;
$CODE = ‘ONE_FL’;
if ($arProp = CIBlockElement::GetProperty($IB, $ID, ‘ID’, ‘DESC’, array(‘CODE’ => $CODE))->fetch()) {
$XXX = $arProp[‘PROPERTY_VALUE_ID’];
CIBlockElement::SetPropertyValueCode($ID, $CODE, array($XXX => array(‘del’ => ‘Y’)));
}
Вот таким образом получается этот универсальный XXX, именно так его и надо передавать для каждого файла, который мы хотим удалить.
Что делать в случае множественного файла? Как удалить конкретный файл в списке? Все просто — используем в примере выше не if, а while, ну и дополнительно фильтруем, какой файл надо удалить.