1С-Битрикс & 404 Not found

Проблема — компоненты при возникновении 404й ошибки не отдают 404.php.

Проблема 404-ой страницы на сайтах под управлением 1С-БУС известна давно, и до недавнего времени не имела валидного решения. Сегодня я расскажу о текущем способе перехвата 404-ой ошибки и вывода пользователю нужной страницы.

Начнем по порядку.

404 & Bitrix:catalog.

Первичная настройка.

Для начала пройдемся по настройкам ИБ и компонента.

Настройки инфоблока

Настройки инфоблока
  • "URL страницы информационного блока" — тут вроде все понятно, просто указываем каталог из которого происходит вызов компонента для этого ИБ.
  • "URL страницы раздела" — тут нужно быть аккуратным, если все элементы ИБ лежат в корне раздела, то мы не можем использовать.
  • "#SECTION_CODE#" — при такой настройке роутер компонента будет путать разделы и элементы ИБ. Чтобы этого не происходило мы используем "#SECTION_CODE_PATH#".
  • "URL страницы детального просмотра" — т.к. мы кладем все элементы в корень, то здесь используется только "#ELEMENT_CODE#".

На этом с настройками ИБ закончили.

Настройки компонента

Настройки компонента

  • "Каталог ЧПУ" — соответственно раздел в котором происходит вызов компонента
  • "Раздел" - повторяем настройку из ИБ, но перед "#" не ставим слеш "/", в противном случаи компонент будет работать не верно!
  • "Детальная информация" - повторяем настройку из ИБ, но перед "#" не ставим слеш "/", в противном случаи компонент будет работать не верно!
  • И не забудем про "волшебную галочку".
  • Настройки компонента
С настройками компонента закончили.

Элемент не найден

Теперь о грустном - 404й статус мы вроде как получаем, но компонент не спешит перебрасывать нас на 404.php, а просто пишет что раздел или элемент не найден.

А нам то нужно отобразить 404ю, чтобы юзер понял что что-то пошло не так, показать ему доп менюшку и т.д.

Решение проблемы.

Для решения этой проблемы мы воспользуемся механизмом событий 1С-БУС.

//событие "ловушка" для 404й
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);
function _Check404Error(){
   if(defined('ERROR_404') && ERROR_404=='Y' || CHTTP::GetLastStatus() == "404 Not Found"){
      GLOBAL $APPLICATION;
      $APPLICATION->RestartBuffer();
      require $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH.'/header.php';
      require $_SERVER['DOCUMENT_ROOT'].'/404.php';
      require $_SERVER['DOCUMENT_ROOT'].SITE_TEMPLATE_PATH.'/footer.php';
   }
}

В эпилоге мы запускаем проверку на установку константы "ERROR_404" и ее текущее значение, а также проверяем последний выставленный статус, это позволяет выловить всевозможные проявления 404й ошибки у 1С-БУС. Далее мы рестартуем HTML буфер подготовленный системой для вывода. Подключаем хедер текущего шаблона, подгружаем тело 404й страницы, а затем подключаем футер текущего шаблона. Данный подход позволяет сохранить текущий URL, шаблон и навигацию, поэтому пользователь легко сможет перейти обратно в рабочий раздел, а также в контентной области отображаем тело 404й страницы, это дает понять что запрошенной страницы действительно нет.

Ошибка 404

404 & Bitrix:news.

К сожалению компонент Bitrix:news пока не умеет адекватно отдавать хотя бы голый 404й статус, мы в поиске решения.


Оставить комментарий