Найдена проблема в компоненте bitrix:news.detail. У некоторых из-за этого могут возникнуть баги.
В чем соль?
Компонент сначала ищет элемент (по CODE or ID), затем только раздел (по CODE или ID), что не верно.
Представим пути:
/news/section_1/2017/
/news/section_2/2017/
Компонент ищет вначале элемент (2017), а потом только раздел (section_1 OR section_2). А должен сначала учесть раздел, а потом уже элемент.
Как пофиксить?
Копируем папку /bitrix/components/bitrix/news.detail, ложем в папку /bitrix/components/dev2fun/
Открываем components.php
Находим кусок и удаляем его:
Далее находим:
И после него вставляем:
Что мы сделали? Мы научили компонент учитывать раздел.
Вызов компонента теперь таков:
Теперь пути:
/news/section_1/2017/
/news/section_2/2017/
Работают правильно.
В чем соль?
Компонент сначала ищет элемент (по CODE or ID), затем только раздел (по CODE или ID), что не верно.
Представим пути:
/news/section_1/2017/
/news/section_2/2017/
Компонент ищет вначале элемент (2017), а потом только раздел (section_1 OR section_2). А должен сначала учесть раздел, а потом уже элемент.
Как пофиксить?
Копируем папку /bitrix/components/bitrix/news.detail, ложем в папку /bitrix/components/dev2fun/
Открываем components.php
Находим кусок и удаляем его:
//Handle case when ELEMENT_CODE used if($arParams["ELEMENT_ID"] <= 0) $arParams["ELEMENT_ID"] = CIBlockFindTools::GetElementID( $arParams["ELEMENT_ID"], $arParams["~ELEMENT_CODE"], false, $arFilter["SECTION_CODE"], $arFilter ); |
Далее находим:
if ($arParams["STRICT_SECTION_CHECK"])
{
if ($arParams["SECTION_ID"] > 0)
{
$arFilter["SECTION_ID"] = $arParams["SECTION_ID"];
}
elseif (strlen($arParams["~SECTION_CODE"]) > 0)
{
$arFilter["SECTION_CODE"] = $arParams["~SECTION_CODE"];
}
elseif ($this->getParent() && strpos($arParams["DETAIL_URL"], "#SECTION_CODE_PATH#") !== false)
{
$this->abortResultCache();
Iblock\Component\Tools::process404(
trim($arParams["MESSAGE_404"]) ?: GetMessage("T_NEWS_DETAIL_NF")
,true
,$arParams["SET_STATUS_404"] === "Y"
,$arParams["SHOW_404"] === "Y"
,$arParams["FILE_404"]
);
return 0;
}
} |
И после него вставляем:
//Handle case when ELEMENT_CODE used if($arParams["ELEMENT_ID"] <= 0) $arParams["ELEMENT_ID"] = CIBlockFindTools::GetElementID( $arParams["ELEMENT_ID"], $arParams["~ELEMENT_CODE"], (isset($arFilter["SECTION_ID"])?$arFilter["SECTION_ID"]:false), (isset($arFilter["SECTION_CODE"])?$arFilter["SECTION_CODE"]:false), $arFilter ); |
Что мы сделали? Мы научили компонент учитывать раздел.
Вызов компонента теперь таков:
<?$APPLICATION->IncludeComponent( "dev2fun:news.detail", "", Array() );?> |
Теперь пути:
/news/section_1/2017/
/news/section_2/2017/
Работают правильно.