С помощью какого метода можно получить свойство элемента

Свойства элементов
Согласитесь, что посетителям сайта приятнее читать статьи, где указан автор и добавлены фотографии. Выбирать товары в интернет-магазине удобнее, если приведены их характеристики. Создавайте в инфоблоке свойства и храните информацию в элементах наиболее полно.
Общий подход при работе со свойствами
Примечание: свойства создаются для каждого инфоблока отдельно.
Как создать свойство?
- Откройте форму настроек информационного блока (Контент > Инфоблоки > Типы инфоблоков > название_типа > название_инфоблока).
- Перейдите на закладку
Свойства
.
- В свободной строчке:
- введите название свойства (название будет показываться на сайте);
- выберите тип хранимых в свойстве данных;
- отметьте флаг Множ., если значений у свойства может быть несколько;
- отметьте флаг Обяз., если указание значений данного свойства – это обязательная процедура;
- заглавными латинскими буквами укажите
код свойства
;
- нажмите кнопку […] для детального редактирования настроек свойства.
- Во всплывающем окне проверьте уже сделанные вами настройки и выполните оставшиеся.
Примечание: перечень полей зависит от выбранного типа свойства. Описание каждого поля приведено в
документации по продукту.
Форма позволяет выполнить детальную настройку свойств инфоблока. Поля некоторых форм могут
отличаться для разных свойств. Для открытия формы нужно:- Перейдите на страницу
Контент > Информ. блоки > Типы информ. блоков > Название типа инфоблоков. - В колонке команд выбрать команду Свойства для нужного инфоблока.
Откроется страница списка свойств для элементов инфоблока. - На контекстной панели нажмите кнопку Добавить свойство или
в меню действий конкретного свойства выберите команду Изменить.
либо:
- Перейдите на страницу
Контент > Информ. блоки > Типы информ. блоков > Название типа инфоблоков > Название инфоблока. - В колонке команд выбрать команду Изменить.
- Перейдите на закладку Свойства.
- В строке с нужным свойством элемента нажмите на кнопку […].
Откроется форма настройки свойств информационного блока.
Подробнее…
- Перейдите на страницу
- Сохраните настройки.
Теперь вы можете указывать значения этого свойства при
создании/редактировании
Следуйте инструкциям на схеме и расширяйте контент вашего сайта: публикуйте статьи, добавляйте товары и новости.
Подробнее…
элементов:
Важно! Если свойство не появилось в форме создания/редактирования элемента, то
перенастройте внешний вид
При работе с товарами, материалами статей, каталогами справочников вы зачастую обращаете внимание на следующий момент: в форме присутствуют поля, которые не используются на сайте. Лишние поля увеличивают размеры формы редактирования и затрудняют внесение данных.
Облегчите свой труд, используйте инструмент настройки форм инфоблоков. Инструмент учитывает индивидуальные потребности, позволяет настроить формы редактирования разделов и элементов инфоблока под себя:
- удаляйте лишние поля или целые вкладки;
- перемещайте поля между вкладками;
- создавайте свои вкладки.
Подробнее…
формы.
Примечание: для
торговых каталогов
Чтобы нужный информационный блок работал в режиме торговых каталогов, отметьте его флажком в поле Является торговым каталогом на странице настроек модуля Торговый каталог (Настройки > Настройки продукта > Настройки модулей > Торговый каталог).
Подробнее…
свойства можно создавать
двумя способами.
Свойства можно создать двумя способами:
1) на странице Магазин > [ваш каталог] > Свойства товаров / Свойства торговых предложений, кликнув по кнопке Добавить свойство;
2) в форме настроек информационного блока (Контент > Инфоблоки > Типы инфоблоков > название_типа > название_инфоблока, вкладка “Свойства”), кликнув по кнопке настроек.
Подробнее…
Как вывести информацию из свойства?
Когда свойство
уже создано
и в элементах инфоблока проставлены его
значения
, можно приступать к выводу этих значений на сайт:
- Откройте на сайте страницу, где демонстрируется посетителям информация из вашего инфоблока.
- Включите
режим правки
Режим Правка – специальный режим работы “1С-Битрикс: Управление сайтом”, в котором происходит изменение информации на сайте.
Подробнее…
.
- Откройте форму с
настройками компонента.
В режиме правки наведите мышь на область компонента, появится панель настроек. Выберите пункт Редактировать параметры компонента. Откроется форма настройки.
Подробнее…
- Перейдите к настройкам списка и/или детального просмотра и отметьте
ваше свойство
.
- Сохраните настройки.
Теперь значения из свойства показываются на сайте:
Примечание: на сайте выводятся только непустые значения свойств.
Как вывести подсказки в фильтре?
Бывают ситуации, когда в фильтре каталога товаров требуется прояснить фильтруемые параметры. Поскольку параметры фильтра – это свойства инфоблока, то используйте механизм подсказок. Добавить подсказку очень просто:
- Откройте форму редактирования вашего каталога с товарами (Контент > Инфоблоки > Типы инфоблоков > название_типа > название_инфоблока).
- Перейдите на закладку Свойства.
- В строке с требуемым свойством нажмите кнопку […].
- Введите текст подсказки в поле
Подсказка в умном фильтре для посетителей
.
- Сохраните настройки.
Теперь в фильтре рядом с параметром отображается подсказка:
Заключение
Свойства создаются отдельно для каждого инфоблока. Значения свойства задаются в элементах инфоблока. Показ значений свойства на сайте определяется настройками компонента.
Источник
[ Посмотреть ответы ]
При оптимизации кода рекомендуется убрать лишние запросы. Лишний запрос это:
- запрос в цикле
- запросы, которые добирают данные в цикле
- запрос с неиспользуемыми данными ($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)
[ Посмотреть ответы ]
Источник
При создании информационных блоков рекомендуется хранить свойства инфоблока в отдельной таблице, причем все значения свойств одного элемента хранятся в одной строке. Эта технология называется Инфоблоки 2.0 и позволяет существенно ускорить работу системы, а также снять ряд ограничений в предыдущей версии инфоблоков. Например, теперь нет необходимости в дополнительном запросе CIBlockElement::GetProperty при выборе значений свойств функцией CIBlockElement::GetList.
Примечание. В документации к Bitrix Framework, в сообщениях форума на сайте компании и в других местах могут встречаться прежние названия технологии: инфоблоки +.
Возможности инфоблоков 2.0:
- При выборке элементов можно сразу получать значения свойств, т.к. количество присоединяемых таблиц в запросе не увеличивается с каждым свойством, а всегда равно единице.
- Фильтрация по значениям свойств происходит аналогично инфоблокам 1.0 (за исключением множественных).
- Выборка значений множественных свойств не приводит к декартовому произведению результата запроса – значения свойств передаются в виде массива.
- Для комбинированных фильтров по немножественным (единичным) свойствам появилась возможность ручного создания составных индексов БД для ускорения операций выборки.
- Для инфоблоков 2.0 нет возможности “сквозной” выборки элементов, когда в фильтре указывается тип инфоблока и символьный код свойства. В фильтре необходимо указывать IBLOCK_ID.
- В инфоблоках 2.0 таблица со связанными элементами будет присоединяться (join) только один раз.
Важным является полная совместимость API. То есть техника использования инфоблоков, свойств, элементов и их значений одинакова для обоих версий инфоблоков.
Для разработчика очень удобно и гибко то, что свойства хранятся в одной общей таблице и управляются информацией метаданных из IBLOCK_PROPERTY_ID. Так как всегда можно поправить какую-то метаинформацию и никакая другая информация при этом у вас не пропадет. Это свойственно простым инфоблокам.
Если информация хранится в инфоблоках 2.0 и у свойства меняется его тип (например, с Числа на Строку), то изменяется и тип хранения в самой базе данных. То есть меняется не логика интерпретации продуктом значения этого свойства, а меняется само значение. То есть нельзя “играться” с данными.
С точки зрения производительности инфоблоки 2.0 выигрывают на небольших справочниках с небольшим количеством (20-30) редко изменяемых свойств. Ленту новостей нет никакого смысла переводить на этот вид инфоблоков. Вы выиграете в числе запросов, но проиграете во времени их исполнения.
В инфоблоках 2.0 существует физическое ограничение БД на количество свойств инфоблока. На данный момент это не отслеживается в системе, так как зависит от множества непрогнозируемых факторов: типа свойств, конфигурации MySQL и других. При превышении этого физического ограничения вы получите редкую для Bitrix Framework ошибку MySQL. Данные при этом потеряны не будут.
Внимание! Перевод из обычных инфоблоков в инфоблоки 2.0 невозможен при числе свойств более 50.
Большое преимущество инфоблоков 2.0 – возможность использования составных индексов. Однако достаточно редка ситуация, когда выполняется фильтр по = и по нескольким полям одновременно.
Уровень информационного блока.
У информационного блока есть признак VERSION, который при создании нового инфоблока определяет выбор хранения значений свойств информационного блока в общем хранилище или в выделенном. При выборе выделенного хранения для данного инфоблока в БД создаются две дополнительные таблицы, включающие в своё имя идентификатор инфоблока. В одной из них будут храниться множественные свойства, а в другой единичные и кешированные значения множественных.
При редактировании инфоблока доступна ссылка на “конвертер” между типами хранения. Пользоваться им надо с большой осторожностью, т.к. продолжительность процесса конвертации зависит от общего объема значений свойств инфоблока. В течение всего процесса инфоблок находится в несогласованном состоянии (часть значений перенесена, а часть нет). На тестовой конфигурации для MySQL версии скорость была порядка 1500 элементов за 20-ти секундный шаг.
В классе CIBlockResult переопределён метод Fetch. В нем происходит кеширование значений множественных свойств элемента, участвующих в выборке. Для этих же свойств типа список выбираются пары ID=>VALUE из справочника списков.
В API предусмотрен параметр VERSION в массиве полей $arFields метода CIBlock::Add. Его значения: 1 – для общего хранения и 2 – для выделенного (нового).
Уровень свойств информационного блока
При редактировании свойств (смена признака множественности или типа свойства) для свойств в выделенном хранилище выполняются дополнительные операции по управлению таблицами. Такие как удаление/добавление колонок, вставка/обновление или удаление большого количества записей. Без настоятельной необходимости лучше избегать этого. Наилучшей методикой будет менять тип или множественность одного свойства за один раз. Причем для единичных свойств предпочтительнее сначала сделать его множественным а потом сменить тип, а для множественных наоборот – сначала тип, и уже потом делать его единичным.
Уровень элементов информационного блока
При вставке элемента вставляется и соответствующая запись в таблицу хранения значений свойств элемента.
Уровень значений свойств элементов информационного блока
Значения единичных свойств инфоблока с выделенным хранилищем ID – составные и состоят из ID элемента и ID свойства, разделенных двоеточием. При обновлении множественных свойств происходит сброс кеша этих значений.
Значения свойств хранятся в 2-х таблицах (описание таблиц и их структуры имеет справочный характер и могут меняться в следующих версиях):
- b_iblock_element_prop_mNN – для множественных. Имеет ту же самую структуру, что и b_iblock_element_property;
- b_iblock_element_prop_sNN – для единичных. Имеет поле IBLOCK_ELEMENT_ID – ID элемента инфоблока которому принадлежат свойства:
- PROPERTY_XX – хранит значения единичного свойства XX или кеш значений для множественного свойства;
- DESCRIPTION_XX – хранит описание для единичного свойства.
Как достичь наибольшей эффективности при использовании Инфоблоков 2.0?
Для использования преимуществ, создаваемых структурой хранения данных в новых инфоблоках, необходимо несколько модифицировать логику работы компонентов.
Например: если раньше шаблон кода был примерно таким:
<?
//Определяем массив нужных полей элемента
$arSelect = array(
“ID”,
“IBLOCK_ID”,
“IBLOCK_SECTION_ID”,
“NAME”,
“PREVIEW_PICTURE”,
“DETAIL_PICTURE”,
“DETAIL_PAGE_URL”,
);
//Получаем список элементов. (+1 запрос)
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER),
$ELEMENT_COUNT, $arFilter, $arSelect))
{
//Инициализация постраничного вывода.
$rsElements->NavStart($ELEMENT_COUNT);
$count = intval($rsElements->SelectedRowsCount());
if ($count>0)
{
//Для каждого элемента:
while ($obElement = $rsElements->GetNextElement())
{
$arElement = $obElement->GetFields();
//Получаем его свойства. (+1 запрос)
$arProperty = $obElement->GetProperties();
//Ниже можно пользоваться значениями свойств.
//Например:
echo $arProperty[“SOURCE”],”
“;
//и т.д. и т.п.
}
}
}
?>
Теперь, после преобразования в новый тип хранения, стало возможным избавится от запросов в цикле:
<?
//Определяем массив нужных полей элемента
$arSelect = array(
“ID”,
“IBLOCK_ID”,
“IBLOCK_SECTION_ID”,
“NAME”,
“PREVIEW_PICTURE”,
“DETAIL_PICTURE”,
“DETAIL_PAGE_URL”,
“PROPERTY_SOURCE”, //Выбираем нужное нам свойство
// И все другие какие могут понадобится
// непосредственно в списке
);
//Получаем список элементов. (+1 запрос)
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER),
Array(“nPageSize”=>$ELEMENT_COUNT), $arFilter, $arSelect))
{
//Инициализация постраничного вывода.
$rsElements->NavStart($ELEMENT_COUNT);
if($obElement = $rsElements->GetNextElement())
{
//Для каждого элемента:
do
{
$arElement = $obElement->GetFields();
//Ниже можно пользоваться значениями свойств.
//Например:
echo $arElement[“PROPERTY_SOURCE”],”
“;
//и т.д. и т.п.
}
while ($obElement = $rsElements->GetNextElement())
}
}
?>
Источник
В новом ядре D7 битрикс появилаcь новая технология ORM. Она заменяет привычный GetList и позволяет выбирать данные из таблиц битрикс не пользуясь прямыми запросами к базе данных. В итоге операции выборки и сохранения в БД получаются однотипными, с одинаковыми параметрами и фильтрам. Для выборки данных необходимо описать в виде класса некую сущность и поля этой сущности. Сущность это таблица базы данных, поля сущности – столбцы таблицы.
Для каждой сущности нужно создать описание. В битрикс уже есть некоторые описания таблиц(сущности), но вот для выборки своих свойств инфоблока, сущность не описана. Поэтому мы это сделаем самостоятельно.
Существует уже описанная сущность для выборки полей из таблицы b_iblock_element с помощью BitrixIblockElementTable::getList. Сущность описана в файле /bitrix/modules/iblock/lib/element.php
class ElementTable extends MainEntityDataManager
{
public static function getTableName()
{
return ‘b_iblock_element’;
}
public static function getMap()
{
return array(
…
‘IBLOCK_SECTION_ID’ => array( // Основной раздел
‘data_type’ => ‘integer’,
‘title’ => Loc::getMessage(‘ELEMENT_ENTITY_IBLOCK_SECTION_ID_FIELD’),
),
‘ACTIVE’ => array( // Активность
‘data_type’ => ‘boolean’,
‘values’ => array(‘N’, ‘Y’),
‘title’ => Loc::getMessage(‘ELEMENT_ENTITY_ACTIVE_FIELD’),
),
‘IBLOCK’ => array( //связка с другой таблицей
‘data_type’ => ‘BitrixIblockIblock’,
‘reference’ => array(‘=this.IBLOCK_ID’ => ‘ref.ID’),
),
);
}
}
Основные функции это
getTableName(), где возвращается название таблицы b_iblock_element
и
getMap(), где возвращаются описанные полей таблицы
В методе getMap() описываются поля таблицы и помимо этого описаны «ссылки» на другие сущности, для взаимосвязи. Например описана ссылка на таблицу IblockTable, чтобы можно было достать данные из таблицы b_iblock. Таблицы связываются по полю ID конструкцией представленной ниже и выбрать данные из таблице можно указав а параметре select параметр IBLOCK.CODE
‘IBLOCK’ => array(
‘data_type’ => ‘BitrixIblockIblock’,
‘reference’ => array(‘=this.IBLOCK_ID’ => ‘ref.ID’),
),
Чтобы выбрать стандартные поля элементов, которые описаны в методе getMap() необходима запись вида
$rs = BitrixIblockElementTable::getList(
‘filter’ => array(
“ID”=>$arId
),
‘select’ => array(
‘ID’,
‘IBLOCK.CODE’
));
while($r = $rs->fetch())
{
$arResult[] = $r;
}
Узнать какие можно получить свойства элементов, можно исполнить функцию BitrixIblockElementTable::getMap();
Но если нам нужно получить свои свойства элементов, нужно описать сущность другой таблицы.
Если как у меня в настройках инфоблока значения свойств хранятся в отдельной таблице для данного информационного блока, то таблица будет называться b_iblock_element_prop_s3, где цифра 3 – это ID инфоблока. Вот для этой таблицы мы и будем описывать сущность b_iblock_element_prop_s3.
Привожу простой пример класса. Его мы назовем IblockElementPropertyTable и положим в файл elementproperty.php, подключив например в init.php При этом Table в конце названия обязательно. В классе опишем не все поля таблицы, а только те которые нам нужно. Сделаем это для свойства с названием Артикул. Его id равно 21
namespace BitrixIblock;
use BitrixMainEntity;
class IblockElementPropertyTable extends EntityDataManager{
public static function getTableName(){
return ‘b_iblock_element_prop_s3’;
}
public static function getMap(){
return
array(
new EntityIntegerField(
‘IBLOCK_ELEMENT_ID’,
array(
‘primary’ => true
)
),
new EntityStringField(
‘PROPERTY_21’,
array(
‘required’ => true
)
)
);
}
}
Так, чтобы получить свойство с id 21 необходимо его описать в данном классе.
После всего необходимо связать две таблицы. Укажем отношение двух столбцов. Для этого обозначим в параметре runtime, что значение из столбца ID таблицы b_iblock_element является “ссылкой” на столбец IBLOCK_ELEMENT_ID таблицы b_iblock_element_prop_s3. И теперь можно в параметре select указать на выборку свойства ID=21.
$params = array(
‘filter’ => array(
“ID”=>$arId
),
‘select’ => array(
‘ID’,
‘PROPERTY_21′ =>’PROPERTY.PROPERTY_21’
),
);
$params[‘runtime’] = array(
‘PROPERTY’ => array(
‘data_type’ => ‘BitrixIblockIblockElementProperty’,
‘reference’ => array(‘=this.ID’ => ‘ref.IBLOCK_ELEMENT_ID’),
)
);
$rs = BitrixIblockElementTable::getList($params);
while($r = $rs->fetch())
{
$arResult[] = $r;
}
Подробнее как описываются поля здесь https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=4803
Так же хорошие статьи
https://tokmakov.msk.ru/blog/item/210
https://dev.1c-bitrix.ru/support/forum/forum6/topic88441/index.php
https://dev.1c-bitrix.ru/community/webdev/user/232354/blog/19113/
Источник