Найдена проблема в компоненте 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/
Работают правильно.