Bitrix PHP

Разработка компонента для CMS Битрикс (статья в журнале Веб-Аналитик.ИНФО, май 2010)

Введение

Не будем лишний раз заниматься рекламой и продвижением CMS 1С-Битрикс в массы. Отдел маркетинга компании Битрикс отлично справляется с этим и без нашего участия — CMS 1C-Битрикс много лет и по сей день является самой продаваемой коммерческой системой управления сайтом в России. А также у 1С-Битрикс есть огромная армия поклонников в лице вебстудий-партнеров.

Но я хочу поговорить о стиле программирования под Битрикс. Как ни странно это звучит, но «программирование под Битрикс» — это не просто php-программирование: это понятие включает конечно же и php-код, но больше это все-таки определенные ограничения и понятия самой платформы Битрикс, как фреймворка. И основным таким понятием является «кирпичик» платформы — компонент Битрикс.

В незапамятные времена, лет 5 назад в Битрикс были лишь простые компоненты — так называемые WEB 1.0 (в последних версиях Битрикс их уже и не видно). Эти компоненты по сути были структурами, которые подключались в коде вывода страницы как файлы. Мы ими интересоваться не будем — не станем ворошить прошлое. Нам интересны компоненты WEB 2.0 и мы попробуем вместе с вами сделать один такой компонент.

В компонентах WEB 2.0, которые используются в данный момент в Битрикс, можно легко разделить логику и представление, для одной и той же логики может быть множество представлений. Весь код компонента, включая шаблоны, языковые файлы, находится в одной папке, что, естественно, облегчает жизнь при переносе каких-либо компонентов между проектами.

Структура компонента Битрикс

Из чего же состоит компонент Битрикс? Компонент Битрикс — это папка с определенной структурой файлов и подпапок. Вот собственно и она:

Папка или файл Обязательность Описание
Папки
help Может отсутствовать В этой папке находятся файлы для обеспечения помощи по компоненту
install Может отсутствовать Могут находится скрипты инсталляции/деисталляциии компонента (install.php / uninstall.php)
lang Может отсутствовать Нужна для поддержки мультиязычности в компоненте
templates Может отсутствовать Папка с шаблонами вывода компонента
Файлы
component.php Обязателен Содержит код компонента
.description.php Обязателен Содержит название, описание компонента, а также код размещения в визуальном редакторе Битрикс.
.parameters.php Может отсутствовать Содержит описание входных параметров компонента

Как вы, наверное, заметили обязательных файлов у компонента всего 2 — component.php и .description.php

Скажем еще пару слов о том где компоненты физически находятся в системе и о таком понятии как пространствах имен компонентов. Физически компоненты должны находится в папке /bitrix/components/, либо в подпапках этой папки. Для компонентов, которые поставляются вместе с CMS Битрикс выделена подпапка bitrix ( /bitrix/components/bitrix/) — изменять там компоненты или писать свои туда не стоит. Лучше всего создать свою подпапку. Каждая из этих подпапок в папке /bitrix/components/ образует свое пространство имен.

Пример создания компонента

готовим php-код компонента

В качестве примера сделаем компонент, который выводит текущую дату и время. Причем формат вывода даты и времени задается выбором в свойствах. Взяли такой пример исключительно в методических целях, в реальных условиях такой компонент скорее всего будет неинтересен. Но на этом примере мы опишем как выполняется разработка компонента. В более сложных случаях все реализуется похожим образом.

Итак, начинаем. И давайте сразу напишем php-код, который выполняет, то что мы описали.

< ? echo date('Y-m-d'); ?>

Правда код просто выводит дату и нельзя выбрать другой формат. Лучше поместить в переменную формат вывода даты.

< ? $format = 'Y-m-d'; echo date($format); ?>

И последний штрих — нужно разделить логику и представление:

< ? // параметры $format = 'Y-m-d'; // логика $d = date($format); // представление echo $d; ?>

делаем структуру папок и файлов компонента

Php-код мы подготовили — теперь нужно создать свое пространство имен. Например, dv — не знаю почему я люблю это сочетание символов. Для этого надо создать папку /bitrix/components/dv . В ней делаем папку компонента — date.current . И в ней, в свою очередь, создаем 2 необходимых файла и папку для хранения шаблонов templates. В папке tempates.php должна быть создана папка .default и в ней template.php .

