Решал такую проблему на комплексном компоненте каталога. К сожалению приходилась делать лишний запрос в БД.
Код размещался в файле section.php в самом верху
Косяк только в том что коды у разделов и товаров должны быть уникальны.
Код работает только для отсутствия последнего слеша. В целом его можно пересобрать для проверки цельной адресной строки.
Код размещался в файле section.php в самом верху
| Код |
|---|
CModule::IncludeModule("iblock");
$arExp = explode("/", $arResult["VARIABLES"]["SECTION_CODE_PATH"]);
if(empty($arExp[count($arExp)-1]))
unset($arExp[count($arExp)-1]);
$arFilter = Array('IBLOCK_ID'=>$arParams["IBLOCK_ID"], 'GLOBAL_ACTIVE'=>'Y', 'CODE'=>$arExp[count($arExp)-1], "ACTIVE"=>"Y");
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter, true);
if($ar_result = $db_list->GetNext())
{
if($APPLICATION->GetCurPage() != $ar_result["SECTION_PAGE_URL"])
LocalRedirect($ar_result["SECTION_PAGE_URL"]);
}
else
{
$arSelect = Array("ID", "NAME", "DETAIL_PAGE_URL");
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
if($arFields = $res->GetNext())
{
if($APPLICATION->GetCurPage() != $arFields["DETAIL_PAGE_URL"])
LocalRedirect($arFields["DETAIL_PAGE_URL"]);
}
global $APPLICATION;
$APPLICATION->RestartBuffer();
CHTTP::SetStatus("404 Not Found");
include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
include($_SERVER["DOCUMENT_ROOT"].PATH_TO_404);
die();
}
|
Косяк только в том что коды у разделов и товаров должны быть уникальны.
Код работает только для отсутствия последнего слеша. В целом его можно пересобрать для проверки цельной адресной строки.