Catalog - uniqcle/Bitrix GitHub Wiki

Catalog

Умный фильтр

Фасетный индекс. Битрикс предрассчитал какие возможные вариации в фильтре с учетом комбинаций будут отобраны.

Контент->Инфоблоки->Фасетные индексы

Свойства для каждого раздела

Магазин->Свойства товаров

Магазин->Настройки каталога->Свойства элементов здесь скрываем свойство для всех

Изменить для раздела каталога Свойства элементов здесь добавляем свойство, кот. нужно отобразить. Далее шестиреночка->Настройка формы редактирования оставить Значение свойств

Routing

В файле urlrewrite.php создаем правило
    //Карточка товара
    9 =>
        array (
            'CONDITION' => '#^/skillbox/catalog_new/([A-Za-z0-9_-]+)/item/([A-Za-z0-9_-]+)/[?]{0,1}(.*)#',
            'RULE' => "SECTION_CODE=\$1&ELEMENT_CODE=\$2",
            'ID' => '',
            'PATH' => '/catalog_new/detail.php',
            'SORT' => 100,
        ),
    //Каталог товаров с фильтром
    8 =>
        array (
            'CONDITION' => '#^/skillbox/catalog_new/([A-Za-z0-9_-]+)/[?]{0,1}(.*)#',
            'RULE' => "SECTION_CODE=\$1",
            'ID' => '',
            'PATH' => '/catalog_new/index.php',
            'SORT' => 100,
        ),
...
);

'RULE' помещается в глобальный массив $_REQUEST.

Проверка на сайте https://regex101.com/

Не забываем экранировать \ символы \/catalog_new\/([A-Za-z0-9_-]+)\/[?]{0,1}(.*)

Настройки ИБ

#SITE_DIR#/catalog_new/ URL страницы информационного блока

#SITE_DIR#/catalog_new/#SECTION_CODE#/ URL страницы раздела

#SITE_DIR#/catalog_new/#SECTION_CODE_PATH#/item/#ELEMENT_CODE#/ URL страницы детального просмотра

Затем размещаем необходимые компоненты на страницх detail.php (Элемент каталога детально)

<?
define("HIDE_SIDEBAR", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>
Детальная страница

<?php pre($_REQUEST); ?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

и index.php (Компонент Элемента раздела) и назначем необходимые параметры на вход, чтобы отображали необходимую информацию от нас.

Добавление компонентов

Добавляем компоненты Умный фильтр и Элементы разделов на страницу catalog/index.php

Компонент Элементы раздела

В настройках Код раздела : ={$_REQUEST["SECTION_CODE"]}

Имя массива со значениями фильтра для фильтрации элементов: : arFilter

Проверить параметр "INCLUDE_SUBSECTIONS" => "Y" для отображения товаров в подкатегориях, а также "PRICE_CODE" => array('BASE'), для отображения цены товара

Нужно проверить, что приходит в глобальном массиве $_REQUEST. Значения пойдут на параметры в компоненты.

/catalog_new/
<?
define("HIDE_SIDEBAR", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>

Каталог с товарами и фильтром

<?php //pre($_REQUEST); ?>

<?php
// Ограничения для компонента. Фильтр. Аналог фильтра GetList
$arFilter = [
    'ACTIVE' => 'Y',
];
?>


<?$APPLICATION->IncludeComponent(
    "bitrix:catalog.smart.filter",
    "",
    Array(
        "CACHE_GROUPS" => "N",
        "CACHE_TIME" => "36000000",
        "CACHE_TYPE" => "A",
        "CONVERT_CURRENCY" => "N",
        "DISPLAY_ELEMENT_COUNT" => "Y",
        "FILTER_NAME" => "arFilter",
        "FILTER_VIEW_MODE" => "vertical",
        "HIDE_NOT_AVAILABLE" => "N",
        "IBLOCK_ID" => "2",
        "IBLOCK_TYPE" => "catalog",
        "PAGER_PARAMS_NAME" => "arrPager",
        "POPUP_POSITION" => "left",
        "PREFILTER_NAME" => "smartPreFilter",
        "PRICE_CODE" => array("BASE"),
        "SAVE_IN_SESSION" => "N",
        "SECTION_CODE" => $_REQUEST["SECTION_CODE"],
        "SECTION_DESCRIPTION" => "-",
        "SECTION_ID" => "",
        "SECTION_TITLE" => "-",
        "SEF_MODE" => "N",
        "TEMPLATE_THEME" => "blue",
        "XML_EXPORT" => "N"
    )
);?><?$APPLICATION->IncludeComponent(
    "bitrix:catalog.section",
    "",
    Array(
        "ACTION_VARIABLE" => "action",
        "ADD_PICT_PROP" => "-",
        "ADD_PROPERTIES_TO_BASKET" => "Y",
        "ADD_SECTIONS_CHAIN" => "N",
        "ADD_TO_BASKET_ACTION" => "ADD",
        "AJAX_MODE" => "N",
        "AJAX_OPTION_ADDITIONAL" => "",
        "AJAX_OPTION_HISTORY" => "N",
        "AJAX_OPTION_JUMP" => "N",
        "AJAX_OPTION_STYLE" => "Y",
        "BACKGROUND_IMAGE" => "-",
        "BASKET_URL" => "/personal/basket.php",
        "BROWSER_TITLE" => "-",
        "CACHE_FILTER" => "N",
        "CACHE_GROUPS" => "Y",
        "CACHE_TIME" => "36000000",
        "CACHE_TYPE" => "A",
        "COMPATIBLE_MODE" => "Y",
        "CONVERT_CURRENCY" => "N",
        "CUSTOM_FILTER" => "",
        "DETAIL_URL" => "",
        "DISABLE_INIT_JS_IN_COMPONENT" => "N",
        "DISPLAY_BOTTOM_PAGER" => "Y",
        "DISPLAY_COMPARE" => "N",
        "DISPLAY_TOP_PAGER" => "N",
        "ELEMENT_SORT_FIELD" => "sort",
        "ELEMENT_SORT_FIELD2" => "id",
        "ELEMENT_SORT_ORDER" => "asc",
        "ELEMENT_SORT_ORDER2" => "desc",
        "ENLARGE_PRODUCT" => "STRICT",
        "FILTER_NAME" => "arFilter",
        "HIDE_NOT_AVAILABLE" => "N",
        "HIDE_NOT_AVAILABLE_OFFERS" => "N",
        "IBLOCK_ID" => "2",
        "IBLOCK_TYPE" => "catalog",
        "INCLUDE_SUBSECTIONS" => "Y",         // Важно! Чтоб стояло Y
        "LABEL_PROP" => array(),
        "LAZY_LOAD" => "N",
        "LINE_ELEMENT_COUNT" => "3",
        "LOAD_ON_SCROLL" => "N",
        "MESSAGE_404" => "",
        "MESS_BTN_ADD_TO_BASKET" => "В корзину",
        "MESS_BTN_BUY" => "Купить",
        "MESS_BTN_DETAIL" => "Подробнее",
        "MESS_BTN_SUBSCRIBE" => "Подписаться",
        "MESS_NOT_AVAILABLE" => "Нет в наличии",
        "META_DESCRIPTION" => "-",
        "META_KEYWORDS" => "-",
        "OFFERS_FIELD_CODE" => array("NAME",""),
        "OFFERS_LIMIT" => "5",
        "OFFERS_SORT_FIELD" => "sort",
        "OFFERS_SORT_FIELD2" => "id",
        "OFFERS_SORT_ORDER" => "asc",
        "OFFERS_SORT_ORDER2" => "desc",
        "PAGER_BASE_LINK_ENABLE" => "N",
        "PAGER_DESC_NUMBERING" => "N",
        "PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
        "PAGER_SHOW_ALL" => "N",
        "PAGER_SHOW_ALWAYS" => "N",
        "PAGER_TEMPLATE" => ".default",
        "PAGER_TITLE" => "Товары",
        "PAGE_ELEMENT_COUNT" => "18",
        "PARTIAL_PRODUCT_PROPERTIES" => "N",
        "PRICE_CODE" => array(),    // Важно! Чтоб стояло array("BASE")
        "PRICE_VAT_INCLUDE" => "Y",
        "PRODUCT_BLOCKS_ORDER" => "price,props,sku,quantityLimit,quantity,buttons",
        "PRODUCT_DISPLAY_MODE" => "N",
        "PRODUCT_ID_VARIABLE" => "id",
        "PRODUCT_PROPS_VARIABLE" => "prop",
        "PRODUCT_QUANTITY_VARIABLE" => "quantity",
        "PRODUCT_ROW_VARIANTS" => "[{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false}]",
        "PRODUCT_SUBSCRIPTION" => "Y",
        "PROPERTY_CODE_MOBILE" => array("MATERIAL"),
        "RCM_PROD_ID" => "",
        "RCM_TYPE" => "personal",
        "SECTION_CODE" => $_REQUEST["SECTION_CODE"],
        "SECTION_ID" => "",
        "SECTION_ID_VARIABLE" => "SECTION_ID",
        "SECTION_URL" => "",
        "SECTION_USER_FIELDS" => array("",""),
        "SEF_MODE" => "N",
        "SET_BROWSER_TITLE" => "Y",
        "SET_LAST_MODIFIED" => "N",
        "SET_META_DESCRIPTION" => "Y",
        "SET_META_KEYWORDS" => "Y",
        "SET_STATUS_404" => "N",
        "SET_TITLE" => "Y",
        "SHOW_404" => "N",
        "SHOW_ALL_WO_SECTION" => "N",
        "SHOW_CLOSE_POPUP" => "N",
        "SHOW_DISCOUNT_PERCENT" => "N",
        "SHOW_FROM_SECTION" => "N",
        "SHOW_MAX_QUANTITY" => "N",
        "SHOW_OLD_PRICE" => "N",
        "SHOW_PRICE_COUNT" => "1",
        "SHOW_SLIDER" => "Y",
        "SLIDER_INTERVAL" => "3000",
        "SLIDER_PROGRESS" => "N",
        "TEMPLATE_THEME" => "blue",
        "USE_ENHANCED_ECOMMERCE" => "N",
        "USE_MAIN_ELEMENT_SECTION" => "N",
        "USE_PRICE_COUNT" => "N",
        "USE_PRODUCT_QUANTITY" => "N"
    )
);?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Обратить внимание на параметры!

"INCLUDE_SUBSECTIONS" => "Y",

"SECTION_CODE" => $_REQUEST["SECTION_CODE"],

#SITE_DIR#/skillbox/catalog_new/
#SITE_DIR#/skillbox/catalog_new/#SECTION_CODE#/
#SITE_DIR#/skillbox/catalog_new/#SECTION_CODE#/item/#ELEMENT_CODE#/

Верстка и шаблон

  • Копируем шаблон компонента Умный фильтр в текущий шаблон сайта и подключаем его.

  • Копируем шаблон компонента Элементы раздела в текущий шаблон сайта и подключаем его на странице catalog/index.php.

  • Верстку внедряем в шаблон компонентов

Предварительно можно разместить всю верстку на странице catalog/index.php

В шаблоне компонентов template.php все удаляем и выводим $arResult

Отображение цены в шаблоне

Цену отображаем с учетом всех скидок. ['MIN_PRICE']['[PRINT_VALUE]']

Sorting

Логика: При смене события на "select" идет редирект на страницу с учетом сортировки.

На странице index.php
<?php
// Получаем параметр GET
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQueryList();

$paramSort = strtoupper( $request->get('SORT_BY') ); // Получение конкретного параметра

// В зависимости от пришедших параметров устанавливаем значения для компонента
switch($paramSort){

    case 'COST_MAX_MIN':
        $sortField1 = 'catalog_PRICE_'.CONST_BASE_PRICE; //Берется из GetList
        $sortOrder1 = 'DESC';
        break;
    case 'COST_MIN_MAX':
        $sortField1 = 'catalog_PRICE_'.CONST_BASE_PRICE;
        $sortOrder1 = 'ASC';
        break;
    case 'NEW':
        $sortField1 = 'created';
        $sortOrder1 = 'DESC';
        break;
    case 'RATING':
        $sortField1 = 'property_RATING';
        $sortOrder1 = 'DESC';
        break;
    case 'NAME':       // У имени стандартая сортировка
    default:
        $sortField1 = 'name';
        $sortOrder1 = 'asc';
        $paramSort = 'NAME';
        break;
}

# Всегда одна сортировка
$sortField2 = 'id';
$sortOrder2 = 'desc';
?>

<?$APPLICATION->IncludeComponent(
	"bitrix:catalog.section",
	"skillbox_section",
        ...
        "PRICE_CODE" => array('BASE'),	         // Тип цены
        "ELEMENT_SORT_FIELD" => $sortField1,     // Поле сортировки
	"ELEMENT_SORT_FIELD2" => $sortField2,
	"ELEMENT_SORT_ORDER" => $sortOrder1,    // SORT_ORDER Направление сортировки
	"ELEMENT_SORT_ORDER2" => $sortOrder2,
        ...
        # uniqcle
        "SORT_AVAILABLE" => [
             'NAME' => 'По названию',
            'COST_MAX_MIN' =>'Сначала дорогие',
            'COST_MIN_MAX' => 'Сначала дешевые',
            'NEW' => 'Новинки',
            'RATING' => 'Популярные',
        ],
        "SORT_NOW" => $paramSort
	)
);?>
</section>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
На странице template.php
<? if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die(); ?>
<?php
use Bitrix\Main\Application,
    Bitrix\Main\Web\Uri;
?>
<?php define('SKILLBOX_ODD', true); ?>

<?php
//pre($arResult);
//pre( $arParams, 1);
$request = Application::getInstance()->getContext()->getRequest();
$uriString = $request->getRequestUri();
$uri = new Uri($uriString);                    // Получаем объект
?>

<section class="catalog-list">
    <h1><?=$arResult['NAME'];?></h1>

    <form action="#" class="form-sort">
        <label>Сортировать по</label>

        <select class="sort js_sort_event">

            <?php foreach($arParams['SORT_AVAILABLE'] as $code => $name): ?>
            <?php
                $uri->deleteParams(array("SORT_BY"));
                $uri->addParams(array("SORT_BY" => $code));
                $redirect = $uri->getUri();
                ?>
                <option value="<?=$redirect;?>"<?php if($code == $arParams['SORT_NOW']): ?> selected="selected" <?php endif; ?>>
                <?=$name;?>
            </option>

            <?php endforeach; ?>
        </select>

        <a href="#" class="sort-form"> </a>

        <!--<a href="#" class="sort-form sort-desc"> </a>-->

        <label>Показать</label>
        <select class="sort">
            <option value="0">12 на странице</option>
            <option value="1">24 на странице</option>
        </select>
    </form>

    <?php foreach($arResult['ITEMS'] as $arItem): ?>
    <!--товары-->
    ...

На странице script.js

$(function(){
    $('.js_sort_event').on('change', function(e){
        e.preventDefault();
        window.location.href = $(this).val();
        return false;
    });
});

Page Element Count

catalog_tech/index.php

<?php
$paramElemCount = \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getQueryList()->get('ELEMCOUNT');

$paramElemCount = (int)$paramElemCount;

if(empty($paramElemCount)){
    $paramElemCount = 6;
}
?>

<?$APPLICATION->IncludeComponent("bitrix:catalog.section",
    "skillbox_section",
    Array(
    ...
    "PAGE_ELEMENT_COUNT" => $paramElemCount,	// Количество элементов на странице
    ...
    #paramElementCount
    "PARAM_ELEMENT_COUNT" => [
        6 => "6",
        12 => "12"
    ],
    "COUNT_DEFAULT" => $paramElemCount // Кол-во на странице по умолч.
    ),
    false
);?>
</section>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Шаблон /local/templates/skillbox/components/bitrix/catalog.section/skillbox_section/template.php

...
<label>Показать</label>
        <select class="sort js_count_event">
                <?php foreach($arParams['PARAM_ELEMENT_COUNT'] as $keyElem => $itemElem ): ?>
                <?php
                    $uri->deleteParams(array('ELEMCOUNT'));
                    $uri->addParams(array('ELEMCOUNT' => $keyElem));
                    $redirect = $uri->getUri();
                ?>
                <option value="<?=$redirect;?>" <?php if($keyElem == $arParams['COUNT_DEFAULT']) echo "selected = selected"; ?>><?=$itemElem;?> на странице</option>
                <?php endforeach; ?>
        </select>

script.js

$(function(){
	$('.js_sort_event').on('change', function(e){
		e.preventDefault();
		window.location.href = $(this).val();
		return false;
	});


	$('.js_count_event').on('change', function(e){
		e.preventDefault();
		window.location.href = $(this).val();
		return false;
	});
});

Page Navigation

Компонент /bitrix/components/bitrix/system.pagenavigation/

Шаги

  • Копируем компонент на локалку
  • Копируем компонент в свой шаблон
  • Далее подключаем его к catalog.section
  • Модифицируем

Копируем в /bitrix/components/bitrix/ на локалку

  • В PhpStorm Remove Path From Excluded на папке bitrix
  • На папке system.pagenavigation нажимаем Download from here (загружаем только этот компонент)
  • На папке bitrix нажимаем Exclude Path (обратно исключаем папки от отслеживание)

Копируем в свой шаблон

  • Создаем папку system.pagenavigation в local/templates/skillbox/components/bitrix/
  • Копируем шаблон .default в local/templates/skillbox/components/bitrix/system.pagenavigation и заменяем его на skillbox
  • Удаляем /bitrix/components/bitrix/system.pagenavigation на локалке

Подключаем его к catalog.section

  • Называем шаблон. Например, skillbox
  • В параметрах catalog.section подключаем
...
"PAGER_TEMPLATE" => "skillbox",	// Шаблон постраничной навигации
...

Модифицируем

  • Выводим arResult в шаблоне catalog.section
  • Все что содержит NAV может понадобиться, в частности $arResult['NAV_STRING'] содержит html-код
  • В параметрах catalog.section
...
"PAGE_ELEMENT_COUNT" => "18",	// Количество элементов на странице
...
  • Переносим верстку в шаблон system.pagenavigation
[NavRecordCount] => 12  // Общее кол-во записей
[NavPageCount] => 6     // Кол-во страниц
[NavPageNomer] => 1     // Номер активной страницы

local/templates/skillbox/components/bitrix/system.pagenavigation/skillbox/template.php

Шаблон template
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
/** @var array $arParams */
/** @var array $arResult */
/** @global CMain $APPLICATION */
/** @global CUser $USER */
/** @global CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
/** @var string $templateName */
/** @var string $templateFile */
/** @var string $templateFolder */
/** @var string $componentPath */
/** @var CBitrixComponent $component */
$this->setFrameMode(true);

if(!$arResult["NavShowAlways"])
{
	if ($arResult["NavRecordCount"] == 0 || ($arResult["NavPageCount"] == 1 && $arResult["NavShowAll"] == false))
		return;
}

$strNavQueryString = ($arResult["NavQueryString"] != "" ? $arResult["NavQueryString"]."&amp;" : "");
$strNavQueryStringFull = ($arResult["NavQueryString"] != "" ? "?".$arResult["NavQueryString"] : "");
// Верх оставляем
?>

<!-- Условие обратной сортировки пагинации -->
<!-- до else можно код не править -->
<?if($arResult["bDescPageNumbering"] === true):?>

	<?=$arResult["NavFirstRecordShow"]?> <?=GetMessage("nav_to")?> <?=$arResult["NavLastRecordShow"]?> <?=GetMessage("nav_of")?> <?=$arResult["NavRecordCount"]?><br /></font>

 	<?if ($arResult["NavPageNomer"] < $arResult["NavPageCount"]):?>...<?endif?>

	<?while($arResult["nStartPage"] >= $arResult["nEndPage"]):?>...<?endwhile?>

	<?if ($arResult["NavPageNomer"] > 1):?>...<?endif?>


<?else:?>


<!-- Если больше чем одна страничка, показываем блок с пагинацией-->
<!-- в принципе можно и не ставить это условие -->
<?php if($arResult['NavPageCount'] > 1): ?>

    <section class="pagination-block">

    <!-- Предыдущая -->
    <!--Если текущий страница больше чем 1, т.е находимся не на первой-->
    <!-- в этом случае нам нужна ссылка на предыдущую страницу -->
	<?if ($arResult["NavPageNomer"] > 1):?>

		<?if($arResult["bSavePage"]):?>

			<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>"><?=GetMessage("nav_prev")?></a>

		<?else:?>
            <!-- Дополнительная провка. Если больше чем 2-я страничка-->
			<?if ($arResult["NavPageNomer"] > 2):?>
				<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]-1)?>"><?=GetMessage("nav_prev")?></a>
			<?else:?>
				<a class="key" href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=GetMessage("nav_prev")?></a>
			<?endif?>
		<?endif?>


	<?endif?>


    <!-- Номера страниц-->
    <div class="pagination-page">
    <!-- Цикло пока стартовая страница меньше конечной страницы-->
	<?while($arResult["nStartPage"] <= $arResult["nEndPage"]):?>
        <!-- Если текущая страница -->
		<?if ($arResult["nStartPage"] == $arResult["NavPageNomer"]):?>

            <a href="#" class="key active"><?=$arResult["nStartPage"]?></a>

		<?elseif($arResult["nStartPage"] == 1 && $arResult["bSavePage"] == false):?>
			<a class = "key" href="<?=$arResult["sUrlPath"]?><?=$strNavQueryStringFull?>"><?=$arResult["nStartPage"]?></a>
		<?else:?>
			<a class = "key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=$arResult["nStartPage"]?>"><?=$arResult["nStartPage"]?></a>
		<?endif?>
		<?$arResult["nStartPage"]++?>
	<?endwhile?>

    </div>


    <!-- Блок сколько показано на странице результата -->
	<?if($arResult["NavPageNomer"] < $arResult["NavPageCount"]):?>
		<a class="key" href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>PAGEN_<?=$arResult["NavNum"]?>=<?=($arResult["NavPageNomer"]+1)?>"><?=GetMessage("nav_next")?></a>
	<?endif?>
        <span class="pagination-text">Показано <?=$arResult["NavFirstRecordShow"]?> <?=GetMessage("nav_to")?> <?=$arResult["NavLastRecordShow"]?> <?=GetMessage("nav_of")?> <?=$arResult["NavRecordCount"]?> результатов </span>

</section>
<?php endif; ?>

<?endif?>


<?if ($arResult["bShowAll"]):?>
<noindex>
	<?if ($arResult["NavShowAll"]):?>
		|&nbsp;<a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>SHOWALL_<?=$arResult["NavNum"]?>=0" rel="nofollow"><?=GetMessage("nav_paged")?></a>
	<?else:?>
		|&nbsp;<a href="<?=$arResult["sUrlPath"]?>?<?=$strNavQueryString?>SHOWALL_<?=$arResult["NavNum"]?>=1" rel="nofollow"><?=GetMessage("nav_all")?></a>
	<?endif?>
</noindex>
<?endif?>

В шаблоне catalog.section выводим пагинацию

    <?php
    echo $arResult['NAV_STRING'];
    ?>

AdditionallLinks

Card Product

Необходимо

  1. На странице detail.php разместить компонент детальной карточки товара Контент-каталог-элемент каталога детально
  2. передать необходимые параметры.
...
Код элемента: ={$_REQUEST["ELEMENT_CODE"]}
Код раздела: ={$_REQUEST["SECTION_CODE"]}
Тип цены: BASE
  1. Скопировать с сервера /catalog_tech/detail.php на локалку

  2. Скопировать шаблон в шаблон сайта.

<?$APPLICATION->IncludeComponent("bitrix:catalog.element", 
    "skillbox_element", 
    Array(
  1. Очищаем шаблон template и добавляем туда верстку.
⚠️ **GitHub.com Fallback** ⚠️