Добрый день! Стоит задача, сделать сортировку товара по возрастанию цены, по убыванию цены, по наименованию, по популярности. Т.е. это просто форма с выпадающим списком, при выборе значеия из этого списка срабатывает jquery который выполняет метод submit() на форме, тем самым отсылая через $_GET данные формы.
Чтобы сортировка сохранялась при переходе на другую страницу раздела (в постраничной навигации) в файле init.php я прописал вот такой код (видел где-то на форумах) :
Код |
---|
AddEventHandler("main", "OnPageStart", Array("CatalogFilterFromSessionClass", "CatalogFilterFromSession"));
//Заносим данные сортировки списка товаров в массив $_SESSION
class CatalogFilterFromSessionClass
{
public function CatalogFilterFromSession()
{
if(isset($_GET['sort']))
{
if ($_GET["sort"] == "price") //Сортировка по цене
{
session_start();
$_SESSION['ELEMENT_SORT_FIELD'] = 'catalog_PRICE_1';
}
elseif($_GET["sort"] == "name") //Сортировка по наименованию
{
session_start();
$_SESSION['ELEMENT_SORT_FIELD'] = 'name';
}
elseif ($_GET["sort"] == "shows") //Сортировка по популрности
{
session_start();
$_SESSION['ELEMENT_SORT_FIELD'] = 'shows';
}
}
//Количество товаров на странице
if(isset($_GET["long_lists"]))
{
session_start();
$_SESSION['PAGE_ELEMENT_COUNT'] = $_GET["long_lists"];
}
if(isset($_GET["sort_order"]))
{
session_start();
$_SESSION['ELEMENT_SORT_ORDER'] = $_GET["sort-order"];
}
}
} |
далее в файле section.php комплексного компонента bitrix:catalog перед вызовом catalog.section значения ELEMENT_SORT_FIELD и ELEMENT_SORT_ORDER из $_SESSION перезаписывают поля в $arParams.
Код |
---|
$arParams["ELEMENT_SORT_FIELD"] = $_SESSION['ELEMENT_SORT_FIELD'];
$arParams["PAGE_ELEMENT_COUNT"] = $_SESSION['PAGE_ELEMENT_COUNT'];
$arParams["ELEMENT_SORT_ORDER"] = $_SESSION['ELEMENT_SORT_ORDER']; |
а вот сама форма сортировки находится в шаблоне catalog.section перед списком товаров:
Код |
---|
<div class="shown">
<p>Показать по:</p>
<a <?=ShowSelectedLongList("10", $arParams["PAGE_ELEMENT_COUNT"]); ?> href="<?=$APPLICATION->GetCurPage();?>?long_lists=10">10</a>
<a <?=ShowSelectedLongList("20", $arParams["PAGE_ELEMENT_COUNT"]); ?> href="<?=$APPLICATION->GetCurPage();?>?long_lists=20">20</a>
<a <?=ShowSelectedLongList("40", $arParams["PAGE_ELEMENT_COUNT"]); ?> href="<?=$APPLICATION->GetCurPage();?>?long_lists=40">40</a>
<a <?=ShowSelectedLongList("60", $arParams["PAGE_ELEMENT_COUNT"]); ?> href="<?=$APPLICATION->GetCurPage();?>?long_lists=60">60</a>
<p class="sorted">Сортировать по:</p>
<fo rm id="section-sort-form" method="get" action="<?=$APPLICATION->GetCurPage(); ?>" >
<select name="sort" id="sort-select" >
<option <?=ShowSelected("catalog_PRICE_1","ASC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]); ?> value="price_up" >возрастанию цены</option>
<option <?=ShowSelected("catalog_PRICE_1","DESC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]); ?> value="price_down" >убыванию цены</option>
<option <?=ShowSelected("name","ASC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]) ?> value="name_up" >алфавиту (по возрастанию)</option>
<option <?=ShowSelected("name","DESC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]) ?> value="name_down" >алфавиту (по убыванию)</option>
<option <?=ShowSelected("shows","ASC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]); ?> value="shows_up" >популярности (по возрастанию)</option>
<option <?=ShowSelected("shows","DESC",$arParams['ELEMENT_SORT_FIELD'],$arParams["ELEMENT_SORT_ORDER"]); ?> value="shows_down" >популярности (по убыванию)</option>
</select>
</form>
</div> |
функции ShowSelectedLongList() и ShowSelected() просто подсвечивают количество
товаров (по сколько товаров на странице) и делают активным выбранный пункт сортировки в выпадающем списке. Они описаны выше:
Код |
---|
<?
function ShowSelected($str,$str_order,$params,$order)
{
if(($str == $params)&&($str_order==$order))
{
$str = 'selected="selected"';
}
else
{
$str = '';
}
return $str;
}
/**
* выделяем кнопку количество отображаемых элементов списка
* */
function ShowSelectedLongList($str,$params)
{
if($str == $params)
{
$str = 'class="selected"';
}
else
{
$str = '';
}
return $str;
}
?> |
Всё работает но форма сортировки кешируется. Я знаю что еёё можно вывести как-то из под кеша с помощью component_epilog.php но я не пойму как.
В вопросах кеша я вообще не силен (пока) и всегда парюсь когда возникают задачи подобного рода. Подскажите что в этом механизме куда вынести и/или
переделать чтобы всё заработало как надо?
Заранее спасибо!