Битрикс – Как убрать в ссылках на товар /catalog/

Рассмотрим один из вариантов как сделать ссылки без папки catalog.

Как в Битриксе создать url без указания папки каталога

В случае когда нам нужно просто переименовать папку, вся работа состоит из таких шагов:

1. Переименовать папку, например, заходим на FTP и переименовываем store на catalog.

2. Заходим в инфоблок и в его настройках меняем 3 правила формирования #SITE_DIR#/store/ на #SITE_DIR#/catalog/

3. Открываем настройки компонента каталога и также само прописываем вместо /store/ – /catalog/. Правила формирования остаются такими же – #SECTION_CODE#/#ELEMENT_CODE#/. При сохранении компонента происходит перезапись файла urlrewrite.php. Если вы меняете папку через код файла /catalog/index.php – то вам также нужно изменить правило в urlrewrite.php.

Для чего вам вся эта информация?) Теперь вы лучше понимаете стандартную процедуру переименования и формирования ссылок в Битриксе.

А сейчас перейдем непосредственно к решению задачи – убираем /catalog/ из ссылок. Открываем urlrewrite:

array (
    'CONDITION' => '#^/#',
    'RULE' => '',
    'ID' => 'bitrix:catalog',
    'PATH' => '/catalog/index.php',
    'SORT' => 20,
  ),

Если у вас есть многосайтовость, то правило будет таким:

  array (
    'CONDITION' => '#^/ru/#',
    'RULE' => '',
    'ID' => 'bitrix:catalog',
    'PATH' => '/ru/catalog/index.php',
    'SORT' => 100,
  ),

В инфоблоке оставляем такие настройки:
URL страницы информационного блока: #SITE_DIR#/catalog/
URL страницы раздела: #SITE_DIR#/#SECTION_CODE#/
URL страницы детального просмотра: #SITE_DIR#/#SECTION_CODE#/#ELEMENT_CODE#/

Если вы используете SECTION_CODE_PATH – учитывайте это в настройках, т.к. на примере SECTION_CODE.

И последнее что нам необходимо сделать, переделать файл /catalog/index.php. Рассмотрим код:

<?if (CSite::InDir('/catalog/')) :?>
..bitrix:catalog.section..
<?else:?>
..bitrix:catalog..
<?endif;?>

При помощи такой проверки мы всё же оставляем папку /catalog/ – на ней будет компонент bitrix:catalog.section – в котором вы можете выводить либо список разделов, либо общий список товаров без привязки к ID раздела. Или же просто возьмите код из sections.php вашего компонента, и добавьте параметры из bitrix:catalog – он выполняется в блоке между else -> endif. По сути блок между else -> endif уже был на странице, и, в некоторых случаях, мы копируем полностью все параметры в блок if -> else.

Какие есть минусы у такого способа? Если у вас есть другие динамические компоненты, например новости, вам придется разместить код компонента на странице /catalog/index.php, например так:

<?if (CSite::InDir('/catalog/')) :?>
<?elseif(CSite::InDir('/blog/')):?>
<?else:?>
<?endif;?>

Без этого на сайте будет ошибка 404. Для блога используем bitrix:news. При многосайтовости указываем /ru/catalog/ и /ru/blog/.

Друзья, вот и все 🙂 Надеюсь у вас всё получилось. Возможно у вас есть способ реализовать это более красивее, если это так – жду в комментариях. Конструктивная критика приветствуется 😉

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

6 коментаря

  1. А если комплексный компонент новостей имеет корневой раздел /news/, адрес деталки начинается от корня сайта, тогда ссылки будут конфликтовать и детальная страница новости будет недоступна. Как быть?

    1. Если вы имеете ввиду что у вас и каталог и новости работают по принципу “адрес деталки начинается от корня сайта” – то такого рода задачу к сожалению не решал, и да – будет конфликт. В таком случае рекомендую перевести новости на страницы от раздела /news/ или /blog/

  2. Сделал все по инструкции, все заработало , но отвалилась 404 страница, на любую кашу в урле кидает на файл каталога и еще к сожалению пропадает из хлебных крошек ссылка на каталог
    Если есть способ решить это подскажите.
    спасибо.

Залишити відповідь