Битрикс. Пользовательские свойства элемента инфоблока

19.10.2018

Теги: CMSWeb-разработкаБитриксИнфоблокПользовательскиеСвойстваЭлементИнфоблока

Информационный блок — модуль, позволяющий публиковать различные типы информации: товары, новости, статьи, фотографии. Поскольку нельзя заранее сказать, какие свойства потребуются для описания элемента инфоблока — в Битрикс предусмотрено создание пользовательских свойств, кроме предопределенных.

Давайте создадим пять пользовательских свойств разного типа и посмотрим, как их в дальнейшем получить из БД и вывести в шаблоне. В панели управления переходим на страницу добавления/редактирования инфоблока, вкладка «Свойства» и добавляем свойства

  • AUTHOR — автор публикации, тип «Строка»
  • RATING — рейтинг публикации, тип «Список»
  • GALLERY — прикрепленные изображения, тип «Файл»
  • UPDATE — дата обновления, тип «Дата»
  • NOTE — примечание к публикации, тип «HTML/Текст»

Теперь на странице добавления/редактирования элемента инфоблока мы можем задать значения этих свойств:

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

<?php
/*
 * Файл local/components/demo/iblock.element/component.php
 */
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();

if (!CModule::IncludeModule('iblock')) {
    ShowError('Модуль «Информационные блоки» не установлен');
    return;
}

/*...*/

if ($this->StartResultCache(false, ($arParams['CACHE_GROUPS']==='N' ? false: $USER->GetGroups()))) {

    // какие поля элемента инфоблока выбираем
    $arSelect = array(
        'ID',         // идентификатор элемента
        'NAME',       // название этого элемента
        /*...*/
        'PROPERTY_*', // пользовательские свойства
    );
    // условия выборки элемента инфоблока
    $arFilter = array(
        /*...*/
    );

    // выполняем запрос к базе данных
    $rsElement = CIBlockElement::GetList(
        array(),   // сортировка
        $arFilter, // фильтр
        false,     // группировка
        false,     // постраничная навигация
        $arSelect  // поля
    );

    // устанавливаем шаблоны путей для раздела и элемента
    $rsElement->SetUrlTemplates($arParams['ELEMENT_URL'], $arParams['SECTION_URL']);

    if ($obElement = $rsElement->GetNextElement()) {

        $arResult = $obElement->GetFields();

        // пользовательские свойства
        $arResult['PROPERTIES'] = $obElement->GetProperties();

        // получаем значения пользовательских свойств в удобном для отображения виде
        foreach ($arResult['PROPERTIES'] as $code => $data) {
            $arResult['DISPLAY_PROPERTIES'][$code] = CIBlockFormatProperties::GetDisplayValue($arResult, $data, '');
        }

        /*
         * Добавляем в массив arResult дополнительные элементы, которые могут потребоваться в шаблоне
         */

        /*...*/
    }
    
    if (isset($arResult['ID'])) {
        $this->SetResultCacheKeys(
            /*...*/
        );
        $this->IncludeComponentTemplate();
    } else {
        $this->AbortResultCache();
        \Bitrix\Iblock\Component\Tools::process404(
             /*...*/
        );
    }

}

Теперь массив $arResult имеет вид:

