Компоненты Битрикс. Создание простого компонента

В этой статье на простейшем примере будет описано создание компонентов для 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:

Рубрики блога

Вызов компонента

Теперь всё готово, осталось только вызвать наш компонент. Как мы помним, компоненты вызываются в публичной части сайта. Создадим прямо в корне сайта файл 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С-Битрикс.

Дата: 28 июля 2010
Теги: компоненты
Добавить в закладки:

Комментарии (17)

Александр, 22 Сентября 2010

У меня ошибка вот здесь: (всё сделал по инструкции) $db_list = CIBlockSection::GetList(array('NAME'=>'ASC'), $arFilter, true, array("ID", "NAME", "CODE"));

Александр Живетьев
Александр Живетьев, 22 Сентября 2010

Напишите, пожалуйста, какая именно ошибка

Andrey, 2 Октября 2010

У меня то же ошибка --> 'prmedia: sections.list' is not a component, подскажите пожалуйста как исправить??

Victor, 4 Октября 2010

Попробуйте обновить кеш компонентов

гость, 20 Октября 2010

каким образом инсталировать компоненты? можно на примерах разобрать этот вопрос

Сергей, 23 Октября 2010

Спасибо за материал!

Smolyar, 8 Ноября 2010

Перед CIBlockSection::GetList следует сделать вызов CModule::IncludeModule('iblock');

Add, 5 Декабря 2010

а, нет сори, кеш создается но все равно в этом примере правильнее использовать $cache_id = $arParams['ID'];

Стас, 11 Февраля 2011

А есть где-то общее описание компонентов и модулей? Что есть что... ка они отличаются друг от друга..

Matthew, 13 Февраля 2011

Хрошая статья

GTAlex, 16 Июня 2011

Код чуток не рабочий -
передаём IBLOCK_ID
"IBLOCK_ID" => 1

а обрабатываем ID
$iblock_id = $arParams['ID'];

собственно в component.php правим
$iblock_id = $arParams['IBLOCK_ID'];

и в темлейте я бы вывод $category['NAME'] не в title ссылки запихал, а в анкор - нагляднее

а в целом -
ОФИГЕННЫЙ ПРИМЕР !!!
ТО ЧТО НУЖНО !
СПАСИБО !

GTAlex, 16 Июня 2011

Про кэширование с удовольствием бы почитал Вашу статейку, пошерстил блог - не нашел.
Если такая статья есть - плс на мыло киньте ссылочку anubis3d@gmail.com

GTAlex, 16 Июня 2011

P.S. На счёт комплексных компонентов - тоже самое.

Diablo, 18 Октября 2011

Попа натуральная, нефига не пашет. Хотя в точности по инструкции. Статья нужная, исправьте бога ради ошибки.

Александр Живетьев
Александр Живетьев, 25 Октября 2011

Подправил ошибки в статье.

Людмила, 17 Декабря 2011

От всего сердца спасибо,особенно Smolyar,за строку:

"Перед CIBlockSection::GetList следует сделать вызов CModule::IncludeModule('iblock');" очень помогло,действительно работает!

Сергей, 21 Февраля 2012

Спасибо за хорошую статью! А ребятам которые жалуются что у них не работает советую напрячь ум и почитать документацию, посмотреть примеры готовых компонентов в битриксе.