Можете не верить, но я только недавно проникся идеей комплексных компонент, до этого они меня пугали 
Постараюсь объяснить новичкам что это такое и когда это лучше применять, и как.
[spoiler]
Комплексный компонент - это такой кубик, собранный из кирпичиков. Применяется чаще всего, когда вам надо на одной странице реализовать сложную логику.
Рассмотрим вариант видео-теки, где фильмы объединены в сезоны, а каждый фильм назван эпизодом.
Опущу здесь как вообще писать обычные компоненты, опишу только логику комплексного.
Сразу, важное замечание, привожу пример работы компонента в ЧПУ. Я считаю что это уже давно как постулат, и на сайте обязано быть ЧПУ. И еще - я выкинул все лишнее, так как: а) сам до конца не понимаю всей той воды, что есть, б) ни разу оно мне не потребовалось, а сделал я не мало.
Итак, в .parametrs.php пишем вот такой код:
VARIABLE_ALIASES - это важные для работы переменные, которые передаются в URL.
season, episode - это собственно два кирпичика, один - сезон, второй - эпизод.
В настройках могут быть и другие элементы, тут уже то, что вам надо.
Вот что мы получаем

Переходим к component.php
Вот что надо вписать в самом верху:
Принимайте как априори это. Если желаете, то в мануале можете почитать что делает каждый из методов.
Подключаем шаблон:
Все! Больше никакой логики в component.php НЕ ТРЕБУЕТСЯ.
В $componentPage будет содержаться та страница, которая должна сейчас отработать (из адреса URL).
Вот какие у меня есть шаблоны (template.php подрубается по умолчанию):

Обратите внимание, что названия шаблонов совпадают с теми самыми season и episode из parametrs.php.
Посмотрим, например, что содержится в season.php.
А там всего лишь тот самый кирпичик:
То есть вставляем компонент, который работает сам по себе. Туда же можно вставить любой html-код или несколько компонент.
Параметр $component говорит компоненту, что ты мол работаешь в команде, если что пользуйся общими ресурсами родителя. Можно поставить false, тогда он будет работать сам по себе.
Вот когда я это осознал, мне стало так обидно, что я раньше не разобрался, и так зло, что в мануал пихают много воды, которую просто не охота читать и терять время.
Повторяю - я убрал всю воду и оставил только то, что надо для работы. Если есть желание - можете втыкать портянки на 200 строк (чтобы по мануалу).

Постараюсь объяснить новичкам что это такое и когда это лучше применять, и как.
[spoiler]
Комплексный компонент - это такой кубик, собранный из кирпичиков. Применяется чаще всего, когда вам надо на одной странице реализовать сложную логику.
Рассмотрим вариант видео-теки, где фильмы объединены в сезоны, а каждый фильм назван эпизодом.
Опущу здесь как вообще писать обычные компоненты, опишу только логику комплексного.
Сразу, важное замечание, привожу пример работы компонента в ЧПУ. Я считаю что это уже давно как постулат, и на сайте обязано быть ЧПУ. И еще - я выкинул все лишнее, так как: а) сам до конца не понимаю всей той воды, что есть, б) ни разу оно мне не потребовалось, а сделал я не мало.
Итак, в .parametrs.php пишем вот такой код:
"VARIABLE_ALIASES" => array(
"episode_id" => array("NAME" => "Эпизод"),
"season_id" => array("NAME" => "Сезон"),
),
"SEF_MODE" => Array(
"season" => array(
"NAME" => "Сезон",
"DEFAULT" => "season-#season_id#/",
"VARIABLES" => array("season_id"),
),
"episode" => array(
"NAME" => "Эпизод",
"DEFAULT" => "#episode_id#/",
"VARIABLES" => array("episode_id"),
),
), |
VARIABLE_ALIASES - это важные для работы переменные, которые передаются в URL.
season, episode - это собственно два кирпичика, один - сезон, второй - эпизод.
В настройках могут быть и другие элементы, тут уже то, что вам надо.
Вот что мы получаем

Переходим к component.php
Вот что надо вписать в самом верху:
if($arParams["SEF_MODE"] == "Y")
{
$arUrlTemplates = CComponentEngine::MakeComponentUrlTemplates(array(), $arParams["SEF_URL_TEMPLATES"]);
$arVariableAliases = CComponentEngine::MakeComponentVariableAliases(array(), $arParams["VARIABLE_ALIASES"]);
$componentPage = CComponentEngine::ParseComponentPath($arParams["SEF_FOLDER"], $arUrlTemplates, $arVariables);
CComponentEngine::InitComponentVariables($componentPage, $arComponentVariables, $arVariableAliases, $arVariables);
$arResult = array("FOLDER" => $arParams["SEF_FOLDER"], "URL_TEMPLATES" => $arUrlTemplates, "VARIABLES" => $arVariables, "ALIASES" => $arVariableAliases);
} |
Принимайте как априори это. Если желаете, то в мануале можете почитать что делает каждый из методов.
Подключаем шаблон:
$this->IncludeComponentTemplate($componentPage); |
Все! Больше никакой логики в component.php НЕ ТРЕБУЕТСЯ.
В $componentPage будет содержаться та страница, которая должна сейчас отработать (из адреса URL).
Вот какие у меня есть шаблоны (template.php подрубается по умолчанию):

Обратите внимание, что названия шаблонов совпадают с теми самыми season и episode из parametrs.php.
Посмотрим, например, что содержится в season.php.
А там всего лишь тот самый кирпичик:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<h1 class="head"><?$APPLICATION->ShowTitle(false)?></h1>
<?$APPLICATION->IncludeComponent(
"[CENSORE]",
"",
Array(
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"SECTION_CODE" => $arResult["VARIABLES"]["season_id"],
"CACHE_TYPE" => $arParams["CACHE_TYPE"],
"CACHE_TIME" => $arParams["CACHE_TIME"]
),
$component
);?> |
То есть вставляем компонент, который работает сам по себе. Туда же можно вставить любой html-код или несколько компонент.
Параметр $component говорит компоненту, что ты мол работаешь в команде, если что пользуйся общими ресурсами родителя. Можно поставить false, тогда он будет работать сам по себе.
Вот когда я это осознал, мне стало так обидно, что я раньше не разобрался, и так зло, что в мануал пихают много воды, которую просто не охота читать и терять время.
Повторяю - я убрал всю воду и оставил только то, что надо для работы. Если есть желание - можете втыкать портянки на 200 строк (чтобы по мануалу).