Дата последнего изменения: 24.10.2020
Вот как выглядит типичная попытка начинающего разработчика осуществить выборку из Информационного блока в явном виде в теле страницы:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Прямой вызов API Битрикса на странице"); ?> <h1><?=$APPLICATION->ShowTitle()?></h1> <div class="box"> <? $IBLOCK_ID = intval($arParams['IBLOCK_ID']); if ($IBLOCK_ID <=0) $IBLOCK_ID = 1; if(!CModule::IncludeModule("iblock")) die('iblock module is not included!'); //делаем выборку из Инфоблока $arSort = Array("SORT"=>"ASC", "NAME"=>"ASC"); $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID,"ACTIVE"=>"Y"); $obIBlockResult = CIBlockElement::GetList($arSort, $arFilter); //выводим результат выборки в виде списка echo "<ol>"; while($arFields = $obIBlockResult->GetNext()) { echo "<li>{$arFields["NAME"]}</li>"; } echo "</ol>"; ?> </div> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Основных проблем несколько:
Эти проблемы можно решить поместив код в шаблон пустого компонента, не потеряв при этом в скорости разработки за счет использования правильных инструментов.
Предлагается использовать result_modifier.php, который находится в папке шаблона компонента и изначально предназначен для модификации массива $arResult
перед его выводом в файле шаблона template.php.
Рассмотрим классическую схему работы компонента с result_modifier.php в шаблоне, представленную на рисунке:
В данном случае, в result_modifier.php будет помещен непосредственно код, который до этого планировалось разместить прямо на странице.
Общая схема решения выглядит следующим образом:
$arResult
, который и будет выводиться в шаблоне.)Пример кода страницы:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Компонентный подход: вызов API Битрикса в шаблоне компонента"); ?> <h1><?=$APPLICATION->ShowTitle()?></h1> <div class="box"> <? //задаем Инфоблок $IBLOCK_ID = 1; //подключаем пустой компонент, где логика лежит в шаблоне get_list в файле result_modifier.php $APPLICATION->IncludeComponent( "bitrixonrails:system.empty", "get_list", Array( "IBLOCK_ID" => $IBLOCK_ID, "CACHE_TYPE" => "A", "CACHE_TIME" => "3600" ), false );?> </div> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Перенесенный в result_modifier.php исходный код:
<? //получаем идентификатор Инфоблока из параметров компонента $IBLOCK_ID = intval($arParams['IBLOCK_ID']); if ($IBLOCK_ID <=0) $IBLOCK_ID = 1; if(!CModule::IncludeModule("iblock")) die('iblock module is not included!'); //делаем выборку из Инфоблока $arSort = Array("SORT"=>"ASC", "NAME"=>"ASC"); $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID,"ACTIVE"=>"Y"); $obIBlockResult = CIBlockElement::GetList($arSort, $arFilter); //выводим результат выборки в виде списка echo "<ol>"; while($arFields = $obIBlockResult->GetNext()) { echo "<li>{$arFields["NAME"]}</li>"; } echo "</ol>"; ?>
Если необходимы и другие вставки кода, то просто создается новый шаблон (можно просто копированием шаблона get_list) и в его result_modifier.php вставляется нужный код. В результате получается множество шаблонов ("квази-компонентов"), каждый из которых соответствует исходной странице.