Добрый вечер, хочу сделать URL Без разделов, т.е. например есть товар по ссылке site.ru/catalog/tovar-1/ А хочу что бы было site.ru/tovar-1/ Т.е. при переходе из каталога в карточку товара, что бы в URL карточки не выводило его подраздел. Просто убрать #SECTION_CODE# из ссылки #SITE_DIR#/#SECTION_CODE#/#ELEMENT_CODE#/ дает при переходе 404 ошибку. В ЧПУ тоже ничего не помогает
У меня сейчас так http://rgho.st/8Wfyx78FW http://rgho.st/8wTbckmCp Ссылку на карточку указывает в каталоге ту что мне нужно, но при переходе на страницу карточки, выдает 404 либо Service Temporarily Unavailable You have made too many requests per second. А если использую SECTION_CODE_PATH то каталог вообще не отображается.
При переходе по меню разделов каталога у нас все хорошо. А вот при переходе на товар, компонент матерится – не может найти раздел. А ведь должен искать товар по символьному коду вместо раздела.
Должен, да не обязан.
Ковыряем исходный код /bitrix/components/bitrix/catalog/component.php.
В конце файла есть вызов
$this->IncludeComponentTemplate($componentPage);
где $componentPage – это страница, которую надо подключить, в которой лежит либо деталка каталога, либо список товаров.
Соответственно, когда нам нужна деталка, $componentPage = 'element', а когда список - $componentPage = 'section';
Выведя var_dump($componentPage) мы увидим там 'element'.
Выходит компонент не понимает что ему отдали в урле – элемент инфоблока или категорию. И он начинает искать категорию, не находит и вываливает ошибку, либо кидает на 404-ю страницу.
Значит, нужно его научить искать то что нужно.
Для этого копируем в свое пространство имен компонент /bitrix/components/bitrix/catalog.
И на 109 стр. ставим небольшую проверочку.
if ($componentPage == 'section'){ $rowSection = Bitrix\Iblock\SectionTable::getRow([ 'select' => ['CODE'], 'filter' => ['IBLOCK_ID' => $arParams['IBLOCK_ID'], '=CODE' => $arResult['VARIABLES']['SECTION_CODE']], ]); if (is_null($rowSection)){ $arResult['VARIABLES']['ELEMENT_CODE'] = $arResult['VARIABLES']['SECTION_CODE']; unset($arResult['VARIABLES']['SECTION_CODE']); $componentPage = 'element'; } }Которая говорит, что если у нас $componentPage == 'section' т.е. мы запросили категорию, давайте убедимся что это действительно категория и она существует в данном ИБ. И вот ежели ее нет, то значит от компонента пытаются получить деталку товара. И нам нужно переписать $componentPage = 'element'. И грохнуть unset($arResult['VARIABLES']['SECTION_CODE']);
У меня получилось сделать так: 1. Чпу в настройках инфоблока. https://yadi.sk/i/R6fxtF3wkOw7lA 2. Чпу в настройках компонента. https://yadi.sk/i/SpUdejL1gTuaIw 3. Как написал Артём Анатольевич выше, надо кастомизировать компонент catalog, предварительно скопировав его в свое пространство имен. Изменяем файл /bitrix/components/bitrix/catalog/component.php, добавляя перед строкой