Получаем такую структуру в папке /bitrix/components/dv/date.current :

component.php
.description.php
templates/.default/template.php

Реализуем компонент без входных параметров

Пока сделаем компонент без возможности задания входного параметра — формата даты.

Содержимое файлов:

component.php
< ?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); $arResult['DATE'] = date('Y-m-d'); $this->IncludeComponentTemplate();
?>

templates/.default/template.php
< ?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
Текущая дата

.description.php
< ? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentDescription = array( "NAME" => GetMessage(«Текущая дата»),
«DESCRIPTION» => GetMessage(«Выводим текущую дату»),
);
?>

Как вы могли заметить в каждом из файлов компонента в начале пишется строка if (!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true) die(); она нужна для того, чтобы данные файлы нельзя было вызвать напрямую из окна браузера.

В простейшем виде компонент готов — его можно вызвать в коде страниц при помощи конструкции:

< ? $APPLICATION->IncludeComponent(
«dv:date.current»,
«.default»,
Array(
),
false
);?>

Реализуем компонент с входными параметрами

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

Для того, чтобы наш компонент появился в визуальном редакторе нужно дополнить файл описания компонента.

.description.php
< ? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentDescription = array( "NAME" => GetMessage(«Текущая дата»),
«DESCRIPTION» => GetMessage(«Выводим текущую дату»),
«PATH» => array(
«ID» => «dv_components»,
«CHILD» => array(
«ID» => «curdate»,
«NAME» => «Текущая дата»
)
),
«ICON» => «/images/icon.gif»,
);
?>

Для размещения компонента в дереве компонентов мы добавили элемент массива описания PATH. Таким образом наш компонент будет показан в отдельной папке. Опционально, можно задать иконку компонента — она будет показываться в дереве и в визуальном редакторе.

Разберемся с опциями компонента. Будем считать, что опцию шаблон даты мы будем задавать строкой. Создаем файл .parameters.php с таким содержанием:

< ? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arComponentParameters = array( "GROUPS" => array(),
«PARAMETERS» => array(
«TEMPLATE_FOR_DATE» => array(
«PARENT» => «BASE»,
«NAME» => «Шаблон для даты»,
«TYPE» => «STRING»,
«MULTIPLE» => «N»,
«DEFAULT» => «Y-m-d»,
«REFRESH» => «Y»,
),
),
);
?>

И изменяем файл с логикой компонента, чтобы он мог использовать параметр, который мы задаем:

component.php
< ?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); $arResult['DATE'] = date($arParams["TEMPLATE_FOR_DATE"]); $this->IncludeComponentTemplate();
?>

Что же мы сделали?

Мы создали компонент, в самом простом виде. Мы не учитывали мультиязычность, не учитывали возможность создания помощи к компоненту и прелести кеширования компонентов.
Большая часть заказных компонентов для Битрикс создается путем изменения компонентов, идущих в поставке Битрикс. Поэтому очень нужно хорошо изучить стандартные компоненты, перед тем как программировать новые. Скорее всего задачу, которую вы хотите решить — уже решили разработчики Битрикс.

статья опубликована в журнале Веб-Аналитик.ИНФО, (№2) май 2010 год

Комментариев: 5

  1. Прекрасная статья, даёт полное понимание разработки компонентов. Вполне претендует на место в ихнем мануале!

  2. Решил вот воспроизвести этот компонент, и возникли вопросы:
    в файле .description.php

    GetMessage(”Текущая дата”),
    “DESCRIPTION” => GetMessage(”Выводим текущую дату”),

    Зачем «GetMessage» почему не выводить просто текст в кавычках?
    Именно из за этой ф-ии компонент не захотел заселяться в визуальный редактор.

    и еще в templates/.default/template.php

    Текущая дата

    …т.е. он жеж и выведет строку «Текущая дата» разве не нужно вместо него вставить ?

  3. в файле .description.php

    GetMessage(”Текущая дата”),
    “DESCRIPTION” => GetMessage(”Выводим текущую дату”),

    Да-да, нужно без GetMessage. Эту функцию следует использовать, если вам нужна поддержка мультиязычности.

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

14 + девятнадцать =