Разработка компонентов в php

Создание простого компонента в d7

Готовый код можно скачать в моем репозитории на GitFlic. Что меняется при использовании нового ядра d7? Весь набор файлов остается прежним, добавляется только файл class.php , в котором и будет располагаться вся логика.

Работа файла class.php

Файл подключается автоматически, в нем необходимо объявить класс с произвольным именем, как класс наследник от CBitrixComponent. Пример объявления класса:

class CIblocList extends CBitrixComponent

В этом классе уже доступны две переменные (объявлять их не нужно):

$this->arParams $this->arResult

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

onPrepareComponentParams(); // обработка массива $arParams onIncludeComponentLang(); // подключение языковых файлов executeComponent(); // аналог конструктора

В своем компоненте я разместил следующий код в методе executeComponent() :

public function executeComponent() < try < $this->checkModules(); $this->getResult(); > catch (SystemException $e) < ShowError($e->getMessage()); > >
  1. $this->checkModules() — мы проверяем подключен ли модуль Инфоблоков Битрикс
  2. $this->getResult() — подготавливаем массив $arResult и подключаем шаблон. Это основной блок кода

Это уже не огромная простыня кода, где ещё надо самостоятельно делить на блоки код чтобы начать что-то понимать. Все вполне наглядно и помещается в один экран:

.description.php

glavnyj.slajder/.description.php 'Главный слайдер на странице', // описание компонента 'DESCRIPTION' => 'Выводит главный слайдер в шапке страницы', // путь к иконке компонента относительно папки компонента 'ICON' => '/images/eaddlist.gif', // показывать кнопку очистки кеша 'CACHE_PATH' => 'Y', // порядок сортировки в визуальном редакторе 'SORT' => 30, // признак комплексного компонента 'COMPLEX' => 'N', // расположение компонента в визуальном редакторе 'PATH' => array( // идентификатор верхнего уровеня в редакторе 'ID' => 'slajder', // название верхнего уровня в редакторе 'NAME' => 'Слайдеры', // в элементе может быть задана подчиненная ветка дерева с той же структурой, что и родительская ветка 'CHILD' => '', ) );

.parameters.php

glavnyj.slajder/.parameters.php // получаем массив всех типов инфоблоков для возможности выбора $arIBlockType = CIBlockParameters::GetIBlockTypes(); // пустой массив для вывода $arInfoBlocks = array(); // выбираем активные инфоблоки $arFilterInfoBlocks = array('ACTIVE' => 'Y'); // сортируем по озрастанию поля сортировка $arOrderInfoBlocks = array('SORT' => 'ASC'); // если уже выбран тип инфоблока, выбираем инфоблоки только этого типа if (!empty($arCurrentValues['IBLOCK_TYPE'])) < $arFilterInfoBlocks['TYPE'] = $arCurrentValues['IBLOCK_TYPE']; >// метод выборки информационных блоков $rsIBlock = CIBlock::GetList($arOrderInfoBlocks, $arFilterInfoBlocks); // перебираем и выводим в адмику доступные информационные блоки while ($obIBlock = $rsIBlock->Fetch()) < $arInfoBlocks[$obIBlock['ID']] = '[' . $obIBlock['ID'] . '] ' . $obIBlock['NAME']; >// настройки компонента, формируем массив $arParams $arComponentParameters = array( // название кастомной группы не обязательный параметр "GROUPS" => array( "TEST" => array( "NAME" => 'Тест' ), ), // основной массив с параметрами 'PARAMETERS' => array( // выбор типа инфоблока 'IBLOCK_TYPE' => array( // ключ массива $arParams в component.php 'PARENT' => 'TEST', // название группы 'NAME' => 'Выберите тип инфоблока', // название параметра 'TYPE' => 'LIST', // тип элемента управления, в котором будет устанавливаться параметр 'VALUES' => $arIBlockType, // входные значения 'REFRESH' => 'Y', // перегружать настройки или нет после выбора (N/Y) 'DEFAULT' => 'news', // значение по умолчанию 'MULTIPLE' => 'N', // одиночное/множественное значение (N/Y) ), // выбор самого инфоблока 'IBLOCK_ID' => array( 'PARENT' => 'BASE', 'NAME' => 'Выберите родительский инфоблок', 'TYPE' => 'LIST', 'VALUES' => $arInfoBlocks, 'REFRESH' => 'Y', "DEFAULT" => '', "ADDITIONAL_VALUES" => "Y", ), // настройки кэширования 'CACHE_TIME' => array( 'DEFAULT' => 3600 ), ), );

