Можете не верить, но я только недавно проникся идеей комплексных компонент, до этого они меня пугали
Постараюсь объяснить новичкам что это такое и когда это лучше применять, и как.
[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 строк (чтобы по мануалу).