На сайте URL в каталогах, новостях и т.п. строятся по принципу #ELEMENT_ID#-#CODE#/ , на первый взгляд, все вроде хорошо и работает, но абсолютно отсутствует проверка по полю #CODE# .
Делаю просто #CODE# - все в порядке, проверка работает как надо. Такая же лабуда и с каталогом товаров.
Почему изначально такая странная конструкция? - не знаю, сайт достался в оч. плачевном состоянии, a поменять на просто #CODE# не позволит наличие кучи страниц в индексе.
Ну и собственно вопрос в том, как можно сделать корректную отдачу 404ой при такой конструкции?
$cp = $this->__component; // объект компонента
if (is_object($cp))
{
// Проверим существование такого символьного кода
if ($arResult['~CODE'] != $_REQUEST['ELEMENT_CODE'])
{
$cp->AbortResultCache();
@define('ERROR_404', 'Y');
CHTTP::SetStatus('404 Not Found');
return;
}
}
Странно, конечно но у меня в Новостях $_REQUEST['ELEMENT_CODE'] оказался пустым, поэтому использовал $arParams['ELEMENT_CODE']
Код
$cp = $this->__component; // объект компонента
if (is_object($cp)){
// Проверим существование такого символьного кода
if ($arResult['~CODE'] != $arParams['ELEMENT_CODE']){
$cp->AbortResultCache();
$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');
CHTTP::SetStatus('404 Not Found');
return;
Поэтому изменил ее на свою
Код
$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';
А в каталоге еще хлеще, $arParams['ELEMENT_CODE'] - передавалось пустое значение, поэтому пришлось прибегнуть к лютым костылям, и выдирать нужный url из того что есть, в общем вот, может кому пригодится
Код
$cp = $this->__component; // объект компонента
if (is_object($cp)){
function GetBetween($content,$start,$end){ //ф-ая для получения подстроки из строки
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}
$have = $arParams['COMPARE_PATH']; //берем путь к сравнению, (костыли и велосипеды, программируем как умеем)
$have = GetBetween($have,'/products/','/?action=COMPARE'); //выдераем подстроку
$need = $arResult['~ID'].'-'.$arResult['~CODE']; //делаем кусок url, который должен быть по факту
// Проверяем правильный ли url, пуляем на 404, если нет
if ($have != $need){
$cp->AbortResultCache();
$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';
}
}
P.S. Если есть более правильные решения, предлагайте ! Поможет мне, или может еще кому, со схожей проблемой.