Bitrix Framework предоставляет мощные инструменты для работы с данными и их отображения на сайте. Одним из таких инструментов является возможность вывода пользовательских свойств элементов, связанных с основным элементом. В этой статье мы расскажем, как это сделать, на примере медицинского сайта.
На сайте имеются разделы Врачи и Направления, созданные на основе компонента Новости. Необходимо для детальных страниц врачей и раздела врачи вывести 2 пользовательских поля: Специализация и Стаж, а на страницах Направлений вывести врачей соответствующей специализации.
Для начала, давайте разберемся, что такое пользовательские свойства. Пользовательские свойства - это дополнительные данные, которые можно добавить к любому элементу в системе. Например, это могут быть характеристики товара, описание услуги, или любая другая информация, которую вы хотите сохранить.
Создание пользовательских свойств
В принципе само создание свойств процесс не сложный. На вкладке Свойства Инфоблока Врачи добавляем два новых поля. Обязательно указываем уникальный Код свойства и в окне Детальное редактирование свойства ставим галочки Показывать на странице списка элементов и Показывать на детальной странице элемента.
В настройках инфоблока Направления добавляем свойство Врачи с кодом AD_DOCTORS. Свойство будет множественным.
Вывод пользовательских свойств
Теперь, когда мы создали пользовательские свойства, давайте посмотрим, как их вывести на сайте.
В файл template.php шаблона списка раздела Врачи добавляем код:
<? if (!empty($arItem['PROPERTIES']['SPECIALNOST']['VALUE'])):?>
<span class="doc-pos"><?=$arItem['PROPERTIES']['SPECIALNOST']['VALUE']?></span>
<?endif?>
<? if (!empty($arItem['PROPERTIES']['AD_STAGE']['VALUE'])):?>
<br><span class="stage">стаж: <?=$arItem['PROPERTIES']['AD_STAGE']['VALUE']?></span>
<?endif?>
Данный код выводит HTML теги в случае, если пользовательские поля не пустые.
В файл template.php шаблона детальной страницы Врачи добавляем код:
<? if (!empty($arResult['PROPERTIES']['SPECIALNOST']['VALUE'])):?>
<h2><?=$arResult['PROPERTIES']['SPECIALNOST']['VALUE']?></h2>
<?endif?>
<? if (!empty($arResult['PROPERTIES']['AD_STAGE']['VALUE'])):?>
<h2>Стаж: <?=$arResult['PROPERTIES']['AD_STAGE']['VALUE']?></h2>
<?endif?>
Далее для элемента из раздела Направления в поле Врачи указываем связанные элементы, содержащие врачей соответствующей специальности.
В папке шаблона детальной страницы Направлений создаем (при отсутствии) файл result_modifier.php,
со следующим содержимым:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?
if (!empty($arResult['PROPERTIES']['AD_DOCTORS']['VALUE'])) {
$arSelect = array('ID', 'DETAIL_PAGE_URL', 'PROPERTY_SPECIALNOST', 'PROPERTY_AD_STAGE', 'PREVIEW_PICTURE', 'PREVIEW_TEXT', 'NAME');//здесь указываем свойства, которые необходимо выводить, ID – необходимо указывать всегда.
$res = CIBlockElement::GetList(
array(
'DATE_CREATE' => 'ASC'
),
array(
'ID' => $arResult['PROPERTIES']['AD_DOCTORS']['VALUE']
),
false,
false,
$arSelect
);
while($ob = $res->GetNext()){
$ob['PREVIEW_PICTURE_SRC'] = CFile::GetPath($ob['PREVIEW_PICTURE']);
$arResult['LINKED_NEWS'][] = $ob;
//var_dump($ob);
//print "<pre>"; print_r($ob); print "</pre>";
//любое из полей выше раскомментируем для тестирования вывода массива данных.
}
}
?>
В данном коде обращаем внимание на пользовательские поля. Они указываются как PROPERTY_*
, где вместо * используется код свойства из инфоблока: PROPERTY_SPECIALNOST
.
В файле template.php шаблона детальной страницы размещаем код:
<? if ($arResult["LINKED_NEWS"]):?>
<div class="doctors">
<h2>Прием ведут:</h2>
<div class="items-wrap">
<?foreach ($arResult["LINKED_NEWS"] as $arItem):?>
<!-- item -->
<div class="item-wrap">
<div class="item-doctor">
<a href="<?=$arItem["DETAIL_PAGE_URL"]?>" class=" doc-photo">
<img src="<?=$arItem["PREVIEW_PICTURE_SRC"]?>" alt="">
</a>
<a href="<?=$arItem["DETAIL_PAGE_URL"]?>" class="doc-title-wrap">
<span class="doc-wrap">
<span class="doc-title"><?echo $arItem["NAME"]?></span>
<? if (!empty($arItem['PROPERTY_SPECIALNOST_VALUE'])):?>
<span class="doc-pos"><?=$arItem['PROPERTY_SPECIALNOST_VALUE']?></span>
<?endif?>
<? if (!empty($arItem['PROPERTY_AD_STAGE_VALUE'])):?>
<br><span class="doc-pos stage">стаж: <?=$arItem['PROPERTY_AD_STAGE_VALUE']?></span>
<?endif?>
</span>
</a>
</div>
</div>
<!-- /item -->
<?endforeach;?>
</div></div><?endif?>
Вот что получаем на выходе:
Рекомендуемые материалы для изучения:
Описание используемого метода GetList:
https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php
Полезный материал от Михаила Базарова:
https://bazarow.ru/forum/forum10/774-vyvod-izobrazheniya-svyazannogo-elementa-v-detalnom-opisanii