Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Вопрос по обработке адресов

00 голосов
3
Здравствуйте, у меня вопрос по обработке адресов.
Есть много типов информационных блоков и есть страница где отображается информация о них. Страница расположена по адресу /types/index.php, в зависимости от входного параметра IBLOCK_TYPE отображается информация о разных типах.
Типичная ссылка выглядит вот так: mysite.com/types/index.php?IBLOCK_TYPE=catalog. Мне же хотелось сделать адреса такого типа mysite.com/catalog/. Я сделал это добавив условие в обработчик адресов:

условие /^\/([a-z]+)(\/)?/
правило /types/index.php?IBLOCK_TYPE=$1&

И у меня, естественно, возникла проблема. Если IBLOCK_TYPE содержит код несуществующего типа, страница-то все-равно отображается. А типов инфоблоков может быть бесконечно. Пытался мудрить в init.php проверку на существование типа и перенаправлять на 404, но руки кривые :)

Как мне решить эту проблему, друзья-товарищи?
спросил 11 Июнь, 13 от Konung (200 баллов)

3 Ответы

00 голосов
Не знаю как это сделать наиболее "правильно" с точки зрения битрикса, чтобы не было лишних редиректов. Но можно решить "влоб" - создавать регулярку на основе данных об иблоках в таком виде:
"CONDITION" => "#^/(catalog|news|articles)/#",

вот эту строку можно фрмировать на основе данных из бд и хранить в кеше.
ответил 11 Июнь, 13 от Eddie (2,060 баллов)
00 голосов
Есть один противоестественный способ.

Код
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);

function _Check404Error()
{
   if (defined('ERROR_404') && ERROR_404=='Y')
   {
      GLOBAL $APPLICATION;
      $APPLICATION->RestartBuffer();
      include   $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/header.php';
      require   ($_SERVER['DOCUMENT_ROOT'].'/404.php');
      include   $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/footer.php';
   }
}


Ну и, соответственно, если инфоблок не найден, нужно делать define('ERROR_404', 'Y');
ответил 23 Июнь, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Дмитрий Якинцев пишет:
Не знаю как это сделать наиболее "правильно" с точки зрения битрикса, чтобы не было лишних редиректов. Но можно решить "влоб" - создавать регулярку на основе данных об иблоках в таком виде:

"CONDITION" => "#^/(catalog|news|articles)/#",



вот эту строку можно фрмировать на основе данных из бд и хранить в кеше.


Думал об этом, спасибо :)


Цитата
Dmitry Ban пишет:
Есть один противоестественный способ.



Код
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);



function _Check404Error()






Ну и, соответственно, если инфоблок не найден, нужно делать define('ERROR_404', 'Y');


Интересное решение, надо попробовать.
ответил 27 Сен, 13 от Konung (200 баллов)

Похожие вопросы

0 голосов
4 ответов
0 голосов
4 ответов
0 голосов
0 ответов
спросил 15 Окт, 13 от аноним
0 голосов
2 ответов
спросил 06 Май, 14 от MortiMer (160 баллов)
0 голосов
2 ответов