taurus2790
@taurus2790
Я не программер я только учусъ

Разработка комплексного компонента, как передавать данные с ЧПУ?

Добрый день. Уважаемые подскажите, не могу создать структуру комплексного компонента.

Имеется 2 файла шаблонов list и element

Теперь необходимо в файле components разрулить их подключение с включенным ЧПУ и без.

Вот мой код из component

$arDefaultUrlTemplates404 = array(
    "list" => "",
    "element" => "#MANUFACTURER_ID#/"
);

$arDefaultVariableAliases404 = array();
$arDefaultVariableAliases = array();
$arComponentVariables = array("MANUFACTURER_ID");

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["MANUFACTURER_ID"]) > 0)
        $componentPage = "element";
    else
        $componentPage = "list";

}

$arResult = array(
    "FOLDER" => $SEF_FOLDER,
    "URL_TEMPLATES" => $arUrlTemplates,
    "VARIABLES" => $arVariables,
    "ALIASES" => $arVariableAliases
);

$this->IncludeComponentTemplate($componentPage);


Если ЧПУ отключить, то всё хорошо, если параметр передаётся (/list/?MANUFACTURER_ID=2) то файл шаблона element подключается, но если я включаю чпу и передаю к примеру /list/2/ то вижу 404. (Никакой логики и компонентов в файлах list и element нет!)

Что я делаю не так? Как мне указать, что если я передаю параметр, то я имею ввиду именно MANUFACTURER_ID и необходимо подключить файл element шаблон?
  • Вопрос задан
  • 2186 просмотров
Решения вопроса 1
@kudis
Bitrix developer
Для ЧПУ нужно править urlrewrite.php
например:
array(
        "CONDITION" => "#^/catalog/(\\d+)/(\\d+)/id(\\d+)/[^\/]*$#",
        "RULE" => "SECTION_ID=\$1&SUBSECTION_ID=\$2&ELEMENT_ID=\$3",
        "ID" => "galament:shop",
        "PATH" => "/catalog/index.php",
    ),

будет ловить все запросы вида /catalog/123/123/id123/
и засовывать из в переменные SECTION_ID=\$1&SUBSECTION_ID=\$2&ELEMENT_ID=\$3

а подключить 'element' нужно в комплексном компоненте, например, как это сделано в Bitrix catalog
if(isset($arVariables["action"]) && in_array($arVariables["action"], $arCompareCommands))
		$componentPage = "compare";
	elseif(isset($arVariables["ELEMENT_ID"]) && intval($arVariables["ELEMENT_ID"]) > 0)
		$componentPage = "element";
	elseif(isset($arVariables["ELEMENT_CODE"]) && strlen($arVariables["ELEMENT_CODE"]) > 0)
		$componentPage = "element";
	elseif(isset($arVariables["SECTION_ID"]) && intval($arVariables["SECTION_ID"]) > 0)
		$componentPage = "section";
	elseif(isset($arVariables["SECTION_CODE"]) && strlen($arVariables["SECTION_CODE"]) > 0)
		$componentPage = "section";
	elseif(isset($_REQUEST["q"]))
		$componentPage = "search";
	else
		$componentPage = "sections";
   $this->IncludeComponentTemplate($componentPage);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы