Публикую решение маленькой частной задачи -- сортировка товаров по популярности (количеству добавлений в корзину). Возможно кому-нибудь пригодится.
[spoiler]
0. В инфоблоке создаем числовое свойство с кодом COUNT_TO_BASKET.
1. Добавляем обработчик события в файле /bitrix/php_interface/init.php
2. Перед вызовом bitrix:catalog.section формируем параметры сортировки и вставляем ссылки для сортировки:
[spoiler]
0. В инфоблоке создаем числовое свойство с кодом COUNT_TO_BASKET.
1. Добавляем обработчик события в файле /bitrix/php_interface/init.php
// событие вызывается перед добавлением товара к корзину. на вход передаются параметры товара. в случае если возвращает false, товар в корзину добавлен не будет.
// http://dev.1c-bitrix.ru/api_help/sale/sale_events.php
AddEventHandler("sale", "OnBeforeBasketAdd", Array("YenBasket", "BeforeBasketAdd"));
class YenBasket
{
function BeforeBasketAdd($arFields)
{
// Подключаем модуль
if(CModule::IncludeModule("iblock"))
{
// Получаем элемент
$res = CIBlockElement::GetByID($arFields["PRODUCT_ID"]);
if($ar_res = $res->GetNextElement())
{
// Получаем значение свойства-счетчика
$COUNT_TO_BASKET = $ar_res->GetProperty("COUNT_TO_BASKET");
// Увеличиваем счетчик на единицу и сохраняем значение в свойстве
CIBlockElement::SetPropertyValueCode($arFields["PRODUCT_ID"], "COUNT_TO_BASKET", intval($COUNT_TO_BASKET["VALUE"])+1);
}
}
}
}
|
2. Перед вызовом bitrix:catalog.section формируем параметры сортировки и вставляем ссылки для сортировки:
<div class="sort">Сортировать по:
<?if($_REQUEST["sort"]==hit):?><span>популярности</span><?else:?>
<a href="<?=$APPLICATION->GetCurPageParam("sort=hit", array("sort"))?>" title="актуальности">популярности</a><?endif;?>
</div>
<?
if($_REQUEST["sort"]=="hit")
{
$sort="PROPERTY_COUNT_TO_BASKET";
$by="DESC";
}
else
{
$sort="NAME";
$by="DESC";
}
?>
<?$APPLICATION->IncludeComponent("bitrix:catalog.section", ".default", array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "3",
"SECTION_ID" => $_REQUEST["SECTION_ID"],
"SECTION_CODE" => "",
"SECTION_USER_FIELDS" => array(
0 => "",
1 => "",
),
"ELEMENT_SORT_FIELD" => $sort,
"ELEMENT_SORT_ORDER" => $by,
"FILTER_NAME" => "arrFilter",
"INCLUDE_SUBSECTIONS" => "Y",
"SHOW_ALL_WO_SECTION" => "Y",
"PAGE_ELEMENT_COUNT" => "100",
"LINE_ELEMENT_COUNT" => "3",
"PROPERTY_CODE" => array(
0 => "MARKER",
1 => "",
),
"SECTION_URL" => "",
"DETAIL_URL" => "",
"BASKET_URL" => "/personal/basket.php",
"ACTION_VARIABLE" => "action",
"PRODUCT_ID_VARIABLE" => "id",
"PRODUCT_QUANTITY_VARIABLE" => "quantity",
"PRODUCT_PROPS_VARIABLE" => "prop",
"SECTION_ID_VARIABLE" => "SECTION_ID",
"AJAX_MODE" => "N",
"AJAX_OPTION_SHADOW" => "Y",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"AJAX_OPTION_HISTORY" => "N",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000",
"CACHE_GROUPS" => "Y",
"META_KEYWORDS" => "-",
"META_DESCRIPTION" => "-",
"BROWSER_TITLE" => "-",
"ADD_SECTIONS_CHAIN" => "N",
"DISPLAY_COMPARE" => "N",
"SET_TITLE" => "N",
"SET_STATUS_404" => "N",
"CACHE_FILTER" => "N",
"PRICE_CODE" => array(
0 => "BASE",
),
"USE_PRICE_COUNT" => "N",
"SHOW_PRICE_COUNT" => "1",
"PRICE_VAT_INCLUDE" => "Y",
"PRODUCT_PROPERTIES" => array(
),
"USE_PRODUCT_QUANTITY" => "N",
"DISPLAY_TOP_PAGER" => "Y",
"DISPLAY_BOTTOM_PAGER" => "Y",
"PAGER_TITLE" => "Товары",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => "",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"AJAX_OPTION_ADDITIONAL" => ""
),
false
);?>
|
В каком случае это может помешать?