В этой статье на простейшем примере будет описано создание компонентов для 1С-Битрикс. Как они устроены и почему нужно их использовать.
Немного теории
Хелп Битрикса говорит, что компонент - это некоторый блок, с помощью которого строится публичная часть сайта. Примеры компонентов - регистрация пользователя, список новостей, форма обратной связи и т.д. Как правило, у компонентов есть некие параметры. Например, для списка новостей это может быть порядок сортировки (по дате, в прямом или обратном порядке и т.д), отображаемые свойства (автор, дата, картинка для анонса новости).
Компонеты 2.0 (старые версии рассматривать не будем) позволяют разделить логику и представление - это первый большой плюс использования компонентов. Второй большой плюс - это возможность использования кеширования.
Практика
Лучше сразу приступить к практике и попробовать что-нибудь сделать. Поставим себе самую простую задачу - пусть наш компонент должен будет выводить список разделов инфоблока. Это задача вряд ли на практике где-то пригодится, но зато она очень проста и поможет разобраться в том, как вообще устроены компоненты 1С-Битрикс.
Структура компонента
В каталоге /bitrix/components/ создадим новый каталог, в котором будут хранится наши компоненты. Я назвал его prmedia. Теперь создадим каталог для нашего компонента /bitrix/components/prmedia/sections.list/. Обычно структура папок и файлов компонента выглядит так:
- - help
- - images
- - lang
- - templates
- .description.php
- .parameters.php
- component.php
Рассмотрим всё это по порядку. В папке help обычно лежит файл .tooltips.php, содержащий массив всплывающих подсказок для настроек компонента. Не будем на нём останавливаться, пример этого файла можно посмотреть в других компонентах. В папке images обычно лежит иконка компонента. В папке lang лежат подпапки для языковых параметров компонента. В папке templates - все шаблоны компонента. Можно сразу сделать дефолтных шаблон для нашего компонета. Полный путь до него будет выглядеть так: /bitrix/components/prmedia/sections.list/templates/.default/template.php. Вставим туда пока одну единственную строчку "Это дефолтный шаблон компонента prmedia:sections.list".
Поместим в файл .description.php следующий код:
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"NAME" => 'Prmedia: список разделов инфоблока',
"DESCRIPTION" => 'Список разделов инфоблока',
"ICON" => "/images/sections_list.gif",
"CACHE_PATH" => "Y",
"PATH" => array(
"ID" => "utility",
),
);
?>
Ничего сложного - просто массив с описанием компонента.
Следующий файл - .parameters.php:
<? if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die();
$arComponentParameters = array(
'PARAMETERS' => array(
'IBLOCK_ID' => array(
'NAME' => 'Id инфоблока',
'TYPE' => 'STRING',
'MULTIPLE' => 'N',
'PARENT' => 'BASE',
),
'CACHE_TIME' => array('DEFAULT'=>3600),
),
);
?>
Этот файл лучше рассмотреть более подробно. Ключ PARAMETERS массива $arComponentParameters представляет собой массив с описанием параметров. Пусть у нашего компонента будет только один параметр - IBLOCK_ID (ID инфоблока, из которого мы будем выводить разделы). Ключи NAME - название параметра, TYPE - тип, MULTIPLE - множественность (если 'Y', то наш параметр сможет принимать массив значений), PARENT - родитель (параметры можно делить на группы. В этой статье не рассматривается). Обратите внимание на второй параметр CACHE_TIME - он дефолтный для компонентов Битрикса и устанавливает время кеширования.
Из массива $arComponentParameters будет сгенерирован массив $arParams, который будет использоваться в основном файле нашего компонента - component.php
Содержание файла component.php:
<?
if(!defined("B_PROLOG_INCLUDED")||B_PROLOG_INCLUDED!==true)die();
// echo ''; print_r($arParams); echo '
';
CModule::IncludeModule('iblock');
if ($this->StartResultCache(3600))
{
$iblock_id = $arParams['IBLOCK_ID'];
$arFilter = array('IBLOCK_ID'=>$iblock_id);
$db_list = CIBlockSection::GetList(array('NAME'=>'ASC'), $arFilter, true, array("ID", "NAME", "CODE"));
while($ar_result = $db_list->GetNext())
{
$arResult[] = array(
"ID" => $ar_result['ID'],
"CODE" => $ar_result['CODE'],
"NAME" => $ar_result['NAME'],
"ELEMENT_CNT" => $ar_result['ELEMENT_CNT']
);
}
// echo ''; print_r($arResult); echo '
';
$this->IncludeComponentTemplate();
}
?>
В файле component.php содержится вся логика компонента. Задача этого файла - сформировать из полученных параметров ($arParams) массив $arResult, который впоследствии попадет в шаблон компонента. Обратите внимание на два комментария. Раскомментировав их, вы всегда сможете наблюдать за тем, какие параметры приходят в компонент, и какой результат получает шаблон.
Сам код нашего компонента не сложен - в зависимости от полученого параметра (ID инфоблока) мы делаем выборку разделов и сохраняем их в массив $arResult. Следует обратить внимание на вызов метода $this->StartResultCache(). Он проверяет, есть ли у нашего компонента актуальный кеш. Если он есть, то выводится информация из кеша. Следовательно, запроса к базе нету, массив $arResult не генерируется, и даже шаблон не подлючается (метод $this->IncludeComponentTemplate()).
Шаблон компонента
Следующий шаг - создание шаблона для компонента. Шаблон принимает массив $arResult, сгенерированный в файле component.php и выводит его содержимое в браузер. Поправим файл /bitrix/components/prmedia/sections.list/templates/.default/template.php:
Рубрики блога
-
<? foreach($arResult as $category): ?>
- <?=$category['NAME']?> (<?= $category['ELEMENT_CNT']?>) <? endforeach; ?>
Вызов компонента
Теперь всё готово, осталось только вызвать наш компонент. Как мы помним, компоненты вызываются в публичной части сайта. Создадим прямо в корне сайта файл test.php:
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->IncludeComponent("prmedia:sections.list", ".default", array(
"IBLOCK_ID" => 1
),
false);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
?>
Подставьте в этот код ID какого-нибудь инфоблока, в котором есть разделы, и выполните скрипт в браузере.
Что дальше
В статье не рассмотрены группировка параметров компонента, создание комплексных компонентов и многое другое. Кеширование рассмотренно не подробно. Возможно, я напишу статьи на эти темы позже. Цель данной статьи - просто получить общее представление о создании компонентов для 1С-Битрикс.



Комментарии (17)
передаём IBLOCK_ID
"IBLOCK_ID" => 1
а обрабатываем ID
$iblock_id = $arParams['ID'];
собственно в component.php правим
$iblock_id = $arParams['IBLOCK_ID'];
и в темлейте я бы вывод $category['NAME'] не в title ссылки запихал, а в анкор - нагляднее
а в целом -
ОФИГЕННЫЙ ПРИМЕР !!!
ТО ЧТО НУЖНО !
СПАСИБО !
Если такая статья есть - плс на мыло киньте ссылочку anubis3d@gmail.com
"Перед CIBlockSection::GetList следует сделать вызов CModule::IncludeModule('iblock');" очень помогло,действительно работает!