class.php

glavnyj.slajder/class.phpcheckModules(); // подключаем метод подготовки массива $arResult $this->getResult(); > catch (SystemException $e) < ShowError($e->getMessage()); > > // подключение языковых файлов (метод подключается автоматически) public function onIncludeComponentLang() < Loc::loadMessages(__FILE__); >// проверяем установку модуля «Информационные блоки» (метод подключается внутри класса try. catch) protected function checkModules() < // если модуль не подключен if (!Loader::includeModule('iblock')) // выводим сообщение в catch throw new SystemException(Loc::getMessage('IBLOCK_MODULE_NOT_INSTALLED')); >// обработка массива $arParams (метод подключается автоматически) public function onPrepareComponentParams($arParams) < // время кеширования if (!isset($arParams['CACHE_TIME'])) < $arParams['CACHE_TIME'] = 3600; >else < $arParams['CACHE_TIME'] = intval($arParams['CACHE_TIME']); >// возвращаем в метод новый массив $arParams return $arParams; > // подготовка массива $arResult (метод подключается внутри класса try. catch) protected function getResult() < // если нет валидного кеша, получаем данные из БД if ($this->startResultCache()) < // Запрос к инфоблоку через класс ORM $res = \Bitrix\Iblock\Elements\ElementSlajderglavnyjTable::getList([ 'select' =>["ID", "NAME", "IBLOCK_ID", "ID_2_ZAGOLOVOK_" => "ID_2_ZAGOLOVOK", "ID_2_TEXT_" => "ID_2_TEXT", "ID_2_ZAGOLOVOKHOVER_" => "ID_2_ZAGOLOVOKHOVER", "ID_2_TEXTHOVER_" => "ID_2_TEXTHOVER", "ID_2_KARTINKA_" => "ID_2_KARTINKA", "ID_2_HREF_" => "ID_2_HREF", "PREVIEW_PICTURE"], "filter" => ["ACTIVE" => "Y"], "order" => ["SORT" => "ASC"] ]); // Формируем массив arResult while ($arItem = $res->fetch()) < $arItem["PREVIEW_PICTURE"] = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); $arItem["ID_2_KARTINKA_VALUE"] = CFile::GetFileArray($arItem["ID_2_KARTINKA_VALUE"]); $this->arResult[] = $arItem; > // кэш не затронет весь код ниже, он будут выполняться на каждом хите, здесь работаем с другим $arResult, будут доступны только те ключи массива, которые перечислены в вызове SetResultCacheKeys() if (isset($this->arResult)) < // ключи $arResult перечисленные при вызове этого метода, будут доступны в component_epilog.php и ниже по коду, обратите внимание там будет другой $arResult $this->SetResultCacheKeys( array() ); // подключаем шаблон и сохраняем кеш $this->IncludeComponentTemplate(); > else < // если выяснилось что кешировать данные не требуется, прерываем кеширование и выдаем сообщение «Страница не найдена» $this->AbortResultCache(); \Bitrix\Iblock\Component\Tools::process404( Loc::getMessage('PAGE_NOT_FOUND'), true, true ); > > > >

Источник

Читайте также:  Angular on html change

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

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

Предварительные действия

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

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

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

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

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

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

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

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

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

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

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

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

IncludeComponent( "dv:date.current", ".default", Array( ), false );?>

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

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

Читайте также:  Access remote file in java

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

 GetMessage("Текущая дата"), "DESCRIPTION" => GetMessage("Выводим текущую дату"), "PATH" => array( "ID" => "dv_components", "CHILD" => array( "ID" => "curdate", "NAME" => "Текущая дата" ) ), "ICON" => "/images/icon.gif", ); ?>

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

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

 array(), "PARAMETERS" => array( "TEMPLATE_FOR_DATE" => array( "PARENT" => "BASE", "NAME" => "Шаблон для даты", "TYPE" => "STRING", "MULTIPLE" => "N", "DEFAULT" => "Y-m-d", ), ), ); ?>

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

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

Мы создали компонент, в самом простом виде. Мы не учитывали мультиязычность, не учитывали возможность создания помощи к компоненту и прелести кеширования компонентов.

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

Источник

Оцените статью