Дата последнего изменения: 30.09.2024
Комплексный компонент служит для организации целого раздела сайта (форум, каталог и т.п.). Для вывода данных он подключает обычные компоненты. По сути, он является контроллером (менеджером) простых компонентов. Комплексный компонент определяет на основании HTTP запроса страницу, которую требуется вывести посетителю, и подключает шаблон этой страницы.
Пример кода комплексного компонента:
<?
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
$arDefaultUrlTemplates404 = [
'list' => 'index.php',
'element' => '#ELEMENT_ID#.php',
];
$arDefaultVariableAliases404 = [];
$arDefaultVariableAliases = [];
$arComponentVariables = ['IBLOCK_ID', 'ELEMENT_ID'];
$SEF_FOLDER = '';
$arUrlTemplates = [];
if ($arParams['SEF_MODE'] == 'Y') {
$arVariables = [];
$arUrlTemplates = CComponentEngine::MakeComponentUrlTemplates(
$arDefaultUrlTemplates404,
$arParams['SEF_URL_TEMPLATES']
);
$arVariableAliases = CComponentEngine::MakeComponentVariableAliases(
$arDefaultVariableAliases404,
$arParams['VARIABLE_ALIASES']
);
$componentPage = CComponentEngine::ParseComponentPath(
$arParams['SEF_FOLDER'],
$arUrlTemplates,
$arVariables
);
if (strlen($componentPage) <= 0) {
$componentPage = 'list';
}
CComponentEngine::InitComponentVariables(
$componentPage,
$arComponentVariables,
$arVariableAliases,
$arVariables);
$SEF_FOLDER = $arParams['SEF_FOLDER'];
} else {
$arVariables = [];
$arVariableAliases = CComponentEngine::MakeComponentVariableAliases(
$arDefaultVariableAliases,
$arParams['VARIABLE_ALIASES']
);
CComponentEngine::InitComponentVariables(
false,
$arComponentVariables,
$arVariableAliases,
$arVariables
);
$componentPage = '';
if (intval($arVariables['ELEMENT_ID']) > 0) {
$componentPage = 'element';
} else {
$componentPage = 'list';
}
}
$arResult = [
'FOLDER' => $SEF_FOLDER,
'URL_TEMPLATES' => $arUrlTemplates,
'VARIABLES' => $arVariables,
'ALIASES' => $arVariableAliases,
];
$this->IncludeComponentTemplate($componentPage);
?>
В начале кода определяются массивы:
$arDefaultUrlTemplates404 - для задания путей по умолчанию для работы в ЧПУ режиме. Каждый элемент массива является шаблоном пути и задается в виде:
"код шаблона пути" => "шаблон пути"В шаблоне пути могут быть использованы конструкции вида "#слово#", которые при формировании реального пути заменяются на значения соответствующих переменных. Например, для шаблона пути:
"element" => "#ELEMENT_ID#.php"реальный путь будет иметь вид 195.php или 7453.php. Шаблоны путей могут иметь параметры, например:
"element" => "#IBLOCK_ID#/#ELEMENT_ID#.php?SECTION_ID=#SECTION_ID#"Должны быть заданы все шаблоны путей, с которыми работает компонент.
$arDefaultVariableAliases404 - для задания псевдонимов по умолчанию переменных в режиме ЧПУ. Как правило, этот массив пуст (используются реальные имена переменных). В случае, если необходимо, чтобы в HTTP запросе (в адресе) переменная называлась по другому, можно задать псевдоним этой переменной, а при работе компонента восстанавливать значение переменной из псевдонима. Если для какого-либо шаблона пути нужно задать псевдоним для одной или более переменных, то в этом массиве должен появиться элемент вида:
"код шаблона пути" => array(
"название переменной 1" => "псевдоним переменной 1",
"название переменной 2" => "псевдоним переменной 2",
* * *
)
Например, если требуется, чтобы ссылка на страницу детальной информации об элементе инфоблока (например, карточки товара) имела вид:
"/<мнемонический код инфоблока>/то шаблон пути можно задать в виде:.php?SID=<код группы элементов>"
"element" => "#IBLOCK_ID#/#ELEMENT_ID#.php?SID=#SECTION_ID#"а в массиве
$arDefaultVariableAliases404 задать псевдоним для переменной SECTION_ID в виде:
"element" => array( "SECTION_ID" => "SID" )В этом случае ссылки (адреса) будут формироваться с параметром
SID, а в компонентах будет установлена переменная SECTION_ID. $arDefaultVariableAliases - для задания псевдонимов по умолчанию переменных в режиме не ЧПУ. Как правило, этот массив пуст, то есть используются реальные имена переменных. В случае, если необходимо, чтобы в HTTP запросе (в адресе) переменная называлась по другому, можно задать псевдоним этой переменной, а при работе компонента восстанавливать значение переменной из псевдонима. Если для какой-либо переменной нужно задать псевдоним, то в этом массиве должен появиться элемент вида:
"название переменной" => "псевдоним переменной"Например, если название переменной в компоненте
SECTION_ID, но требуется, чтобы в ссылках использовалась переменная SID, то псевдоним для SECTION_ID можно задать в виде
"SECTION_ID" => "SID"В этом случае, ссылки (адреса) будут формироваться с параметром
SID, а в компонентах будет установлена переменная SECTION_ID. Все эти массивы или их части могут быть переопределены с помощью входных параметров компонента (при вызове компонента). Например, во входном параметре SEF_URL_TEMPLATES в ЧПУ режиме может быть задан массив:
"SEF_URL_TEMPLATES" => array( "element" => "#IBLOCK_CODE#/#ELEMENT_ID#.php?GID=#SECTION_ID#" )а во входном параметре
VARIABLE_ALIASES может быть задан параметр:
"VARIABLE_ALIASES" => array( "element" => array( "SECTION_ID" => "GID", ), )Тогда в адресах (ссылках) пути будут иметь вид типа
/phone/3425.php?GID=28, а в компоненте из них будут восстанавливаться переменные IBLOCK_CODE = phone, ELEMENT_ID = 3425 и SECTION_ID = 28. $arComponentVariables - для задания списка переменных, которые компонент может принимать в HTTP запросе и которые могут иметь псевдонимы. Каждый элемент массива является именем переменной. Входной параметр с предопределённым именем SEF_MODE может иметь два значения: Y и N. Если $arParams["SEF_MODE"] равен Y, значит компонент работает в режиме ЧПУ, иначе - нет.
Входной параметр с предопределённым именем SEF_FOLDER имеет смысл в том случае, если компонент работает в режиме ЧПУ. В этом случае он содержит путь, по которому работает компонент. Путь может быть виртуальным (т.е. физически он может не существовать). Например, компонент из примера может лежать в файле /fld/n.php, при этом он работает в режиме ЧПУ и входной параметр SEF_FOLDER равен /company/news/. Тогда компонент будет откликаться на запросы по адресам /company/news/index.php, /company/news/25.php и т.п.
Для определения, какую страницу должен показать комплексный компонент, а так же для восстановления переменных компонента из пути и из псевдонимов используются следующие методы.
CComponentEngine::MakeComponentUrlTemplates( $arDefaultUrlTemplates404, $arParams['SEF_URL_TEMPLATES'] );Метод объединяет массив по умолчанию шаблонов путей и шаблоны путей, которые были переданы во входных параметрах компонента в один массив. При этом, если в
$arParams["SEF_URL_TEMPLATES"] определён шаблон какого-либо пути, то он переопределяет шаблон по умолчанию этого пути. CComponentEngine::MakeComponentVariableAliases( $arDefaultVariableAliases404, $arParams['VARIABLE_ALIASES'] );Метод объединяет массив по умолчанию псевдонимов переменных и псевдонимы переменных, которые были переданы во входных параметрах компонента в один массив. При этом, если псевдоним некоторой переменной определён и в массиве по умолчанию, и во входных параметрах, то возвращается псевдоним из входных параметров.
CComponentEngine::ParseComponentPath( $arParams['SEF_FOLDER'], $arUrlTemplates, $arVariables );Метод на основании параметра
$arParams["SEF_FOLDER"] и массива шаблонов путей (который вернул метод MakeComponentUrlTemplates) определяет, какому шаблону пути соответствует запрошенный адрес. Если шаблон был найден, возвращается его код, иначе возвращается пустая строка. Кроме того, в переменной $arVariables возвращается массив переменных компонента, который был восстановлен из шаблона пути без параметров. Например, если массив шаблонов путей (который получился из массива $arDefaultUrlTemplates404 после переопределения всех или части шаблонов через входные параметры компонента) имеет вид:
$arUrlTemplates = array( "list" => "index.php", "element" => "#IBLOCK_ID#/#ELEMENT_ID#.php?SID=#SECTION_ID#" );Если входной параметр
SEF_FOLDER равен /company/news/, а запрошенный адрес равен /company/news/15/7653.php?SID=28, то метод ParseComponentPath вернет строку "element" (код соответствующего шаблона), а массив $arVariables будет иметь вид:
$arVariables = array( "IBLOCK_ID" => 15, "ELEMENT_ID" => 7653 )
CComponentEngine::InitComponentVariables( $componentPage, $arComponentVariables, $arVariableAliases, $arVariables );где:
$componentPage - код шаблона, который вернул метод ParseComponentPath и которому соответствует запрошенный адрес;$arComponentVariables - массив переменных, которые компонент может принимать в HTTP запросе и которые могут иметь псевдонимы;$arVariableAliases - массив псевдонимов (который вернул метод MakeComponentVariableAliases).Метод восстанавливает переменные из $_REQUEST c учётом их возможных псевдонимов и возвращает их в переменной $arVariables. Например, если для кода, приведенного выше, в массиве $arVariableAliases есть запись вида
"element" => array( "SECTION_ID" => "SID", )то метод InitComponentVariables в параметре
$arVariables вернет массив вида
$arVariables = array( "IBLOCK_ID" => 15, "ELEMENT_ID" => 7653, "SECTION_ID" => 28 )Здесь методом InitComponentVariables был инициализирован третий элемент массива. Первые два были инициализированы методом ParseComponentPath в примере выше. В случае работы компонента не в режиме ЧПУ, в метод InitComponentVariables первым параметром передается значение
False. В случае работы компонента в режиме ЧПУ на основании кода шаблона пути и переменных из HTTP запроса (а в случае не-ЧПУ адресов, только на основании переменных из HTTP запроса) компонент определяет, какая страница из шаблона компонента должна подключиться, и передает ее имя в вызов метода:
$this->IncludeComponentTemplate($componentPage);
На страницах шаблона комплексного компонента подключаются обычные компоненты и настраиваются их входные параметры на основании входных параметров комплексного компонента, некоторых вычисляемых значений и констант. Например, страница "element" шаблона компонента из примера (файл типа /templates/.default/element.php относительно папки компонента) может иметь вид типа:
<?
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
$APPLICATION->IncludeComponent(
'bitrix:news.detail',
'',
[
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'ELEMENT_ID' => $arResult['VARIABLES']['ELEMENT_ID'],
'SECTION_ID' => $arResult['VARIABLES']['SECTION_ID'],
'CACHE_TIME' => $arParams['CACHE_TIME'],
],
$component
);
?>
Последний параметр $component в подключении компонента — объект, представляющий текущий компонент. Он передается в вызов подключения компонента. Таким образом, подключаемый компонент будет знать, что он подключается из комплексного компонента. Соответственно, он сможет пользоваться ресурсами комплексного компонента, вызывать его методы и т.п.
Получить ссылку на родительский компонент:
$this->getParent()