Как настроить ЧПУ для bitrix:catalog, чтобы URL карточки товара был без раздела и без слэша на конце?
Приветствую. Прошу помощи.
Структура адресов следующая:
раздел каталога содержит всю цепочку вложенности, т.е., например, site.ru/catalog/sukhofrukty/ananas/
соответственно, в компоненте в секции "SEF_URL_TEMPLATES" пишем "section" => "#SECTION_CODE_PATH#/" , здесь всё понятно
но вот адрес карточки товара должен быть таким: site.ru/catalog/sushenyy-ananas , т.е. никаких разделов, просто символьный код товара, но без слэша на конце
в настройках компонента я написал "element" => "#ELEMENT_CODE#" без слэша
если поставить слэш на конце, то всё работает, но вот если не использовать слэш на конце, то в карточку товара заходит, но при заходе в корень каталога site.ru/catalog/ - ошибка
залез в сам компонент в файл component.php - там нужная страница подключается строчкой $this->IncludeComponentTemplate($componentPage);
и при переходе в /catalog/ переменная $componentPage равна "element", хотя должна быть "sections"
т.е. компонент думает, что мы переходим на детальную карточку, когда обращаемся к корню каталога
подозреваю, что всё дело в слэше
как быть, выводить компонент в своё пространство имён и кастомизировать?
scouser92, в настройках компонента, именно через настройки (не через IDE) установите параметры которые вам нужны и сохраните. Это надо чтоб правила обработки перезаписались.
I'm Yoda, я так и делал, через настройки компонента
но там из правил обработки компонента нет ничего такого, там же просто одно правило array (
'CONDITION' => '#^/catalog/#',
'RULE' => '',
'ID' => 'bitrix:catalog',
'PATH' => '/catalog/index.php',
'SORT' => 100,
),
компонент комплексный
а далее уже вся логика в component.php
no_one_safe, я в задании описал это, просто без скриншота
вот настройки компонента
всё настроено и в компоненте и в инфоблоке идентично
вопрос в том, что при таких настройках не вызывается файл sections.php при переходе в корень каталога
scouser92, с комплексным компонентом точно не получится. В ядре есть метод CComponentEngine::__CheckPath4Template не суть как, но комплексный компонент его вызывает, в нем регулярки - я поковырял и пришел к выводу, что твой вариант не взлетит (можешь сам поразбираться - файл /bitrix/modules/main/classes/general/component_engine.php)
Если кастомить компонент, то тут два варианта:
1. Первый смысл в себе несет такой же как в моем комменте, придумать проверку и указать $componentPage = "sections";
2. Второй вариант написать свой класс дочерний от класса CComponentEngine и переопределить там методы, в компоненте соответственно вместо $engine = new CComponentEngine($this);
создать объект своего класса
Поэтому я голосую за свой вариант из комментов, чтобы ничего не кастомить:
в файле element.php в начале сделать проверку
if($APPLICATION->GetCurPage() === $arParams['SEF_FOLDER']) {
@include_once('sections.php');
}
else {
// здесь все как есть в файле
}
проверка железная, даже если потом изменишь настройки компонента все будет норм работать
PetrPo, благодарю
тоже считаю, что чтобы не кастомизировать компонент можно и таким костыльчиком сделать
Битрикс, как я понял, строит урлы по слэшам, поэтому такие проблемы и возникают