Пример кода комплексного компонента:
[spoiler]
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?><? $arDefaultUrlTemplates404 = array( "list" => "index.php", "element" => "#ELEMENT_ID#.php" ); $arDefaultVariableAliases404 = array(); $arDefaultVariableAliases = array(); $arComponentVariables = array("IBLOCK_ID", "ELEMENT_ID"); $SEF_FOLDER = ""; $arUrlTemplates = array(); if ($arParams["SEF_MODE"] == "Y") { $arVariables = array(); $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 = array(); $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 = array( "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", * * * ), |
Например, если требуется, чтобы ссылка на страницу детальной информации об элементе инфоблока (например, карточки товара) имела вид
"/<мнемонический код инфоблока>/<ID элемента>.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 и т.п.
Для определения, какую страницу должен показать комплексный компонент, а так же для восстановления переменных компонента из пути и из псевдонимов используются следующие методы
array CComponentEngine::MakeComponentUrlTemplates($arDefaultUrlTemplates404, $arParams["SEF_URL_TEMPLATES"]); |
Метод объединяет массив шаблонов "по-умолчанию" путей и шаблоны путей, которые были переданы во входных параметрах компонента в один массив. При этом если в $arParams["SEF_URL_TEMPLATES"] определен шаблон какого-либо пути, то он переопределяет шаблон "по-умолчанию" этого пути.
array CComponentEngine::MakeComponentVariableAliases($arDefaultVariableAliases404, $arParams["VARIABLE_ALIASES"]); |
Метод объединяет массив псевдонимов "по-умолчанию" переменных и псевдонимы переменных, которые были переданы во входных параметрах компонента в один массив. При этом если псевдоним некоторой переменной определен и в массиве "по-умолчанию", и во входных параметрах, то возвращается псевдоним из входных параметров.
string CComponentEngine::ParseComponentPath($arParams["SEF_FOLDER"], $arUrlTemplates, $arVariables); |
Метод на основании параметра $arParams["SEF_FOLDER"] и массива шаблонов путей (который вернул метод CComponentEngine::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, то метод CComponentEngine::ParseComponentPath вернет строку "element" (код соответствующего шаблона), а массив $arVariables будет иметь вид
$arVariables = array( "IBLOCK_ID" => 15, "ELEMENT_ID" => 7653 ) |
CComponentEngine::InitComponentVariables($componentPage, $arComponentVariables, $arVariableAliases, $arVariables); |
где $componentPage - код шаблона, который вернул метод CComponentEngine::ParseComponentPath и которому соответствует запрошенный адрес,
$arComponentVariables - массив переменных, которые компонент может принимать в HTTP запросе и которые могут иметь псевдонимы,
$arVariableAliases - массив псевдонимов (который вернул метод CComponentEngine::MakeComponentVariableAliases).
Метод восстанавливает переменные из $_REQUEST c учетом их возможных псевдонимов и возвращает их в переменной $arVariables.
Например, если для примера, приведенного выше, в массиве $arVariableAliases есть запись вида
"element" => array( "SECTION_ID" => "SID", ) |
то метод CComponentEngine::InitComponentVariables в параметре $arVariables вернет массив вида
$arVariables = array( "IBLOCK_ID" => 15, "ELEMENT_ID" => 7653, "SECTION_ID" => 28 ) |
Здесь методом CComponentEngine::InitComponentVariables был инициализирован третий элемент массива. Первые два были инициализированы методом CComponentEngine::ParseComponentPath в примере выше.
В случае работы компонента не в режиме ЧПУ в метод CComponentEngine::InitComponentVariables первым параметром передается значение False.
В случае работы компонента в режиме ЧПУ на основании кода шаблона пути и переменных из HTTP запроса (а в случае работы компонента в режиме не ЧПУ только на основании переменных из HTTP запроса) компонент определяет, какая страница из шаблона компонента должна подключится, и передает ее имя в вызов метода
$this->IncludeComponentTemplate($componentPage); |
На страницах шаблона комплексного компонента подключаются обычные компоненты и настраиваются их входные параметры на основании входных параметров комплексного компонента, некоторых вычисляемых значений и констант. Например, страница "element" шаблона компонента из примера (файл типа /templates/.default/list.php относительно папки компонента) может иметь вид типа
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?$APPLICATION->IncludeComponent( "bitrix:news.detail", "", Array( "IBLOCK_ID" => $arParams["IBLOCK_ID"], "ELEMENT_ID" => $arResult["VARIABLES"]["ELEMENT_ID"], "SECTION_ID" => $arResult["VARIABLES"]["SECTION_ID"], "CACHE_TIME" => $arParams["CACHE_TIME"], ), $component );?> |
Последний параметр $component в подключении компонента - это объект, представляющий текущий компонент. Он передается в вызов подключения компонента, таким образом подключаемый компонент будет знать, что он подключается из комплексного компонента. А соответственно он сможет пользоваться ресурсами комплексного компонента, вызывать его методы и т.п.