В данной заметке речь пойдет о разработке компонентов для Битрикса с нуля. Я расскажу о том, как правильно написать компонент, сделать описание к нему, а также настроить параметры компонента, чтобы можно было пользоваться вашим компонентам как стандартными компонентами Битрикса. Ранее я уже писал про компоненты Битрикса. Будем считать, что ту статью вы уже прочитали. Итак, начнем.
Структура папки компонента имеет вид:
Разберем каждый файл отдельно.
Файл .description.php
В данном файле храниться описание компонента. Эта информация используется Битриксом в режиме редактирования и в визуальном редакторе. Описание - это как раз то короткое описание компонента, которые вы видите в визуальном редакторе, а также иконка. При работе компонента эта информация не используется.
С точки зрения программирования файл .description.php нужен для определения массива $arComponentDescription, в котором определяются основные параметры описания.
Типичная структура этого массива такова:
$arComponentDescription = array( "NAME" => GetMessage("COMP_NAME"), "DESCRIPTION" => GetMessage("COMP_DESCR"), "ICON" => "/images/icon.gif", "PATH" => array( "ID" => "content", "CHILD" => array( "ID" => "catalog", "NAME" => "Каталог товаров" ) ), "AREA_BUTTONS" => array( array( 'URL' => "javascript:alert('Это кнопка!!!');", 'SRC' => '/images/button.jpg', 'TITLE' => "Это кнопка!" ), ), "CACHE_PATH" => "Y", "COMPLEX" => "Y" );
Ключи компонента значат следующее:
- NAME - название компонента
- DESCRIPTION - описание компонента
- ICON - путь к файлу иконки компонента, относительно папки компонента.
-
PATH- путь в виртуальном дереве компонентов. Это то самое дерево, что мы видим в визуальном редакторе и из которого можно перетащить кнопки компонентов. Если этот параметр не задан, то компонент не появится в дереве компонентов. Сам по себе этот пункт является массивом и имеет следующие ключи:
- ID - код ветки дерева.
- NAME - название ветки компонентов.
- CHILD - массив дочерней ветки, имеет ту же структуру, что и данный массив. Для первого уровня дерева зарезервированы следующие ветки, которые нельзя использовать: "content" (контент), "service" (сервисы), "communication" (общение), "e-store" (магазин), "utility" (служебные).
- AREA_BUTTONS - пользовательские кнопки, которые показываются для компонента в режиме редактирования сайта.
- CACHE_PATH - если значение равно "Y", отображается кнопка очистки кэша компонента в режиме редактирования сайта .
- COMPLEX - элемент должен иметь значение "Y" для комплексного компонента, для простых компонентов не имеет значения.
Файл .parameters.php
В этом файле содержится описания вводимых параметров компонента. Описание производиться путем задания массива $arComponentParameters, который имеет вид:
$arComponentParameters = array( "GROUPS" => array( "SETTINGS" => array( "NAME" => GetMessage("SETTINGS_PHR") ), "PARAMS" => array( "NAME" => GetMessage("PARAMS_PHR") ), ), "PARAMETERS" => array( "IBLOCK_TYPE_ID" => array( "PARENT" => "SETTINGS", "NAME" => GetMessage("INFOBLOCK_TYPE_PHR"), "TYPE" => "LIST", "ADDITIONAL_VALUES" => "Y", "VALUES" => $arIblockType, "REFRESH" => "Y" ), "BASKET_PAGE_TEMPLATE" => array( "PARENT" => "PARAMS", "NAME" => GetMessage("BASKET_LINK_PHR"), "TYPE" => "STRING", "MULTIPLE" => "N", "DEFAULT" => "/personal/basket.php", "COLS" => 25 ), "SET_TITLE" => array(), "CACHE_TIME" => array(), "VARIABLE_ALIASES" => array( "IBLOCK_ID" => array( "NAME" => GetMessage("CATALOG_ID_VARIABLE_PHR"), ), "SECTION_ID" => array( "NAME" => GetMessage("SECTION_ID_VARIABLE_PHR"), ), ), "SEF_MODE" => array( "list" => array( "NAME" => GetMessage("CATALOG_LIST_PATH_TEMPLATE_PHR"), "DEFAULT" => "index.php", "VARIABLES" => array() ), "section1" => array( "NAME" => GetMessage("SECTION_LIST_PATH_TEMPLATE_PHR"), "DEFAULT" => "#IBLOCK_ID#", "VARIABLES" => array("IBLOCK_ID") ), "section2" => array( "NAME" => GetMessage("SUB_SECTION_LIST_PATH_TEMPLATE_PHR"), "DEFAULT" => "#IBLOCK_ID#/#SECTION_ID#", "VARIABLES" => array("IBLOCK_ID", "SECTION_ID") ), ), ) );
Массив имеет следующие ключи:
- GROUPS - все параметры разделены на группы. Группы задаются массивом следующего вида:
"код группы" => array( "NAME" => "название группы на текущем языке", "SORT" => "сортировка", )
Перечень стандартных групп:
ADDITIONAL_SETTINGS (сортировка - 700)
Эта группа появляется, например, при указании параметра SET_TITLE.
CACHE_SETTINGS (сортировка - 600)
Появляется при указании параметра CACHE_TIME.
SEF_MODE (сортировка 500)
Группа для всех параметров, связанных с использованием ЧПУ.
URL_TEMPLATES (сортировка 400)
Шаблоны ссылок
VISUAL (сортировка 300)
Редко используемая группа. Сюда предполагается загонять параметры, отвечающие за внешний вид.
DATA_SOURCE (сортировка 200)
Тип и ID инфоблока и тому подобное.
BASE (сортировка 100)
Основные параметры.
AJAX_SETTINGS (сортировка 550)
Все, что касается ajax. - PARAMETERS - массив описаний параметров. Описание имеет следующую структуру:
"код параметра" => array( "PARENT" => "код группы", // если нет - ставится ADDITIONAL_SETTINGS "NAME" => "название параметра на текущем языке", "TYPE" => "тип элемента управления, в котором будет устанавливаться параметр", "REFRESH" => "перегружать настройки или нет после выбора (N/Y)", "MULTIPLE" => "одиночное/множественное значение (N/Y)", "VALUES" => "массив значений для списка (TYPE = LIST)", "ADDITIONAL_VALUES" => "показывать поле для значений, вводимых вручную (Y/N)", "SIZE" => "число строк для списка (если нужен не выпадающий список)", "DEFAULT" => "значение по умолчанию", "COLS" => "ширина поля в символах", )
Возможные значения для TYPE:
- LIST - список элементов
- CHECKBOX - флажок да/нет
- STRING - строка символов
- FILE - файл
- COLORPICKER - цвет
- CUSTOM - Примером пользовательского (CUSTOM) типа параметров является параметр MAP_DATA в компоненте bitrix:map.google.view
Для типа LIST ключ VALUES содержит массив значений следующего вида:
VALUES => array( "ID или код, сохраняемый в настройках компонента" => "языкозависимое описание", )
Файл component.php
Итак, взглянем на основной файл компонента. Базовая структура такова:
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arResult = array(); if ($this->StartResultCache()) { $this->IncludeComponentTemplate(); }
Первая строчка нужна для ограничения прямого доступа к файлу компонента. Далее идет определение массива $arResult, который мы должны передать шаблону.
Метод StartResultCache возвращает true, если кэш не действителен и его данные устарели. Данные заносятся в кэш при вызове шаблона. За дополнительной информацией по этой функции лучше обратиться к документации.
Функция IncludeComponentTemplate выводит шаблон компонента. Также при вызове этой функции обновляется кэш.
Создание компонента Битрикса
Теперь давайте создадим простой компонент, который бы выводил записи из инфоблока. Компонент будет располагаться в отдельном пространстве имен mir. Входными параметрами будут ID инфлоблока из которого брать элементы и величина выборки элементов.
Создадим в папке /bitrix/components новую папку mir. Это будет наше новое пространство имен.
Определим основные файлы компонента.
.description.php
// Запрещаем прямой доступ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); // Определяем массив $arComponentDescription = array( "NAME" => GetMessage("NAME"), // Имя "DESCRIPTION" => GetMessage("DESCR"), // Описание "ICON" => "/images/news_all.gif", // Иконка "VERSION" => "1.00", // Версия "PATH" => array("ID" => "mir", // Расположение в виртуальном дереве компонентов "NAME" => GetMessage("MIR_GROUP_NAME"), "CHILD" => array("ID" => "system", "NAME" => GetMessage("SYSTEM_GROUP_NAME"), ), ), //"CACHE_PATH" => "Y", //"COMPLEX" => "Y" );
.parameters.php
// Запрещаем прямой доступ if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); // Подключаем модуль информационных блоков if(!CModule::IncludeModule("iblock")) return; // Получаем список инфоблоков $arIBlock=array(); $rsIBlock = CIBlock::GetList(Array("sort" => "asc"), Array("ACTIVE"=>"Y")); while($arr=$rsIBlock->Fetch()) { $arIBlock[$arr["ID"]] = "[".$arr["ID"]."] ".$arr["NAME"]; } // Массив описаний параметов компонента $arComponentParameters = array( // Группы "GROUPS" => array( "IBLOCK_PARAMS" => array( "NAME" => GetMessage("IBLOCK_PARAMS_NAME") ) ), // Массив описания параметров "PARAMETERS" => array( // ID инфоблока "IBLOCK_ID" => array( "PARENT" => "IBLOCK_PARAMS", "NAME" => GetMessage("IBLOCK_ID_NAME"), "TYPE" => "LIST", "VALUES" => $arIBlock, "REFRESH" => "Y" ), // Количество элементов инфоблока для выборки "IBLOCK_ITEMS_COUNT" => array( "PARENT" => "IBLOCK_PARAMS", "NAME" => GetMessage("IBLOCK_ITEMS_COUNT_NAME"), "TYPE" => "LIST", "VALUES" => array('5' => '5', '10' => '10', '15' => '15'), "DEFAULT" => '2', ), "SET_TITLE" => array(), "CACHE_TIME" => array(), ) );
component.php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arResult = array(); if ($this->StartResultCache()) { $this->IncludeComponentTemplate(); }
Вы наверно заметили функции GetMessage? Теперь надо создать языковые файлы. Лежать они должны в папке lang/ru/ и называться должны как и файлы, переменные для котого в них определяются.
/lang/ru/.description.php
$MESS ['NAME'] = "Элементы инфоблока"; $MESS ['DESCR'] = "Тестовый компонент для статьи"; $MESS ['MIR_GROUP_NAME'] = "MIR components"; $MESS ['SYSTEM_GROUP_NAME'] = "Информационные блоки";
/lang/ru/.parameters.php
$MESS ['IBLOCK_PARAMS_NAME'] = "Параметры инфоблока"; $MESS ['IBLOCK_ID_NAME'] = "Инфолок"; $MESS['IBLOCK_ITEMS_COUNT_NAME'] = "Количество записей";
Отлично! Теперь в папке компонента создайте папку templates. В ней будут храниться шаблоны. Каждая папка - отдельный шаблон. Шаблон по умолчанию называется .default, создайте такую папку и добавьте в нее файл template.php. Пусть он будет пока пустой.
Теперь все готово для добавления компонента на страницу. Создайте пустую страницу в битриксе, откройте ее через визуальный редактор. Вы должны увидеть следующее:
Теперь просто перетащите компонент на страницу. Он должен появится в области редактирования.
Сделайте двойной щелчок на нем, появится окно параметров.
Как видите, все получилось. Но наш компонент ничего не делать. Исправим это.
Логика компонента такова, что сначала он должен произвести выборку из назначенного нами инфоблока, а потом передать этим данные в шаблон, который из выведет на экран. Тут как раз и проявляется разделение логики и представления. В файле компонента component.php должна задаваться логика. Выходные данные должны быть помещены в массив $arResults. С этим массивом должен работать шаблон. В идеале шаблон не должен производить никаких манипуляций с этим массивом, только задавать способ вывода его на экран.
Параметры передаются как в сам компонент, так и в шаблон при помощи массива $arParams. Можно добавить следующую строчку в файл компонента:
print_r($arParams);
Вы увидите на странице компонента следующее:
Структура массива очень проста. Теперь создадим основную логику компонента.
Файл компонента должен принять вид:
StartResultCache()) { // Подключаем модуль информационных блоков if(!CModule::IncludeModule("iblock")) return; // Параметры сортировки $arSort = array("ID"=>"ASC"); // Параметры фильтра $arFilter = array("ACTIVE" => "Y", "IBLOCK_ID" => $arParams['IBLOCK_ID'], ); // Производим выборку из инфоблока $arRes = CIBlockElement::GetList($arSort, $arFilter); // Количество элементов $iCount = intval($arParams['IBLOCK_ITEMS_COUNT']); // Добавляем элементы в массив $arResult for($i = 0; $i < $iCount; $i++ ) { if(!$arr = $arRes->Fetch()) { break; } $arResult['items'][] = $arr; } $this->IncludeComponentTemplate(); } ?>
Мы сначала сделали выборку из инфоблока стандартными методами API Битрикса. Потом мы добавили информацию о каждом элементе в массив $arResult и вызвали шаблон компонента.
Отредактируем файл template.php следующим образом:
<div class="mir-iblock-list"> <? foreach($arResult['items'] as $item): ?> <div class="mir-iblock-item"> <h2><?=$item['NAME']?></h2> <div><?=$item['PREVIEW_TEXT']?></div> </div> <? endforeach; ?> </div>
Как мы видим, у нас есть только шаблон для отображения информации, в который мы подставляем значения из инфоблока. Результат следующий:
Если вы хотите отдельные стили для своего компонента, то добавьте в папку компонента файл style.css. Битрикс его автоматически подключит.
Точно также Битрикс автоматически подключит файл script.js.
Вот и все. В данной заметке были изложены основные моменты создания своих компонентов. Надеюсь данная статья будет кому-то полезна.
Классная статья.
ну или проверьте правильность написания имен файлов .description.php и .parameters.php, а потом обновите кеш
а вот такой вопрос ...у меня не подключает style.css, который я положил в папку имя_компонента/templates/.default/
Вопрос: где это настраивается ?