Страница детального просмотра, ссылки на результаты поиска, предыдущий и следующий элемент
Запись от 29.05.2014
Что имеем:
- Страница со списком элементов (index.php, компоненты bitrix:catalog.filter и bitrix:catalog.section);
- Страница детального просмотра (detail.php, компонент bitrix:catalog.element).
- Страницу, детального просмотра;
- Шаблоны компонентов bitrix:catalog.section и bitrix:catalog.element.
detail.php
В параметрах компонента bitrix:catalog.section добавляем строки:
"PAGE_SEARCH_RESULT" => $APPLICATION->get_cookie("PAGE_SEARCH_RESULT"), // Страница с результатами поиска
"PAGE_SEARCH_FILTER" => $APPLICATION->get_cookie("PAGE_SEARCH_FILTER"), // Сериализованный массив фильтра по элементам
Шаблон компонента catalog.section
Файл component_epilog.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
// Сохраним параметры фильтра в cookie пользователя
$APPLICATION->set_cookie("PAGE_SEARCH_RESULT", $APPLICATION->GetCurPageParam(), time()+60*60*24*7);
// Массив фильтра для CIBlockElement::GetList
global ${$arParams["FILTER_NAME"]};
$arrFilter = ${$arParams["FILTER_NAME"]};
// Блок с выбором раздела, если нужно
if($_REQUEST["SECTION_CODE"]) {
$arrFilter["SECTION_CODE"] = $_REQUEST["SECTION_CODE"];
}
foreach($arrFilter["PROPERTY"] as $key=>$arProperty) {
$prefix = "";
if(strstr($key, "?")) {
$key = str_replace(Array("?"), "", $key);
$prefix = "?";
}
$arrFilter[$prefix."PROPERTY_".$key] = $arProperty;
}
unset($arrFilter["PROPERTY"]);
$APPLICATION->set_cookie("PAGE_SEARCH_FILTER", serialize($arrFilter), time()+60*60*24*7);
?>
Шаблон компонента catalog.element
Файл .parameters.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arTemplateParameters = Array(
"PAGE_SEARCH_RESULT" => Array(
"PARENT" => "SECTION_CODE",
"NAME" => "URL страницы с результатами поиска",
"TYPE" => "STRING",
"DEFAULT" => ""
),
"PAGE_SEARCH_FILTER" => Array(
"PARENT" => "SECTION_CODE",
"NAME" => "Массив фильтра поиска с которого перешли на страницу",
"TYPE" => "STRING",
"DEFAULT" => ""
)
);
?>
Файл result_modifier.php:
// ССЫЛКА НА СТРАНИЦУ С РЕЗУЛЬТАТАМИ ПОИСКА
$arResult["SEARCH_RESULT"] = $APPLICATION->get_cookie("PAGE_SEARCH_RESULT");
// ССЫЛКИ НА ПРЕДЫДУЩИЙ И СЛЕДУЮЩИЙ РЕЗУЛЬТАТ ПОИСКА
$arrFilterOriginal = $APPLICATION->get_cookie("PAGE_SEARCH_FILTER");
$arrFilterUser = unserialize($arrFilterOriginal);
$arSort = Array("sort" => "asc", "timestamp_x" => "desc");
$arFilter = array_merge(
Array ("IBLOCK_ID" => $arResult["IBLOCK_ID"], "ACTIVE" => "Y", "CHECK_PERMISSIONS" => "Y"),
$arrFilterUser
);
// Выбирать будем по 1 соседу с каждой стороны от текущего
$arNavParams = Array("nPageSize" => 1, "nElementID" => $arResult["ID"]);
$arSelect = Array("ID", "NAME", "DETAIL_PAGE_URL" );
$arItems = Array();
$rsElement = CIBlockElement::GetList($arSort, $arFilter, false, $arNavParams, $arSelect);
$rsElement->SetUrlTemplates($arParams["DETAIL_URL"]);
while($obElement = $rsElement->GetNextElement())
$arItems[] = $obElement->GetFields();
// возвращается от 1го до 3х элементов в зависимости от наличия соседей, обрабатываем эту ситуацию
if(count($arItems)==3):
$arResult["TOLEFT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
$arResult["TORIGHT"] = Array("NAME"=>$arItems[2]["NAME"], "URL"=>$arItems[2]["DETAIL_PAGE_URL"]);
elseif(count($arItems)==2):
if($arItems[0]["ID"]!=$arResult["ID"])
$arResult["TOLEFT"] = Array("NAME"=>$arItems[0]["NAME"], "URL"=>$arItems[0]["DETAIL_PAGE_URL"]);
else
$arResult["TORIGHT"] = Array("NAME"=>$arItems[1]["NAME"], "URL"=>$arItems[1]["DETAIL_PAGE_URL"]);
endif;
Файл template.php:
<div class="links">
<?if($arResult["TOLEFT"]):?>
<a class="back" href="<?=$arResult["TOLEFT"]["URL"]?>">предыдущее предложение</a>
<?endif;?>
<?if($arResult["SEARCH_RESULT"]):?>
<a class="up" href="<?=$arResult["SEARCH_RESULT"];?>">к результатам поиска</a>
<?endif;?>
<?if($arResult["TORIGHT"]):?>
<a class="right" href="<?=$arResult["TORIGHT"]["URL"];?>">следующее предложение</a>
<?endif;?>
</div>
Вот такой код. Часть с выборкой элементов нашел на местном форуме. В случае с комплексным компонентом $arSort лучше брать из параметров.