Array
(
    [ID] => 349
    [CODE] => afganskaya-borzaya
    [IBLOCK_ID] => 5
    [IBLOCK_SECTION_ID] => 28
    [NAME] => Афганская борзая
    [DETAIL_PICTURE] => 1011
    [DETAIL_TEXT] => Lorem ipsum dolor sit amet, consectetur adipiscing elit...
    [DETAIL_PAGE_URL] => /demo/item/id/349/
    [IBLOCK_TYPE_ID] => content
    [IBLOCK_CODE] => articles
    [SECTION_PAGE_URL] => /demo/category/id/28/
    ..........
    [PROPERTIES] => Array
        (
            [AUTHOR] => Array
                (
                    [ID] => 47
                    [IBLOCK_ID] => 5
                    [NAME] => Автор
                    [CODE] => AUTHOR
                    [PROPERTY_TYPE] => S
                    [PROPERTY_VALUE_ID] => 1
                    [VALUE] => Сергей Иванов
                    ..........
                )
            [RATING] => Array
                (
                    [ID] => 48
                    [IBLOCK_ID] => 5
                    [NAME] => Оценка
                    [CODE] => RATING
                    [PROPERTY_TYPE] => L 
                    [PROPERTY_VALUE_ID] => 2
                    [VALUE] => Интересно
                    ..........
                )
            [GALLERY] => Array
                (
                    [ID] => 49
                    [IBLOCK_ID] => 5
                    [NAME] => Галерея
                    [CODE] => GALLERY
                    [PROPERTY_TYPE] => F
                    [FILE_TYPE] => jpg, gif, bmp, png, jpeg
                    [PROPERTY_VALUE_ID] => Array
                        (
                            [0] => 3
                            [1] => 4
                            [2] => 5
                        )
                    [VALUE] => Array
                        (
                            [0] => 1034
                            [1] => 1035
                            [2] => 1036
                        )
                    ..........
                )
            [UPDATE] => Array
                (
                    [ID] => 50
                    [IBLOCK_ID] => 5
                    [NAME] => Дата обновления
                    [CODE] => UPDATE
                    [PROPERTY_TYPE] => S
                    [PROPERTY_VALUE_ID] => 6
                    [VALUE] => 19.10.2018
                    ..........
                )
            [NOTE] => Array
                (
                    [ID] => 51
                    [IBLOCK_ID] => 5
                    [NAME] => Примечание
                    [CODE] => NOTE
                    [PROPERTY_TYPE] => S
                    [PROPERTY_VALUE_ID] => 7
                    [VALUE] => Array
                        (
                            [TEXT] => Примечание к публикации...
                            [TYPE] => TEXT
                        )
                    ..........
                )
        )
   [DISPLAY_PROPERTIES] => Array
        (
            [AUTHOR] => Array
                (
                    [ID] => 47
                    [IBLOCK_ID] => 5
                    [NAME] => Автор
                    [CODE] => AUTHOR
                    [PROPERTY_TYPE] => S 
                    [PROPERTY_VALUE_ID] => 1
                    [VALUE] => Сергей Иванов 
                    [DISPLAY_VALUE] => Сергей Иванов
                    ..........
                )
            [RATING] => Array
                (
                    [ID] => 48
                    [IBLOCK_ID] => 5
                    [NAME] => Оценка
                    [CODE] => RATING
                    [PROPERTY_TYPE] => L
                    [PROPERTY_VALUE_ID] => 2
                    [VALUE] => Интересно
                    [DISPLAY_VALUE] => Интересно
                    ..........
                )
            [GALLERY] => Array
                (
                    [ID] => 49
                    [IBLOCK_ID] => 5
                    [NAME] => Галерея
                    [CODE] => GALLERY
                    [PROPERTY_TYPE] => F 
                    [FILE_TYPE] => jpg, gif, bmp, png, jpeg 
                    [PROPERTY_VALUE_ID] => Array
                        (
                            [0] => 3
                            [1] => 4
                            [2] => 5
                        )
                    [VALUE] => Array
                        (
                            [0] => 1034
                            [1] => 1035
                            [2] => 1036
                        )
                    [FILE_VALUE] => Array
                        (
                            [0] => Array
                                (
                                    [ID] => 1034
                                    [MODULE_ID] => iblock
                                    [HEIGHT] => 300
                                    [WIDTH] => 400
                                    [FILE_SIZE] => 33085
                                    [CONTENT_TYPE] => image/jpeg 
                                    [SRC] => /upload/iblock/ef1/ef1a80087669d483faa9c3db3441985a.jpg
                                    ..........
                                )
                            [1] => Array
                                (
                                    [ID] => 1035
                                    [MODULE_ID] => iblock
                                    [HEIGHT] => 300
                                    [WIDTH] => 400
                                    [FILE_SIZE] => 45306
                                    [CONTENT_TYPE] => image/jpeg
                                    [SRC] => /upload/iblock/b96/b96bb594c3bc5580a972f993e05f7317.jpg
                                    ..........
                                )
                            [2] => Array
                                (
                                    [ID] => 1036
                                    [MODULE_ID] => iblock
                                    [HEIGHT] => 300
                                    [WIDTH] => 400
                                    [FILE_SIZE] => 24919
                                    [CONTENT_TYPE] => image/jpeg 
                                    [SRC] => /upload/iblock/18c/18ca914388b75729618a412afd3f464b.jpg
                                    ..........
                                )
                        )
                )
            [UPDATE] => Array
                (
                    [ID] => 50
                    [IBLOCK_ID] => 5
                    [NAME] => Дата обновления
                    [CODE] => UPDATE
                    [PROPERTY_TYPE] => S
                    [PROPERTY_VALUE_ID] => 6
                    [VALUE] => 19.10.2018
                    [DISPLAY_VALUE] => 19.10.2018
                    ..........
                )
            [NOTE] => Array
                (
                    [ID] => 51
                    [IBLOCK_ID] => 5
                    [NAME] => Примечание
                    [CODE] => NOTE
                    [PROPERTY_TYPE] => S
                    [PROPERTY_VALUE_ID] => 7
                    [VALUE] => Array
                        (
                            [TEXT] => Примечание к публикации...
                            [TYPE] => TEXT
                        )
                    [DISPLAY_VALUE] => Примечание к публикации...
                    ..........
                )
        )
)

