Пользовательские свойства элемента инфоблока
Информационный блок — модуль, позволяющий публиковать различные типы информации: товары, новости, статьи, фотографии. Поскольку нельзя заранее сказать, какие свойства потребуются для описания элемента инфоблока — в Битрикс предусмотрено создание пользовательских свойств, кроме предопределенных.
Давайте создадим два пользовательских свойства одного типа и посмотрим, как их в дальнейшем получить из БД и вывести в шаблоне. В панели управления переходим на страницу добавления/редактирования инфоблока, вкладка «Свойства» и добавляем свойства:
Нативные компоненты Битрикс в настройках позволяют указать, какие пользовательские свойства должны быть доступны в шаблоне. Мы сделаем это сами:
<?
/*
* Файл component.php
*/
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
// время кеширования
if (!isset($arParams['CACHE_TIME'])) {
$arParams['CACHE_TIME'] = 3600;
} else {
$arParams['CACHE_TIME'] = intval($arParams['CACHE_TIME']);
}
// если нет валидного кеша получаем данные из БД
if ($this->StartResultCache()) {
// проверяем, установлен ли модуль «Информационные блоки»
if (!CModule::IncludeModule('iblock')) {
return;
}
// создаем пустой массив arResult
$arResult = Array ();
// получаем данные из базы
$res = CIBlockElement::GetList(
array("ACTIVE_FROM"=>"desc"),
array("ID"=>$arParams["ELEMENT_ID"], "ACTIVE"=>"Y"),
false,
array(),
array("IBLOCK_ID", "ID", "NAME", "DETAIL_PICTURE", "PROPERTY_*")
);
// получаем из выборки объект
if ($obElement = $res->GetNextElement()) {
// дефолтные свойства
$arResult = $obElement->GetFields();
// пользовательские свойства
$arResult['PROPERTIES'] = $obElement->GetProperties();
// получаем значения пользовательских свойств в удобном для отображения виде
foreach ($arResult['PROPERTIES'] as $code => $data) {
// помогаем показать значения свойства элемента
$arResult['DISPLAY_PROPERTIES'][$code] = CIBlockFormatProperties::GetDisplayValue($arResult, $data, '');
}
// расширенный вывод детальной картинки
$arResult["DETAIL_PICTURE"] = CFile::GetFileArray($arResult["DETAIL_PICTURE"]);
}
// кэш не затронет весь код ниже, он будут выполняться на каждом хите, но здесь работаем уже с другим $arResult — будут
доступны только те ключи массива, которые перечислены в вызове SetResultCacheKeys()
if (isset($arResult['ID'])) {
// ключи $arResult, перечисленные при вызове этого метода, будут доступны в component_epilog.php и ниже по коду.
Обратите внимание, там уже будет другой $arResult
$this->SetResultCacheKeys(
array(
)
);
// подключаем шаблон и сохраняем кеш
$this->IncludeComponentTemplate();
} else { // если выяснилось что кешировать данные не требуется, прерываем кеширование и выдаем сообщение, что такой
страницы нет
$this->AbortResultCache();
\Bitrix\Iblock\Component\Tools::process404(
'Страница не найдена',
true,
true
);
}
};
Теперь массив $arResult
имеет вид:
Array
(
[IBLOCK_ID] => 1
[~IBLOCK_ID] => 1
[ID] => 1
[~ID] => 1
[NAME] => Index
[~NAME] => Index
[DETAIL_PICTURE] => Array
(
[ID] => 441
[TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
(
[value:protected] => DateTime Object
(
[date] => 2022-01-22 11:04:52.000000
[timezone_type] => 3
[timezone] => Europe/Moscow
)
)
[MODULE_ID] => iblock
[HEIGHT] => 700
[WIDTH] => 1600
[FILE_SIZE] => 55651
[CONTENT_TYPE] => image/jpeg
[SUBDIR] => medialibrary/68e/dznj3ihulu191wv9g25lvt33xpvhj1sa
[FILE_NAME] => index.jpg
[ORIGINAL_NAME] => index.jpg
[DESCRIPTION] => Главная страница
[HANDLER_ID] =>
[EXTERNAL_ID] => 4901138e93215742328799d56f926056
[~src] =>
[SRC] => /upload/medialibrary/68e/dznj3ihulu191wv9g25lvt33xpvhj1sa/index.jpg
)
[~DETAIL_PICTURE] => 441
[ACTIVE_FROM] => 01.12.2021 21:02:36
[~ACTIVE_FROM] => 01.12.2021 21:02:36
[PROPERTIES] => Array
(
[ID_1_ZAGOLOVOK] => Array
(
[ID] => 1
[TIMESTAMP_X] => 2021-12-02 11:48:22
[IBLOCK_ID] => 1
[NAME] => Заголовок
[ACTIVE] => Y
[SORT] => 500
[CODE] => ID_1_ZAGOLOVOK
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 5
[COL_COUNT] => 50
[LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 2
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 1:1
[VALUE] => <span>Экстренно!</span> Поднимите продажи своего бизнеса
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
[~VALUE] => Экстренно! Поднимите продажи своего бизнеса
[~DESCRIPTION] =>
[~NAME] => Заголовок
[~DEFAULT_VALUE] =>
)
[ID_1_TEXT] => Array
(
[ID] => 2
[TIMESTAMP_X] => 2021-12-02 11:48:22
[IBLOCK_ID] => 1
[NAME] => Текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => ID_1_TEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 5
[COL_COUNT] => 50
[LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 2
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 1:2
[VALUE] => <span>Мой подход</span> - интернет маркетинг должен быть с жесткой привязкой к продажам здесь и сейчас. В процессе сотрудничества будут достигнуты конкретные цели, выраженные в Вашей прибыли!
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
[~VALUE] => Мой подход - интернет маркетинг должен быть с жесткой привязкой к продажам здесь и сейчас. В процессе сотрудничества будут достигнуты конкретные цели, выраженные в Вашей прибыли!
[~DESCRIPTION] =>
[~NAME] => Текст
[~DEFAULT_VALUE] =>
)
)
[DISPLAY_PROPERTIES] => Array
(
[ID_1_ZAGOLOVOK] => Array
(
[ID] => 1
[TIMESTAMP_X] => 2021-12-02 11:48:22
[IBLOCK_ID] => 1
[NAME] => Заголовок
[ACTIVE] => Y
[SORT] => 500
[CODE] => ID_1_ZAGOLOVOK
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 5
[COL_COUNT] => 50
[LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 2
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 1:1
[VALUE] => <span>Экстренно!</span> Поднимите продажи своего бизнеса
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
[~VALUE] => Экстренно! Поднимите продажи своего бизнеса
[~DESCRIPTION] =>
[~NAME] => Заголовок
[~DEFAULT_VALUE] =>
[DISPLAY_VALUE] => <span>Экстренно!</span> Поднимите продажи своего бизнеса
)
[ID_1_TEXT] => Array
(
[ID] => 2
[TIMESTAMP_X] => 2021-12-02 11:48:22
[IBLOCK_ID] => 1
[NAME] => Текст
[ACTIVE] => Y
[SORT] => 500
[CODE] => ID_1_TEXT
[DEFAULT_VALUE] =>
[PROPERTY_TYPE] => S
[ROW_COUNT] => 5
[COL_COUNT] => 50
[LIST_TYPE] => L
[MULTIPLE] => N
[XML_ID] =>
[FILE_TYPE] =>
[MULTIPLE_CNT] => 5
[TMP_ID] =>
[LINK_IBLOCK_ID] => 0
[WITH_DESCRIPTION] => N
[SEARCHABLE] => N
[FILTRABLE] => N
[IS_REQUIRED] => N
[VERSION] => 2
[USER_TYPE] =>
[USER_TYPE_SETTINGS] =>
[HINT] =>
[PROPERTY_VALUE_ID] => 1:2
[VALUE] => <span>Мой подход</span> - интернет маркетинг должен быть с жесткой привязкой к продажам здесь и сейчас. В процессе сотрудничества будут достигнуты конкретные цели, выраженные в Вашей прибыли!
[DESCRIPTION] =>
[VALUE_ENUM] =>
[VALUE_XML_ID] =>
[VALUE_SORT] =>
[~VALUE] => Мой подход - интернет маркетинг должен быть с жесткой привязкой к продажам здесь и сейчас. В процессе сотрудничества будут достигнуты конкретные цели, выраженные в Вашей прибыли!
[~DESCRIPTION] =>
[~NAME] => Текст
[~DEFAULT_VALUE] =>
[DISPLAY_VALUE] => <span>Мой подход</span> - интернет маркетинг должен быть с жесткой привязкой к продажам здесь и сейчас. В процессе сотрудничества будут достигнуты конкретные цели, выраженные в Вашей прибыли!
)
)
)
Все готово, можем показать пользовательские свойства в шаблоне:
<?
/*
* Файл template.php
*/
?>
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); ?>
<?
// редактирования и удаления элемента
$arButtons = CIBlock::GetPanelButtons(
$arResult["IBLOCK_ID"], // идентификатор инфоблока, которому принадлежит элемент
$arResult["ID"], // идентификатор текущего элемента информационного блока
0, // идентификатор раздела инфоблока (при наличии)
array("SECTION_BUTTONS"=>false, "SESSID"=>false) //массив, содержащий локализацию названий
);
// ссылка в arResult на изменение эллемента
$arResult["EDIT_LINK"] = $arButtons["edit"]["edit_element"]["ACTION_URL"];
// ссылка в arResult на добавление эллемента
$arResult["EDIT_ADD"] = $arButtons["edit"]["add_element"]["ACTION_URL"];
// ссылка в arResult на удаление эллемента
$arResult["DELETE_LINK"] = $arButtons["edit"]["delete_element"]["ACTION_URL"];
// экшен изменения элемента
$this->AddEditAction(
$arResult["ID"], // идентификатор текущего элемента инфоблока блока
$arResult['EDIT_LINK'], // ссылка в arResult на изменяемый эллемент
CIBlock::GetArrayByID( // возвращает массив полей инфоблока
$arResult["IBLOCK_ID"], "ELEMENT_EDIT"
)
);
// экшен добавления элемента
$this->AddEditAction(
$arResult["ID"], // идентификатор текущего элемента инфоблока блока
$arResult["EDIT_ADD"], // ссылка в arResult на добавляемый эллемент
CIBlock::GetArrayByID( // возвращает массив полей инфоблока
$arResult["IBLOCK_ID"], "ELEMENT_ADD"
)
);
// экшен удаления элемента
$this->AddDeleteAction(
$arResult["ID"], // идентификатор текущего элемента инфоблока блока
$arResult['DELETE_LINK'], // ссылка в arResult на удаляемый эллемент
CIBlock::GetArrayByID( // возвращает массив полей инфоблока и выводит предуприждение
$arResult["IBLOCK_ID"], "ELEMENT_DELETE"),
array("CONFIRM" => "Удалить?")
);
?>
<?
// проверка на администратора
if($USER->IsAdmin() && $APPLICATION->GetShowIncludeAreas()) {
echo '<section id="' . $this->GetEditAreaId($arResult["ID"]) . '">';
} else {
echo '<section>';
}
?>
<div class="main" style="background: url('<?=$arResult["DETAIL_PICTURE"]["SRC"]?>')">
<div class="container">
<div class="row">
<div class="col-12 col-lg-9 col-xl-8">
<div class="title">
<h1><?=$arResult["PROPERTIES"]["ID_1_ZAGOLOVOK"]["~VALUE"]?></h1>
</div>
<div class="tekst"><?=$arResult["PROPERTIES"]["ID_1_TEXT"]["~VALUE"]?></div>
<div class="svyaz">
<a href="#" class="btn open_modal" data-modal-open="forma">ОСТАВИТЬ ЗАЯВКУ</a>
</div>
</div>
</div>
</div>
</div>
</section>