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

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

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

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

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

Artem, 29 Мая 2013

Третий параметр должен выставлен в значение false, или в нём должен передатся массив с параметрами
Третий параметр должен выставлен в значение false, или в нём должен передатся массив с параметрами

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

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

Andrey, 2 Октября 2010

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

Victor, 4 Октября 2010

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

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

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

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

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

Smolyar, 8 Ноября 2010

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

Add, 5 Декабря 2010

а, нет сори, кеш создается но все равно в этом примере правильнее использовать $cache_id = $arParams['ID'];
а, нет сори, кеш создается но все равно в этом примере правильнее использовать $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 ссылки запихал, а в анкор - нагляднее

а в целом -
ОФИГЕННЫЙ ПРИМЕР !!!
ТО ЧТО НУЖНО !
СПАСИБО !
Код чуток не рабочий - передаём 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
Про кэширование с удовольствием бы почитал Вашу статейку, пошерстил блог - не нашел. Если такая статья есть - плс на мыло киньте ссылочку anubis3d@gmail.com

GTAlex, 16 Июня 2011

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

Diablo, 18 Октября 2011

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

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

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

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

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

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

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

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

Арман, 13 Июня 2012

не работает. выдает 'prmedia:sections.list' is not a component
не работает. выдает 'prmedia:sections.list' is not a component

Игорь, 28 Июня 2012

Проверьте путь в случае prmedia:sections.list должно быть /bitrix/component/prmedia/sections.list, любая оппечатка приводит к такой ошибке.
Проверьте путь в случае prmedia:sections.list должно быть /bitrix/component/prmedia/sections.list, любая оппечатка приводит к такой ошибке.

Дмитрий, 22 Июля 2012

Вот такой вопрос образовался: сейчас компонент выводит список всех рубрик. У меня несколько уровней этих рубрик. Как вывести не все рубрики, а только один уровень?
Вот такой вопрос образовался: сейчас компонент выводит список всех рубрик. У меня несколько уровней этих рубрик. Как вывести не все рубрики, а только один уровень?

Александр Живетьев
Александр Живетьев, 24 Июля 2012

В файле component.php есть массив $arFilter. Вам нужно задать его таким образом, чтобы выводились только необходимые разделы (поля разделов инфоблоков описаны в документации).
В файле component.php есть массив $arFilter. Вам нужно задать его таким образом, чтобы выводились только необходимые разделы (поля разделов инфоблоков описаны в документации).

Алексей, 28 Августа 2013

Здравствуйте, подскажите пожалуйста что необходимо дописать/сделать чтобы элементы инфоблока имели каждый свое свойство?
Здравствуйте, подскажите пожалуйста что необходимо дописать/сделать чтобы элементы инфоблока имели каждый свое свойство?

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

Здравствуйте, Алексей. Так сделать нельзя и, в общем-то, не совсем ясно, для чего это нужно. Вероятно, вам нужно выбрать какой-то другой способ решения задачи.
Здравствуйте, Алексей. Так сделать нельзя и, в общем-то, не совсем ясно, для чего это нужно. Вероятно, вам нужно выбрать какой-то другой способ решения задачи.


Администратор запретил оставлять комментарии