Все готово, можем показать пользовательские свойства в шаблоне:

<?php
/*
 * Файл local/components/demo/iblock.element/templates/.default/template.php
 */
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();

$this->setFrameMode(true);
?>

<h1><?php $APPLICATION->ShowTitle(false); /* Выводим «Заголовок страницы» */ ?></h1>

<article id="iblock-element">

    <?php if (!empty($arResult['DETAIL_PICTURE'])): /* детальная картинка элемента инфоблока */ ?>
        <img src="<?= $arResult['DETAIL_PICTURE']['SRC']; ?>"
             alt="<?= $arResult['DETAIL_PICTURE']['ALT']; ?>"
             title="<?= $arResult['DETAIL_PICTURE']['TITLE']; ?>" />
    <?php endif; ?>

    <?php if (!empty($arResult['DETAIL_TEXT'])): /* детальная информация об элементе инфоблока */ ?>
        <div id="iblock-element-detail">
        <?= $arResult['DETAIL_TEXT']; ?>
        </div>
    <?php endif; ?>

    <?php if (!empty($arResult['DISPLAY_PROPERTIES']['GALLERY']['FILE_VALUE'])): /* галерея для элемента инфоблока */ ?>
        <div id="iblock-element-gallery">
        <?php foreach ($arResult['DISPLAY_PROPERTIES']['GALLERY']['FILE_VALUE'] as $item): ?>
            <a href="<?= $item['SRC']; ?>"><img src="<?= $item['SRC']; ?>" alt="" /></a>
        <?php endforeach; ?>
        </div>
    <?php endif; ?>

    <?php if (!empty($arResult['PROPERTIES']['NOTE']['VALUE']['TEXT'])): /* примечание к элементу инфоблока */ ?>
        <div id="iblock-element-note">
            <h3>Примечание</h3>
            <div>
            <?php if ($arResult['PROPERTIES']['NOTE']['VALUE']['TYPE'] == 'HTML'): ?>
                <?= $arResult['PROPERTIES']['NOTE']['VALUE']['TEXT']; ?>
            <?php else: ?>
                <?= nl2br($arResult['PROPERTIES']['NOTE']['VALUE']['TEXT']); ?>
            <?php endif; ?>
            </div>
        </div>
    <?php endif; ?>
    
    <p>Автор публикации: <?= $arResult['PROPERTIES']['AUTHOR']['VALUE']; /* автор публикации */ ?></p>
    <p>Оценка читателей: <?= $arResult['PROPERTIES']['RATING']['VALUE']; /* рейтинг публикации */ ?></p>
    <p>Количество просмотров: <?= $arResult['SHOW_COUNTER'] ? $arResult['SHOW_COUNTER'] : 0; ?></p>
    <p><a href="<?= $arResult['SECTION']['SECTION_PAGE_URL']; ?>">Назад в раздел</a></p>

</article>

Поиск: CMS • Web-разработка • Битрикс • Инфоблок • Пользовательские свойства • Элемент инфоблока

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.