• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела wpt лично.

Помощь Вопросы и решение проблем с Битрикс

Статус
В этой теме нельзя размещать новые ответы.
Вы не посмотрели ссылки, поэтому не поняли вопрос. Я не спрашивал что разместить на этой странице. У меня есть прекрасная страница 404. Проблема в том, что если несуществующая страница находится в подпространстве компонента новостей (например, если он размещен по адресу /news/, а пользователь пытается попасть на несуществующую /news/abrakadabra), то пользователь видит не страницу ошибки 404.php, а список новостей, или надпись "Элемент не найден!", вот я и пытаюсь узнать, как добиться вывода содержимого 404.php в случае ошибок компонента новостей.

Я обычно делаю так:
1)В файле init.php добавляю обработчик:

Код:
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);
function _Check404Error()
{
   if (defined('ERROR_404') && ERROR_404=='Y' && !defined('ADMIN_SECTION'))
   {
      GLOBAL $APPLICATION;
      $APPLICATION->RestartBuffer();
      require $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/header.php';
      require $_SERVER['DOCUMENT_ROOT'].'/404.php';
      require $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/footer.php';
   }
}

2) В файле 404.php
Код:
<?
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("404 ошибка");
?>
Тело 404 страницы...
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
 
Я обычно делаю так:
1)В файле init.php добавляю обработчик:

Код:
AddEventHandler('main', 'OnEpilog', '_Check404Error', 1);
function _Check404Error()
{
   if (defined('ERROR_404') && ERROR_404=='Y' && !defined('ADMIN_SECTION'))
   {
      GLOBAL $APPLICATION;
      $APPLICATION->RestartBuffer();
      require $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/header.php';
      require $_SERVER['DOCUMENT_ROOT'].'/404.php';
      require $_SERVER['DOCUMENT_ROOT'].'/bitrix/templates/'.SITE_TEMPLATE_ID.'/footer.php';
   }
}

2) В файле 404.php
Код:
<?
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("404 ошибка");
?>
Тело 404 страницы...
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Не приемлемо! В init.php писать ничего нельзя.. Читайте документацию!
 
Что мешает в шаблоне компонента (или в result_modifier.php).
if (empty($arResult['ID'])) LocalRedirect('/404.php');
не пробовал сей вариант, поскольку его реализация должна привести к тому, что header.php и footer.php будут по 2 раза отрабатывать
LocalRedirect - аналог обычного редиректа. Так что не будут.
Поправьте, пожалуйста, если ошибаюсь, но мне эта ситуация видится так: вначале загружается header.php несуществующей страницы, доходит до загрузки новостного компонента, новостной компонент отдает 404, пользователя редиректит на /404.php который опять загружает /header.php
 
Не приемлемо! В init.php писать ничего нельзя.. Читайте документацию!
Интересно...
Если речь идет о /bitrix/php_interface/init.php:
init.php - необязательный файл в рамках структуры файлов Bitrix Framework. Он автоматически подключается в прологе

Скрытое содержимое доступно для зарегистрированных пользователей!
 
Поправьте, пожалуйста, если ошибаюсь, но мне эта ситуация видится так: вначале загружается header.php несуществующей страницы, доходит до загрузки новостного компонента, новостной компонент отдает 404, пользователя редиректит на /404.php который опять загружает /header.php

Почти. Проверка статуса на ERROR_404 происходит в эпилоге сайта затем, после RestartBuffer "инклюдится" страница 404.php
подробнее тут:
Скрытое содержимое доступно для зарегистрированных пользователей!

Другого, более чистого решения, пока не встречал
 
Интересно...
Если речь идет о /bitrix/php_interface/init.php:
init.php - необязательный файл в рамках структуры файлов Bitrix Framework. Он автоматически подключается в прологе
Это понятно. Ну к примеру разместить в маркет плейсе модуль или компонент, то битрикс не пропустит такое решение с init.php
 
Согласен, init.php для частных случаев
Именно, но всё же файл в структуру не входит, так что лучше без него и костылей в нем. С 404 не парюсь вообще, смысла не вижу) функций хватает и так..
 
Другого, более чистого решения, пока не встречал
Благодарю, довольно интересное решение. Заинтересовал тот момент, что код по приведенной Вами ссылке отличается от кода, который Вы предложили несколькими комментариями выше. Ваше решение лучше?
 
Благодарю, довольно интересное решение. Заинтересовал тот момент, что код по приведенной Вами ссылке отличается от кода, который Вы предложили несколькими комментариями выше. Ваше решение лучше?
Нет, не лучше. Там проверка наличия 404 файла и др.
Это вообще довольно грязное решение для этих целей. Но других, чтобы из коробки, я не видел.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху