Yandex Metrika
sanches.free

Умный фильтр каталога вне стандартного шаблона: SHOW_ALL_WO_SECTION и ЧПУ

Задача

Компонент bitrix:catalog.smart.filter обычно живёт на странице раздела в составе catalog. Вынесенный в нестандартное место (например, в шаблон news) он может «ронять» счётчик количества элементов без раздела. Ниже — скрытые параметры и доработки ЧПУ.

Фильтр без привязки к разделу

Укажите SECTION_ID как 0 и активируйте SHOW_ALL_WO_SECTION = Y (аналог поведения catalog.section). Компоненту списка тоже понадобится тот же флаг.

Подключение в шаблоне catalog

$APPLICATION->IncludeComponent(
   "bitrix:catalog.smart.filter",
   "",
   array(
      "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
      "IBLOCK_ID" => $arParams["IBLOCK_ID"],
      "SECTION_ID" => !!$arCurSection?$arCurSection['ID']:0,
      "SHOW_ALL_WO_SECTION" => !!$arCurSection?"N":"Y", // !!!
      "FILTER_NAME" => $arParams["FILTER_NAME"],
      "PRICE_CODE" => $arParams["PRICE_CODE"],
      "CACHE_TYPE" => $arParams["CACHE_TYPE"],
      "CACHE_TIME" => $arParams["CACHE_TIME"],
      "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
      "SAVE_IN_SESSION" => "N",
      "FILTER_VIEW_MODE" => $arParams["FILTER_VIEW_MODE"],
      "XML_EXPORT" => "Y",
      "SECTION_TITLE" => "NAME",
      "SECTION_DESCRIPTION" => "DESCRIPTION",
      'HIDE_NOT_AVAILABLE' => $arParams["HIDE_NOT_AVAILABLE"],
      "TEMPLATE_THEME" => $arParams["TEMPLATE_THEME"],
      'CONVERT_CURRENCY' => $arParams['CONVERT_CURRENCY'],
      'CURRENCY_ID' => $arParams['CURRENCY_ID'],
      "SEF_MODE" => $arParams["SEF_MODE"],
      "SEF_RULE" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["smart_filter"],
      "SMART_FILTER_PATH" => $arResult["VARIABLES"]["SMART_FILTER_PATH"],
      "PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"],
      "INSTANT_RELOAD" => $arParams["INSTANT_RELOAD"],
      "DISPLAY_ELEMENT_COUNT" => "N",
   ),
   $component,
   array('HIDE_ICONS' => 'Y')
);

Для вывода разделов в sections.php достаточно include('section.php'); после добавления "SHOW_ALL_WO_SECTION"=>"Y" к catalog.section.

Подключение в шаблоне news

$APPLICATION->IncludeComponent(
   "bitrix:catalog.smart.filter",
   "",
   array(
      "IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
      "IBLOCK_ID" => $arParams["IBLOCK_ID"],
      "SECTION_ID" => !!$arResult['VARIABLES']['SECTION_ID'] || !!$arResult['VARIABLES']['SECTION_CODE']?$arResult['VARIABLES']['SECTION_ID']:0,
      "SECTION_CODE" => $arResult['VARIABLES']['SECTION_CODE'],
      "SHOW_ALL_WO_SECTION" => "Y", // !!!
      "FILTER_NAME" => $arParams["FILTER_NAME"],
      "PRICE_CODE" => array(),
      "CURRENCY_ID" => "",
      "CONVERT_CURRENCY" => "N",
      "HIDE_NOT_AVAILABLE" => "N",
      "CACHE_TYPE" => $arParams["CACHE_TYPE"],
      "CACHE_TIME" => $arParams["CACHE_TIME"],
      "CACHE_GROUPS" => $arParams["CACHE_GROUPS"],
      "SAVE_IN_SESSION" => "N",
      "FILTER_VIEW_MODE" => "",
      "XML_EXPORT" => "Y",
      "SECTION_TITLE" => "NAME",
      "SECTION_DESCRIPTION" => "DESCRIPTION",
      "SEF_MODE" => $arParams["SEF_MODE"],
      "SEF_RULE" => $arResult["FOLDER"].$arResult["SMART_FILTER_URL_TEMPLATE"],
      "SMART_FILTER_PATH" => $arResult["VARIABLES"]["SMART_FILTER_PATH"],
      "PAGER_PARAMS_NAME" => $arParams["PAGER_PARAMS_NAME"],
      "DISPLAY_ELEMENT_COUNT" => "N",
      "INSTANT_RELOAD" => "N",
   ),
   $component,
   array('HIDE_ICONS' => 'Y')
);

ЧПУ на главной компонента

Catalog: в $arDefaultUrlTemplates404 добавьте правило вида smart_filter_index = "filter/#SMART_FILTER_PATH#/apply/"; после $engine->guessComponentPath, если страница smart_filter_index, подмените её на sections.

News: задайте $smartBase от шаблона раздела, допишите шаблоны smart_filter и smart_filter_index, добавьте $engine->addGreedyPart("#SMART_FILTER_PATH#"), затем переименование smart_filter → section и smart_filter_index → sections.

ЧПУ для цены без кода типа цены

Если URL вида /price-типовое_соглашение-from-…/ неустойчив по SEO, переопределите класс смарт‑фильтра: расширьте CBitrixCatalogSmartFilter и переопределите searchPrice (выбор первой цены из параметров), convertUrlToCheck и makeSmartUrl так, чтобы сегмент цены кодировался как price без суффикса кода типа. Полный рабочий пример см. на исходной публикации; ключевой приём — заменить регулярное выражение для price и в makeSmartUrl использовать array_unshift($smartPart, toLower("price")) вместо price-CODE.

Источник: перенос с блога g·rain·design.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии