Публикую решение маленькой частной задачи -- сортировка товаров по популярности (количеству добавлений в корзину). Возможно кому-нибудь пригодится.
[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 );?> |