Структура компонента

Здесь приведу тексты типовых файлов компонента. А вот и ссылка на документацию Bitrix. Отличие моей статьи в том, что здесь одна страница, а там целый раздел. И тексты приведенные здесь являются заготовками для будущих компонентов. Я рекомендую ознакомится с документацией битрикса, а затем использовать эту страницу как шпаргалку (я так и делаю)

Типовая структура компонента

.parameters.php

Тут описываются какие параметры есть у компонента, ссылка на документацию Bitrix. Здесь я обычно также не использую все возможности. А они, надо сказать, довольно большие, поэтому по приведенной ссылке перейти стоит. Привожу краткий пример:


if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentParameters = array(
	"GROUPS" => array(
	),
	"PARAMETERS" => array(
		"IBLOCK_ID" => Array(
			"PARENT" => "BASE",
			"NAME" => 'Инфоблок',
			"TYPE" => "STRING",
		),
		"CODE" => array(
			"PARENT" => "BASE",
			"NAME" => 'Код элемента',
			"TYPE" => "STRING",
		),
                "SECTION_CODE" => array(
			"PARENT" => "BASE",
			"NAME" => 'Код раздела',
			"TYPE" => "STRING",
		),
		"CACHE_TIME"  =>  Array("DEFAULT"=>36000000),
	),
);

component.php

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


if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
//Проверим параметры
if(!isset($arParams['CACHE_TIME']))
	$arParams['CACHE_TIME'] = 36000000;

$arParams['CODE'] = trim($arParams['CODE']);
$arParams['SECTION_CODE'] = trim($arParams['SECTION_CODE']);
$arParams['IBLOCK_ID'] = intval($arParams['IBLOCK_ID']);

//Если параметр некорректен, можно сразу вернуть 404
if (!strlen($arParams['CODE'])){
    @define("ERROR_404","Y");
    return;
}

//Начали
if($this->StartResultCache(false)) {//кешируем
    CModule::IncludeModule('iblock');
    //получение данных    
    //......................
    //вынесем отдельно мета теги:
    $arResult['META']['H1'] =          $arResult['ELEMENT']['NAME'];
    $arResult['META']['DESCRIPTION'] = $arResult['ELEMENT']['PREVIEW_TEXT'];
    $arResult['META']['KEYWORDS'] =    $arResult['ELEMENT']['PROPERTY_KEYWORDS_VALUE'];

    //Если не нашли элемент вернем 404-ю
    {
        @define("ERROR_404","Y");
        $this->AbortResultCache();
        return;
    }

    //Сохраним вне кеша мета теги и другие необходимые данные
    $this->SetResultCacheKeys(array('META','ELEMENT_ID')); 
    
    //Если ничего не нужно сохранять вне кеша, 
    //то нужно в данную функцию передать пустой массив,
    //иначе в кеш попадет массив $arResult целиком
    $this->SetResultCacheKeys(array()); 

    //Подключаем шаблон и заканчиваем кеширование   
    $this->IncludeComponentTemplate();

    //либо можно закончить кеширование без подключения шаблона, а закешировать весь 
    //массив $arResult, который будет доступен далее в неизменном виде
    $this->EndResultCache();
}
//Установим мета теги:
if($arResult['META']['H1']){
    $APPLICATION->SetTitle($arResult['META']['H1']);
}
if($arResult['META']['TITLE']){
    $APPLICATION->SetPageProperty('title', $arResult['META']['TITLE']);
}
if($arResult['META']['DESCRIPTION']){
    $APPLICATION->SetPageProperty('description', $arResult['META']['DESCRIPTION']);
}
if($arResult['META']['KEYWORDS']){
    $APPLICATION->SetPageProperty('keywords', $arResult['META']['KEYWORDS']);
}
//Затем можно вернуть какое либо значение вне компонента,
//чтобы использовать на странице, например передать в 
//другой компонент в качестве параметра
return $arResult['ELEMENT_ID'];

Для установки мета тегов, была написана специальная функция setMeta($arResult['META']);, о ней можно прочитать в разделе Meta для всех

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

Николай

21.06.2018 09:52:52

Не нашел более подходящего раздела по шаблонам компонента, напишу здесь...
Подскажите как программно установить шаблон компонента (стандартного, например меню)?
Т.е. в настройках компонента например указан один шаблон,а при выполнении определенного условия в коде, компонент бы подгружал другой шаблон.
Знаю, что шаблон передается в массиве $arParams['COMPONENT_TEMPLATE'], я пытался просто писать и в result_modifier.php и в component.php что то вроде $arParams['COMPONENT_TEMPLATE'] = "map" толку нет...

Максим

22.06.2018 05:34:40

Николай, нужно смотреть в сторону объекта CBitrixComponent в переменной $component, шаблон в этом объекте инициализируется.
Но я бы лучше делал по другому, в самом шаблоне template.php смотрел на условия и в зависимости от них подгружал различные template. Думаю так было бы правильнее.

Николай

22.06.2018 08:53:19

Максим, мне необходимо подгружать компонент меню с разными шаблонами в зависимости от раздела сайта. Как это сделать без редактирования шаблона сайта я не пойму, поэтому и появилась идея добавить условие в компонент меню.

Насчет $component, кроме как вывести ее целиком на экран командой print_r у меня ничего не выходит. Похоже здесь необходимо использовать другие методы чем с обычными переменными.

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

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поддержать проект:

бесполезная кнопка, которую еще никто не нажал:)
Нажали! Кнопку нажали уже 7 человек!!! Спасибо, очень мотивирует!