Курсы обучения
+7 (351) 777-80-70

Установка компонентов INTEC: SEO-модуль

Для работы некоторого функционала модуля (Фильтра) необходима дополнительная интеграция в некоторые шаблоны компонентов вашего сайта.
Если вы используете линейку решений Universe, то там эта интеграция уже проведена и вам достаточно просто установить модуль на рабочий сайт.
Интеграция модуля происходит в нескольких компонентах.
  1. Фильтр (bitrix:catalog.smart.filter);
    • result_modifier.php
  2. Каталог (bitrix:catalog);
    • element.php
    • section.php
    • section_vertical.php
    • section_horizontal.php
    • result_modifier.php
    • .parameters.php
    • Ланг файл для .parameters.php
  3. Список разделов (bitrix:catalog.section);
    • result_modifier.php
  4. Список элементов в разделе (bitrix:catalog.section.list).
    • result_modifier.php
Приступим к интеграции.
  1. Настройка фильтра 
    Для размещения компонента INTEC: SEO-модуль, необходимо в файл result_modifier.php шаблона компонента (который используется у вас в каталоге) bitrix:catalog.smart.filter добавить следующий код:
    $APPLICATION->IncludeComponent('intec.seo:filter.loader', '', [ 
        'FILTER_RESULT' => $arResult 
    ], $component); 
    Файлы расположены по следующему пути: Рабочий стол > Контент > Структура сайта > Файлы и папки > bitrix > templates > название шаблона сайта > components > bitrix > catalog.smart.filter > название шаблона каталога

     
    a37.png           


  2. Настройка каталога
    Каталог находится по адресу "Рабочий стол > Контент > Структура сайта > Файлы и папки > bitrix > templates > название шаблона сайта > components > bitrix > catalog > название шаблона каталога"
    a19.png
    • element.php

      code5.png 
      В данном файле необходимо добавить несколько раз.               
      В самом начале, после подключения пролога необходимо добавить эти строчки

      use Bitrix\Main\Loader;
      use intec\core\helpers\ArrayHelper;
      use intec\core\helpers\Type;
      use intec\core\helpers\ArrayHelper;
      use intec\core\helpers\StringHelper;

      a38.png
      Затем до начала верстки (до первого div), нужно добавить следующий код

      $arIBlock = $arResult['IBLOCK'];
      $arSection = $arResult['SECTION'];

      $arArticlesExtending = [
      'SHOW' => Y,
      'PROPERTY' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_PROPERTY'),
      'TEMPLATE' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_TEMPLATE'),
      'TITLE' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_TITLE'),
      'QUANTITY' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_QUANTITY'),
      'PARAMETERS' => []
      ];
      if (empty($arArticlesExtending['TEMPLATE']))
      $arArticlesExtending['SHOW'] = false;
      if ($arArticlesExtending['SHOW']) {
      $sPrefix = 'SECTIONS_ARTICLES_EXTENDING_';
      $arArticlesExtending['TEMPLATE'] = 'news.'.$arArticlesExtending['TEMPLATE'];
      foreach ($arParams as $sKey => $mValue) {
      if (!StringHelper::startsWith($sKey, $sPrefix))
      continue;
      $sKey = StringHelper::cut(
      $sKey,
      StringHelper::length($sPrefix)
      );
      if ($sKey === 'TEMPLATE')
      continue;
      $arArticlesExtending['PARAMETERS'][$sKey] = $mValue;
      }

      $arArticlesExtending['PARAMETERS'] = ArrayHelper::merge($arArticlesExtending['PARAMETERS'], [
      'SECTION_USER_FIELDS' => array(),
      'SET_TITLE' => 'N',
      'ADD_SECTIONS_CHAIN' => 'N',
      'SET_BROWSER_TITLE' => 'N',
      'INCLUDE_IBLOCK_INTO_CHAIN' => 'N',
      'CURRENCY_ID' => $arParams['CURRENCY_ID'],
      'CONSENT_URL' => $arParams['CONSENT_URL'],
      'COMPARE_NAME' => $arParams['COMPARE_NAME'],
      'USE_COMPARE' => $arParams['USE_COMPARE'],
      'WIDE' => 'Y'
      ]);
      }
      Затем после подключения компонента bitrix:catalog.element необходимо вставить следующий код


      code6.png
      $APPLICATION->IncludeComponent('intec.seo:iblocks.metadata.loader', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'ELEMENT_ID' => $elementId,
      'TYPE' => 'element',
      'MODE' => 'single',
      'METADATA_SET' => 'Y',
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);
      $APPLICATION->IncludeComponent('intec.seo:iblocks.articles.extend.filter', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'ELEMENT_ID' => $elementId,
      'QUANTITY' => $arArticlesExtending['QUANTITY'],
      'CURRENT_URL' => $APPLICATION->GetCurPage(),
      'FILTER_NAME' => 'arCatalogArticlesExtendingFilter',
      'INCLUDE_SUBSECTIONS' => 'Y',
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);


      $arArticlesExtending['PARAMETERS']['IBLOCK_ID'] = $arArticlesExtending['RESULT']['IBLOCK']['ID'];
      $arArticlesExtending['PARAMETERS']['IBLOCK_TYPE'] = $arArticlesExtending['RESULT']['IBLOCK']['IBLOCK_TYPE_ID'];
      $arArticlesExtending['PARAMETERS']['ELEMENT_SORT_ORDER'] = $arArticlesExtending['RESULT']['FILTER']['ID'];
      $APPLICATION->IncludeComponent(
      'bitrix:news.list',
      $arArticlesExtending['TEMPLATE'],
      $arArticlesExtending['PARAMETERS'],
      $component);
    • section.php
      Данный файл расположен там же где и element.php 
      Рабочий стол > Контент > Структура сайта > Файлы и папки > bitrix > templates > название шаблона сайта > components > bitrix > catalog > название шаблона каталога
       
       

      В данном файле найдите инициализацию фильтра для разделов и добавьте там фильтр для элементов              


      $arFilterElement = array(
      "IBLOCK_ID" => $arParams["IBLOCK_ID"],
      "ACTIVE" => "Y",
      "GLOBAL_ACTIVE" => "Y",
      "SECTION_CODE" => $arResult["VARIABLES"]["SECTION_CODE"],
      "INCLUDE_SUBSECTIONS" => "Y"
      );

      a42.png

      Затем в этом же файле, после строчки,
      $dbRes = CIBlockSection::GetList(array(), $arFilter, false, array("ID"));

      необходимо добавить еще код

      $elementCount = CIBlockElement::GetList(array(), $arFilterElement, false, array("ID"));
      $elementCount = $elementCount->SelectedRowsCount();

      a43.png
    • section_vertical.php
      В самом начале, после подключения пролога необходимо добавить эти строчки
      use Bitrix\Main\Loader;
      use Bitrix\Main\ModuleManager;
      use intec\Core;
      use intec\core\bitrix\Component;
      use intec\core\helpers\ArrayHelper;
      use intec\core\helpers\Html;
      use intec\core\helpers\Type;
      use intec\core\helpers\StringHelper;



      a41.png

      Затем необходимо добавить следующий код
      $sPrefix = 'INTEREST_PRODUCTS_';
      $iLength = StringHelper::length($sPrefix);
      $arInterestProductsProperties = [];
      foreach ($arParams as $sKey => $sValue) {
      if (!StringHelper::startsWith($sKey, $sPrefix))
      continue;

      $sKey = StringHelper::cut($sKey, $iLength);
      $arInterestProductsProperties[$sKey] = $sValue;
      }

      unset($sPrefix, $iLength, $sKey, $sValue);

      $sFilterKey = null;
      $sFilterValue = null;

      if (!empty($arResult['PRODUCTS']['INTEREST']['CATEGORIES']) && $arResult['PRODUCTS']['INTEREST']['SHOW']) {
      if ($arResult['PRODUCTS']['INTEREST']['PROPERTY']['USE']) {
      $GLOBALS['arrFiltersInterest'] = array('PROPERTY_' . $arResult['PRODUCTS']['INTEREST']['PROPERTY']['VALUE'] . '_VALUE' => $arResult['PRODUCTS']['INTEREST']['PROPERTY']['NAME']);
      $sFilterKey = 'FILTER_NAME';
      $sFilterValue = 'arrFiltersInterest';

      } else {
      if ($arResult['PRODUCTS']['INTEREST']['CATEGORIES'] == 1 && !empty($arResult['SECTION']['IBLOCK_SECTION_ID'])) {
      $sFilterKey = 'SECTION_ID';
      $sFilterValue = $arResult['SECTION']['IBLOCK_SECTION_ID'];

      } elseif ($arResult['PRODUCTS']['INTEREST']['CATEGORIES'] > 1) {
      $sFilterKey = 'SECTION_ID';
      $sFilterValue = $arResult['PRODUCTS']['INTEREST']['CATEGORIES'];
      }
      }
      }
      $arInterestProductsProperties = ArrayHelper::merge($arInterestProductsProperties, [
      'IBLOCK_ID' => $arParams['IBLOCK_ID'],
      $sFilterKey => $sFilterValue,
      'PROPERTY_USE' => $arResult['PRODUCTS']['INTEREST']['PROPERTY']['USE'],
      'ELEMENT_COUNT' => $arResult['PRODUCTS']['INTEREST']['COUNT'],
      'PRICE_CODE' => $arParams['PRICE_CODE'],
      'SET_BROWSER_TITLE' => 'N',
      'SET_TITLE' => 'N',
      ]);
      unset($sFilterKey, $sFilterValue);
      $arIBlock = $arResult['IBLOCK'];
      $arSection = $arResult['SECTION'];
      $sLevel = 'CHILDREN';
      $arParams = ArrayHelper::merge([
      'SECTIONS_ARTICLES_EXTENDING_PROPERTY' => 'UF_SECTIONS_ARTICLES',
      'SECTIONS_ARTICLES_EXTENDING_TEMPLATE' => null,
      ], $arParams);

      $arSectionsExtending = [
      'SHOW' => Y,
      'COUNT' => ArrayHelper::getValue($arParams, 'SECTIONS_'.$sLevel.'_EXTENDING_COUNT'),
      'PROPERTY' => ArrayHelper::getValue($arParams, 'SECTIONS_'.$sLevel.'_EXTENDING_PROPERTY'),
      'TEMPLATE' => ArrayHelper::getValue($arParams, 'SECTIONS_'.$sLevel.'_EXTENDING_TEMPLATE'),
      'TITLE' => ArrayHelper::getValue($arParams, 'SECTIONS_'.$sLevel.'_EXTENDING_TITLE'),
      'PARAMETERS' => []
      ];

      $arSectionsExtending['COUNT'] = Type::toInteger($arSectionsExtending['COUNT']);

      if ($arSectionsExtending['COUNT'] <= 0)
      $arSectionsExtending['SHOW'] = false;

      if ($arParams['SECTIONS_'.$sLevel.'_EXTENDING_USE'] !== 'Y')
      $arSectionsExtending['SHOW'] = false;

      if (empty($arSectionsExtending['TEMPLATE']))
      $arSectionsExtending['SHOW'] = false;

      if ($arSectionsExtending['SHOW']) {
      $sPrefix = 'SECTIONS_'.$sLevel.'_EXTENDING_';
      $arSectionsExtending['TEMPLATE'] = 'products.small.'.$arSectionsExtending['TEMPLATE'];

      foreach ($arParams as $sKey => $mValue) {
      if (!StringHelper::startsWith($sKey, $sPrefix))
      continue;

      $sKey = StringHelper::cut(
      $sKey,
      StringHelper::length($sPrefix)
      );

      if ($sKey === 'TEMPLATE')
      continue;

      $arSectionsExtending['PARAMETERS'][$sKey] = $mValue;
      }

      $arSectionsExtending['PARAMETERS'] = ArrayHelper::merge($arSectionsExtending['PARAMETERS'], [
      'IBLOCK_TYPE' => $arParams['IBLOCK_TYPE'],
      'IBLOCK_ID' => $arParams['IBLOCK_ID'],
      'SET_TITLE' => 'N',
      'SECTION_USER_FIELDS' => array(),
      'SHOW_ALL_WO_SECTION' => 'Y',
      'PRICE_CODE' => $arParams['PRICE_CODE'],
      'CONVERT_CURRENCY' => $arParams['CONVERT_CURRENCY'],
      'CURRENCY_ID' => $arParams['CURRENCY_ID'],
      'BASKET_URL' => $arParams['BASKET_URL'],
      'CONSENT_URL' => $arParams['CONSENT_URL'],
      'COMPARE_NAME' => $arParams['COMPARE_NAME'],
      'USE_COMPARE' => $arParams['USE_COMPARE'],
      'WIDE' => 'Y'
      ]);
      }

      $arArticlesExtending = [
      'SHOW' => Y,
      'PROPERTY' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_PROPERTY'),
      'TEMPLATE' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_TEMPLATE'),
      'TITLE' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_TITLE'),
      'QUANTITY' => ArrayHelper::getValue($arParams, 'SECTIONS_ARTICLES_EXTENDING_QUANTITY'),
      'PARAMETERS' => []
      ];

      if (empty($arArticlesExtending['TEMPLATE']))
      $arArticlesExtending['SHOW'] = false;

      if ($arArticlesExtending['SHOW']) {
      $sPrefix = 'SECTIONS_ARTICLES_EXTENDING_';
      $arArticlesExtending['TEMPLATE'] = 'news.'.$arArticlesExtending['TEMPLATE'];

      foreach ($arParams as $sKey => $mValue) {
      if (!StringHelper::startsWith($sKey, $sPrefix))
      continue;

      $sKey = StringHelper::cut(
      $sKey,
      StringHelper::length($sPrefix)
      );

      if ($sKey === 'TEMPLATE')
      continue;

      $arArticlesExtending['PARAMETERS'][$sKey] = $mValue;
      }

      $arArticlesExtending['PARAMETERS'] = ArrayHelper::merge($arArticlesExtending['PARAMETERS'], [
      'SECTION_USER_FIELDS' => array(),
      'SET_TITLE' => 'N',
      'ADD_SECTIONS_CHAIN' => 'N',
      'SET_BROWSER_TITLE' => 'N',
      'INCLUDE_IBLOCK_INTO_CHAIN' => 'N',
      'CURRENCY_ID' => $arParams['CURRENCY_ID'],
      'CONSENT_URL' => $arParams['CONSENT_URL'],
      'COMPARE_NAME' => $arParams['COMPARE_NAME'],
      'USE_COMPARE' => $arParams['USE_COMPARE'],
      'WIDE' => 'Y'
      ]);
      }

      $arSectionsExtending['PARAMETERS']['ELEMENT_SORT_FIELD'] = 'ID';

      $arArticlesExtending['PARAMETERS']['FILTER_NAME'] = 'arCatalogArticlesExtendingFilter';
      $arArticlesExtending['PARAMETERS']['SORT_BY1'] = 'ID';

      $arSectionsExtending['PARAMETERS']['FILTER_NAME'] = 'arCatalogSectionsExtendingFilter';
      $arParams = ArrayHelper::merge([
      'TAGS_USE' => 'N',
      'TAGS_TEMPLATE' => null,
      'TAGS_PROPERTY' => null,
      'POSITION' => 'top',
      'TAGS_COUNT' => 'Y',
      'TAGS_VARIABLE_TAGS' => 'tags'
      ], $arParams);

      $arTags = [
      'USE' => $arParams['TAGS_USE'] === 'Y',
      'SHOW' => false,
      'POSITION' => $arParams['TAGS_POSITION'],
      'TEMPLATE' => $arParams['TAGS_TEMPLATE'],
      'PROPERTY' => $arParams['TAGS_PROPERTY'],
      'PARAMETERS' => []
      ];

      if ($sLevel === 'ROOT')
      $arTags['USE'] = false;

      $arTags['SHOW'] = $arTags['USE'];

      if (empty($arTags['TEMPLATE']))
      $arTags['SHOW'] = false;

      if (empty($arTags['PROPERTY']))
      $arTags['SHOW'] = false;

      if ($arTags['SHOW']) {
      $sPrefix = 'TAGS_';

      foreach ($arParams as $sKey => $mValue) {
      if (!StringHelper::startsWith($sKey, $sPrefix))
      continue;

      $sKey = StringHelper::cut(
      $sKey,
      StringHelper::length($sPrefix)
      );

      if ($sKey === 'TEMPLATE')
      continue;

      $arTags['PARAMETERS'][$sKey] = $mValue;
      };

      foreach ($arResult['PARAMETERS']['COMMON'] as $sProperty)
      $arTags['PARAMETERS'][$sProperty] = ArrayHelper::getValue($arParams, $sProperty);

      $arTags['PARAMETERS'] = ArrayHelper::merge($arTags['PARAMETERS'], [
      'IBLOCK_TYPE' => $arParams['IBLOCK_TYPE'],
      'IBLOCK_ID' => $arParams['IBLOCK_ID'],
      'SECTION_ID' => !empty($arSection) ? $arSection['ID'] : false,
      'SECTION_SUBSECTIONS' => $arParams['INCLUDE_SUBSECTIONS'],
      'PROPERTY' => $arTags['PROPERTY'],
      'COUNT' => $arParams['TAGS_COUNT'],
      'USED' => 'Y',
      'FILTER_NAME' => $arParams['FILTER_NAME'],
      'VARIABLE_TAGS' => $arParams['TAGS_VARIABLE_TAGS'],
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ]);
      };

      Для отображения Облака тегов укажите данную строчку там где необходимо их вывести, например перед фильтром.

      $APPLICATION->ShowViewContent($sTemplateId.'-tags');
      a45.png
      Затем перед подключением компонента bitrix:catalog.smart.filter или bitrix:catalog.section (Желательно) подключить компонент meta-информации: необходимо добавить этот код


      a44.png


      $APPLICATION->IncludeComponent('intec.seo:iblocks.section.extend.filter', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'SECTIONS_ID' => ArrayHelper::getValue($arSection, $arSectionsExtending['PROPERTY']),
      'COUNT' => $arSectionsExtending['COUNT'],
      'HAS_COUNT' => $elementCount,
      'CURRENT_URL' => $APPLICATION->GetCurPage(),
      'FILTER_NAME' => 'arCatalogSectionsExtendingFilter',
      'INCLUDE_SUBSECTIONS' => 'Y',
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);

      После подключения компонента bitrix:catalog.smart.filter или bitrix:catalog.section (Желательно) подключить компонент meta-информации и статей из seo модуля:
      $APPLICATION->IncludeComponent('intec.seo:iblocks.metadata.loader', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'TYPE' => 'section',
      'MODE' => 'single',
      'METADATA_SET' => 'Y',
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);

      $arArticlesExtending['RESULT'] = $APPLICATION->IncludeComponent('intec.seo:iblocks.articles.extend.filter', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'ELEMENT_ID' => null,
      'FILTER_MODE' => 'many',
      'QUANTITY' => $arArticlesExtending['QUANTITY'],
      'CURRENT_URL' => $APPLICATION->GetCurPage(),
      'FILTER_NAME' => 'arCatalogArticlesExtendingFilter',
      'INCLUDE_SUBSECTIONS' => 'Y',
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);

      if (!empty($arArticlesExtending['RESULT']) && !empty($arArticlesExtending['RESULT']['FILTER'])) {
      if ($arArticlesExtending['RESULT']['FILTER_MODE_SINGLE'])
      $arArticlesExtending['PARAMETERS']['IBLOCK_ID'] = $arArticlesExtending['RESULT']['FILTER']['IBLOCK_ID'];
      $arArticlesExtending['PARAMETERS']['SORT_ORDER1'] = $arArticlesExtending['RESULT']['FILTER']['ID'];

      if (!empty($arArticlesExtending['TITLE']) || Type::isNumeric($arArticlesExtending['TITLE'])) {
      echo $arArticlesExtending['TITLE'];
      } ;
      $APPLICATION->IncludeComponent(
      'bitrix:news.list',
      $arArticlesExtending['TEMPLATE'],
      $arArticlesExtending['PARAMETERS'],
      $component
      );
      };
      $APPLICATION->IncludeComponent('intec.seo:filter.meta', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);

      if ($arTags['USE']) {
      $this->SetViewTarget($sTemplateId.'-tags');

      $APPLICATION->IncludeComponent('intec.seo:filter.tags', '', [
      'IBLOCK_ID' => $arIBlock['ID'],
      'SECTION_ID' => $arSection['ID'],
      'INCLUDE_SUBSECTIONS' => $arParams['INCLUDE_SUBSECTIONS'],
      'CACHE_TYPE' => $arParams['CACHE_TYPE'],
      'CACHE_TIME' => $arParams['CACHE_TIME']
      ], $component);

      $this->EndViewTarget();
      };





      $APPLICATION->IncludeComponent(
      'bitrix:catalog.section',
      'products.small.6',
      $arInterestProductsProperties,
      $component
      ) ?>




    • Аналогичные действия необходимо произвести с файлом section_horizontal.php
    • Необходимо создать файл result_modifier.php и весь стандартный код в нем заменить на этот




      use Bitrix\Main\Data\Cache;
      use Bitrix\Main\Loader;
      use intec\core\collections\Arrays;
      use intec\core\helpers\ArrayHelper;
      use intec\core\helpers\Html;
      use intec\core\helpers\Type;


      /**
      * @var array $arParams
      * @var array $arResult
      * @var CBitrixComponentTemplate $this
      */

      if (!Loader::includeModule('iblock'))
      return;

      if (!Loader::includeModule('intec.core'))
      return;

      $arParams = ArrayHelper::merge([

      'INTEREST_PRODUCTS_SHOW' => 'N',
      'INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE' => 'N',
      'INTEREST_PRODUCTS_CATEGORIES_PROPERTY' => null,
      'INTEREST_PRODUCTS_CATEGORIES' => null,
      'INTEREST_PRODUCTS_TITLE' => null,
      'INTEREST_PRODUCTS_POSITION' => 'footer',

      'ADDITIONAL_ARTICLES_SHOW' => 'N',
      'ADDITIONAL_ARTICLES_HEADER_SHOW' => 'N',
      'ADDITIONAL_ARTICLES_HEADER_TEXT' => null,
      ], $arParams);

      if (empty($arParams['FILTER_NAME']))
      $arParams['FILTER_NAME'] = 'arrCatalogFilter';

      $arIBlock = null;
      $arSection = null;

      if (!empty($arParams['IBLOCK_ID'])) {
      $oCache = Cache::createInstance();
      $arFilter = [
      'ID' => $arParams['IBLOCK_ID'],
      'ACTIVE' => 'Y'
      ];

      if ($oCache->initCache(36000, 'IBLOCK'.serialize($arFilter), '/iblock/catalog')) {
      $arIBlock = $oCache->getVars();
      } else if ($oCache->startDataCache()) {
      $arIBlocks = Arrays::fromDBResult(CIBlock::GetList([], $arFilter));
      $arIBlock = $arIBlocks->getFirst();
      $oCache->endDataCache($arIBlock);
      }
      }

      if (
      !empty($arResult['VARIABLES']['SECTION_ID']) ||
      !empty($arResult['VARIABLES']['SECTION_CODE'])
      ) {
      $oCache = Cache::createInstance();
      $arFilter = [
      'IBLOCK_ID' => $arParams['IBLOCK_ID'],
      'ACTIVE' => 'Y',
      'GLOBAL_ACTIVE' => 'Y'
      ];

      if (!empty($arResult['VARIABLES']['SECTION_ID'])) {
      $arFilter['ID'] = $arResult['VARIABLES']['SECTION_ID'];
      } else {
      $arFilter['CODE'] = $arResult['VARIABLES']['SECTION_CODE'];
      }

      if ($oCache->initCache(36000, 'SECTION'.serialize($arFilter), '/iblock/catalog')) {
      $arSection = $oCache->getVars();
      } else if ($oCache->startDataCache()) {
      $arSections = Arrays::fromDBResult(CIBlockSection::GetList([], $arFilter, false, [
      '*',
      'UF_*'
      ]));

      $arSection = $arSections->getFirst();
      $oCache->endDataCache($arSection);
      }
      }

      $arResult['IBLOCK'] = $arIBlock;
      $arResult['SECTION'] = $arSection;

      $arResult['PRODUCTS'] = [
      'INTEREST' => [
      'SHOW' => $arParams['INTEREST_PRODUCTS_SHOW'] === 'Y',
      'PROPERTY' => [
      'USE' => $arParams['INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'] === 'Y',
      'VALUE' => $arParams['INTEREST_PRODUCTS_CATEGORIES_PROPERTY'],
      'NAME' => null,
      ],
      'TITLE' => $arParams['INTEREST_PRODUCTS_TITLE'],
      'COUNT' => $arParams['INTEREST_PRODUCTS_COUNT'] > 0 ? $arParams['INTEREST_PRODUCTS_COUNT'] : 1,
      'POSITION' => $arParams['INTEREST_PRODUCTS_POSITION'],
      'CATEGORIES' => $arParams['INTEREST_PRODUCTS_CATEGORIES']
      ],
      ];

      $arResult['ADDITIONAL'] = [
      'ARTICLES' => [
      'SHOW' => $arParams['ADDITIONAL_ARTICLES_SHOW'] === 'Y' && !empty($arParams['PROPERTY_ADDITIONAL_ARTICLES']),
      'HEADER' => [
      'SHOW' => $arParams['ADDITIONAL_ARTICLES_HEADER_SHOW'] === 'Y',
      'TEXT' => $arParams['~ADDITIONAL_ARTICLES_HEADER_TEXT']
      ]
      ],
      ];

      $arAdditional = function ($paramName) use (&$arResult, &$arParams) {

      $arAdditional = [];

      if (!empty($arParams[$paramName])) {
      $arProperty = ArrayHelper::getValue($arResult, [
      'SECTION',
      $arParams[$paramName]
      ]);

      if (!empty($arProperty)) {
      foreach ($arProperty as $sValue) {
      if (!empty($sValue))
      $arAdditional[] = $sValue;
      }

      }

      }

      return $arAdditional;
      };

      $arAdditionalArticles = $arAdditional('PROPERTY_ADDITIONAL_ARTICLES');

      if ($arResult['ADDITIONAL']['ARTICLES']['SHOW'] && empty($arAdditionalArticles))
      $arResult['ADDITIONAL']['ARTICLES']['SHOW'] = false;

      if (!empty($arAdditionalArticles))
      $arResult['ADDITIONAL']['ARTICLES']['VALUE'] = $arAdditionalArticles;

      unset($arAdditionalArticles);

      $arResult['PARAMETERS'] = [
      'COMMON' => [
      'FORM_ID',
      'FORM_TEMPLATE',
      'FORM_PROPERTY_PRODUCT',
      'PROPERTY_MARKS_RECOMMEND',
      'PROPERTY_MARKS_NEW',
      'PROPERTY_MARKS_HIT',
      'PROPERTY_ORDER_USE',
      'CONSENT_URL',
      'LAZY_LOAD',
      'VOTE_MODE',
      'DELAY_USE',
      'QUANTITY_MODE',

      'QUANTITY_BOUNDS_FEW',
      'QUANTITY_BOUNDS_MANY',

      'VIDEO_IBLOCK_TYPE',
      'VIDEO_IBLOCK_ID',
      'VIDEO_PROPERTY_URL',
      'SERVICES_IBLOCK_TYPE',
      'SERVICES_IBLOCK_ID',
      'REVIEWS_IBLOCK_TYPE',
      'REVIEWS_IBLOCK_ID',
      'REVIEWS_PROPERTY_ELEMENT_ID',
      'REVIEWS_USE_CAPTCHA',
      'PROPERTY_ARTICLE',
      'PROPERTY_BRAND',
      'PROPERTY_PICTURES',
      'PROPERTY_SERVICES',
      'PROPERTY_DOCUMENTS',
      'PROPERTY_ADDITIONAL',
      'PROPERTY_ASSOCIATED',
      'PROPERTY_RECOMMENDED',
      'PROPERTY_VIDEO',
      'OFFERS_PROPERTY_ARTICLE',
      'OFFERS_PROPERTY_PICTURES',

      'CONVERT_CURRENCY',
      'CURRENCY_ID',
      'PRICE_CODE'
      ]
      ];

      if ($arParams['SEF_TABS_USE'] !== 'Y') {
      unset($arResult['URL_TEMPLATES']['tabs']);
      unset($arResult['VARIABLES']['TAB']);
      }

      if ($arParams['SEF_MODE'] === 'N') {
      if ($arParams['SEF_TABS_USE'] === 'Y') {
      $arResult['URL_TEMPLATES']['tabs'] = Html::encode($APPLICATION->GetCurPage()).'?'.
      $arResult['ALIASES']['SECTION_ID'].'=#SECTION_ID#&'.
      $arResult['ALIASES']['ELEMENT_ID'].'=#ELEMENT_ID#&'.
      $arResult['ALIASES']['TAB'].'=#TAB#';
      }
      }

      if ($arResult['PRODUCTS']['INTEREST']['PROPERTY']['USE']) {
      $property_name = CIBlockPropertyEnum::GetList(Array(), Array(
      "IBLOCK_ID" => $arIBlock['ID'],
      "CODE" => $arResult['PRODUCTS']['INTEREST']['PROPERTY']['VALUE'],
      "EXTERNAL_ID" => $arResult['PRODUCTS']['INTEREST']['CATEGORIES']));

      $arResult['PRODUCTS']['INTEREST']['PROPERTY']['NAME'] = $property_name->GetNext()['VALUE'];

      unset($property_name);
      }

    • parametrs.php
      В данном файле в самом начале необходимо добавить строчки

      use intec\core\bitrix\Component;
      use intec\core\collections\Arrays;
      use intec\core\helpers\Type;
      use intec\core\helpers\StringHelper;
      use intec\core\helpers\ArrayHelper;
      use Bitrix\Main\Localization\Loc;
      Затем после подключения модуля iblock нужно вставить код

      $arParametersCommon = [
      'FORM_ID',
      'FORM_TEMPLATE',
      'FORM_PROPERTY_PRODUCT',
      'PROPERTY_MARKS_RECOMMEND',
      'PROPERTY_MARKS_NEW',
      'PROPERTY_MARKS_HIT',
      'PROPERTY_ORDER_USE',
      'CONSENT_URL',
      'LAZY_LOAD',
      'VOTE_MODE',
      'DELAY_USE',
      'QUANTITY_MODE',
      'QUANTITY_BOUNDS_FEW',
      'QUANTITY_BOUNDS_MANY',

      'SERVICES_IBLOCK_TYPE',
      'SERVICES_IBLOCK_ID',
      'REVIEWS_IBLOCK_TYPE',
      'REVIEWS_IBLOCK_ID',
      'REVIEWS_PROPERTY_ELEMENT_ID',
      'REVIEWS_USE_CAPTCHA',
      'PROPERTY_ARTICLE',
      'PROPERTY_BRAND',
      'PROPERTY_PICTURES',
      'PROPERTY_SERVICES',
      'PROPERTY_DOCUMENTS',
      'PROPERTY_ADDITIONAL',
      'PROPERTY_ASSOCIATED',
      'PROPERTY_RECOMMENDED',
      'PROPERTY_VIDEO',
      'OFFERS_PROPERTY_ARTICLE',
      'OFFERS_PROPERTY_PICTURES',

      'CONVERT_CURRENCY',
      'CURRENCY_ID',
      'PRICE_CODE'
      ];

      После этого в конце файла добавьте следующий кусок кода

      $sComponent = 'bitrix:catalog.section.list';
      $sTemplate = 'catalog.';
      $arTemplates = Arrays::from(CComponentUtil::GetTemplatesList(
      $sComponent,
      $siteTemplate
      ))->asArray(function ($iIndex, $arTemplate) use (&$sTemplate) {
      if (!StringHelper::startsWith($arTemplate['NAME'], $sTemplate))
      return ['skip' => true];

      $sName = StringHelper::cut(
      $arTemplate['NAME'],
      StringHelper::length($sTemplate)
      );

      return [
      'key' => $sName,
      'value' => $sName
      ];
      });

      foreach (['ROOT', 'CHILDREN'] as $sLevel) {
      $sPrefix = 'SECTIONS_'.$sLevel.'_';
      $sTemplate = ArrayHelper::getValue($arCurrentValues, $sPrefix.'TEMPLATE');
      $sTemplate = ArrayHelper::fromRange($arTemplates, $sTemplate, false, false);

      if (!empty($sTemplate))
      $sTemplate = 'catalog.'.$sTemplate;

      if (!empty($sTemplate)) {
      $arTemplateParameters = ArrayHelper::merge($arTemplateParameters, Component::getParameters(
      $sComponent,
      $sTemplate,
      $siteTemplate,
      $arCurrentValues,
      $sPrefix,
      function ($sKey, &$arParameter) use (&$sLevel, &$arParametersCommon) {
      if (ArrayHelper::isIn($sKey, $arParametersCommon))
      return false;
      $arParameter['PARENT'] = 'SECTIONS_SETTINGS';
      $arParameter['NAME'] = Loc::getMessage('C_CATALOG_CATALOG_1_SECTIONS_'.$sLevel).'. '.$arParameter['NAME'];

      return true;
      },
      Component::PARAMETERS_MODE_TEMPLATE
      ));
      }

      if ($sLevel === 'CHILDREN') {

      $sExtendingPrefix = $sPrefix.'EXTENDING_';
      $sExtendingComponent = 'bitrix:catalog.section';
      $sExtendingTemplate = 'products.small.';

      $arExtendingTemplates = Arrays::from(CComponentUtil::GetTemplatesList(
      $sExtendingComponent,
      $siteTemplate
      ))->asArray(function ($iIndex, $arTemplate) use (&$sExtendingTemplate) {
      if (!StringHelper::startsWith($arTemplate['NAME'], $sExtendingTemplate))
      return ['skip' => true];

      $sName = StringHelper::cut(
      $arTemplate['NAME'],
      StringHelper::length($sExtendingTemplate)
      );

      return [
      'key' => $sName,
      'value' => $sName
      ];
      });

      $sExtendingTemplate = ArrayHelper::getValue($arCurrentValues, $sExtendingPrefix.'TEMPLATE');
      $sExtendingTemplate = ArrayHelper::fromRange($arExtendingTemplates, $sExtendingTemplate, false, false);

      if (!empty($sExtendingTemplate))
      $sExtendingTemplate = 'products.small.'.$sExtendingTemplate;

      $arTemplateParameters[$sExtendingPrefix.'USE'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'USE'),
      'TYPE' => 'CHECKBOX'
      ];

      $arTemplateParameters[$sExtendingPrefix.'COUNT'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'COUNT'),
      'TYPE' => 'STRING',
      'DEFAULT' => 30
      ];

      $arFields = [];

      if (!empty($arCurrentValues['IBLOCK_ID'])) {
      $rsFields = CUserTypeEntity::GetList(['SORT' => 'ASC'], array(
      'ENTITY_ID' => 'IBLOCK_'.$arCurrentValues['IBLOCK_ID'].'_SECTION',
      'USER_TYPE_ID' => 'iblock_section',
      'MULTIPLE' => 'Y'
      ));

      while ($arField = $rsFields->Fetch())
      $arFields[$arField['FIELD_NAME']] = $arField['FIELD_NAME'];

      unset($rsFields);
      }

      $arTemplateParameters[$sExtendingPrefix.'PROPERTY'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'PROPERTY'),
      'TYPE' => 'LIST',
      'VALUES' => $arFields,
      'ADDITIONAL_VALUES' => 'Y'
      ];

      unset($arFields);
      $arTemplateParameters[$sExtendingPrefix.'TITLE'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'TITLE'),
      'TYPE' => 'STRING',
      'DEFAULT' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'TITLE_DEFAULT')
      ];

      $arTemplateParameters[$sExtendingPrefix.'TEMPLATE'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sExtendingPrefix.'TEMPLATE'),
      'TYPE' => 'LIST',
      'VALUES' => $arExtendingTemplates,
      'ADDITIONAL_VALUES' => 'Y',
      'REFRESH' => 'Y'
      ];

      if (!empty($sExtendingTemplate)) {
      $arTemplateParameters = ArrayHelper::merge($arTemplateParameters, Component::getParameters(
      $sExtendingComponent,
      $sExtendingTemplate,
      $siteTemplate,
      $arCurrentValues,
      $sExtendingPrefix,
      function ($sKey, &$arParameter) use (&$sLevel, &$arParametersCommon) {
      if (ArrayHelper::isIn($sKey, $arParametersCommon))
      return false;

      $arParameter['PARENT'] = 'SECTIONS_SETTINGS';
      $arParameter['NAME'] = Loc::getMessage('C_CATALOG_CATALOG_1_SECTIONS_'.$sLevel).'. '.Loc::getMessage('C_CATALOG_CATALOG_1_SECTIONS_'.$sLevel.'_EXTENDING').'. '.$arParameter['NAME'];

      return true;
      },
      Component::PARAMETERS_MODE_TEMPLATE
      ));
      }

      $sArticlesExtendingPrefix = 'SECTIONS_ARTICLES_EXTENDING_';
      $sArticlesExtendingComponent = 'bitrix:news.list';
      $sArticlesExtendingTemplate = 'news.';

      $arArticlesExtendingTemplates = Arrays::from(CComponentUtil::GetTemplatesList(
      $sArticlesExtendingComponent,
      $siteTemplate
      ))->asArray(function ($iIndex, $arTemplate) use (&$sArticlesExtendingTemplate) {
      if (!StringHelper::startsWith($arTemplate['NAME'], $sArticlesExtendingTemplate))
      return ['skip' => true];

      $sName = StringHelper::cut(
      $arTemplate['NAME'],
      StringHelper::length($sArticlesExtendingTemplate)
      );

      return [
      'key' => $sName,
      'value' => $sName
      ];
      });

      $sArticlesExtendingTemplate = ArrayHelper::getValue($arCurrentValues, $sArticlesExtendingPrefix.'TEMPLATE');
      $sArticlesExtendingTemplate = ArrayHelper::fromRange($arArticlesExtendingTemplates, $sArticlesExtendingTemplate, false, false);

      if (!empty($sArticlesExtendingTemplate))
      $sArticlesExtendingTemplate = 'news.'.$sArticlesExtendingTemplate;


      $arTemplateParameters[$sArticlesExtendingPrefix.'TITLE'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sArticlesExtendingPrefix.'TITLE'),
      'TYPE' => 'STRING',
      'DEFAULT' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sArticlesExtendingPrefix.'TITLE_DEFAULT')
      ];

      $arTemplateParameters[$sArticlesExtendingPrefix.'QUANTITY'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sArticlesExtendingPrefix.'QUANTITY'),
      'TYPE' => 'STRING',
      'DEFAULT' => 5
      ];

      $arTemplateParameters[$sArticlesExtendingPrefix.'TEMPLATE'] = [
      'PARENT' => 'SECTIONS_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_'.$sArticlesExtendingPrefix.'TEMPLATE'),
      'TYPE' => 'LIST',
      'VALUES' => $arArticlesExtendingTemplates,
      'ADDITIONAL_VALUES' => 'Y',
      'REFRESH' => 'Y'
      ];

      if (!empty($sExtendingTemplate)) {
      $arTemplateParameters = ArrayHelper::merge($arTemplateParameters, Component::getParameters(
      $sArticlesExtendingComponent,
      $sArticlesExtendingTemplate,
      $siteTemplate,
      $arCurrentValues,
      $sArticlesExtendingPrefix,
      function ($sKey, &$arParameter) use (&$arParametersCommon) {
      if (ArrayHelper::isIn($sKey, $arParametersCommon))
      return false;

      $arParameter['PARENT'] = 'SECTIONS_SETTINGS';
      $arParameter['NAME'] = Loc::getMessage('C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING').'. '.$arParameter['NAME'];

      return true;
      },
      Component::PARAMETERS_MODE_TEMPLATE
      ));
      }
      }
      }
      if (!empty($arCurrentValues['IBLOCK_ID'])) {
      $arTemplateParameters['INTEREST_PRODUCTS_SHOW'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_SHOW'),
      'TYPE' => 'CHECKBOX',
      'DEFAULT' => 'N',
      'REFRESH' => 'Y'
      ];

      if ($arCurrentValues['INTEREST_PRODUCTS_SHOW'] === 'Y') {
      $arSectionsList = CIBlockSection::GetTreeList([
      'IBLOCK_ID' => $arIBlock['ID'],
      "ACTIVE" => "Y"
      ], [
      "ID",
      "NAME",
      "CODE"
      ]);

      $arSections [0] = Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_ALL');
      $arSections [1] = Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_DEFAULT');

      while($elements = $arSectionsList->GetNextElement()) {
      $element = $elements->GetFields();
      $arSections [$element['ID']] = '['.$element['CODE'].'] '.$element['NAME'];
      }

      $arTemplateParameters['INTEREST_PRODUCTS_TITLE'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCT_TITLE'),
      'TYPE' => 'STRING',
      'DEFAULT' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCT_NAME_DEFAULT')
      ];
      $arTemplateParameters['INTEREST_PRODUCTS_COUNT'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_COUNT'),
      'TYPE' => 'STRING',
      'DEFAULT' => 25
      ];

      $arTemplateParameters['INTEREST_PRODUCTS_POSITION'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION'),
      'TYPE' => 'LIST',
      'VALUES' => [
      'content' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION_CONTENT'),
      'footer' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION_BOTTOM')
      ]
      ];

      $arTemplateParameters['INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'),
      'TYPE' => 'CHECKBOX',
      'DEFAULT' => 'N',
      'REFRESH' => 'Y'
      ];

      if ($arCurrentValues['INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'] === 'Y') {
      $arTemplateParameters['INTEREST_PRODUCTS_CATEGORIES_PROPERTY'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY'),
      'TYPE' => 'LIST',
      'VALUES' => $arProperties->asArray(function ($iIndex, $arProperty) {
      if (empty($arProperty['CODE']))
      return ['skip' => true];

      if ($arProperty['PROPERTY_TYPE'] !== 'L' || $arProperty['LIST_TYPE'] !== 'L' || $arProperty['MULTIPLE'] === 'Y')
      return ['skip' => true];

      return [
      'key' => $arProperty['CODE'],
      'value' => '['.$arProperty['CODE'].'] '.$arProperty['NAME']
      ];
      }),
      'DEFAULT' => 'CATEGORY',
      'REFRESH' => 'Y',
      'ADDITIONAL_VALUES' => 'Y'
      ];

      if (!empty($arCurrentValues['INTEREST_PRODUCTS_CATEGORIES_PROPERTY'])) {
      $arProperty = CIBlockProperty::GetList([], [
      'IBLOCK_ID' => $arIBlock['ID'],
      'CODE' => $arCurrentValues['INTEREST_PRODUCTS_CATEGORIES_PROPERTY']
      ])->GetNext();

      if (!empty($arProperty)) {
      $rsCategories = CIBlockPropertyEnum::GetList(['SORT' => 'ASC'], [
      'PROPERTY_ID' => $arProperty['ID']
      ]);

      while ($arCategory = $rsCategories->GetNext())
      if (!empty($arCategory['XML_ID']))
      $arCategories[$arCategory['XML_ID']] = '['.$arCategory['XML_ID'].'] '.$arCategory['VALUE'];
      }
      }

      $arTemplateParameters['INTEREST_PRODUCTS_CATEGORIES'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES'),
      'TYPE' => 'LIST',
      'VALUES' => $arCategories,
      'DEFAULT' => null,
      'ADDITIONAL_VALUES' => 'Y'
      ];
      } else {
      $arTemplateParameters['INTEREST_PRODUCTS_CATEGORIES'] = [
      'PARENT' => 'LIST_SETTINGS',
      'NAME' => Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES'),
      'TYPE' => 'LIST',
      'VALUES' => $arSections,
      'DEFAULT' => 0
      ];
      }

      $sComponent = 'bitrix:catalog.section';
      $sTemplate = 'products.small.6';
      $sPrefix = 'INTEREST_PRODUCTS_';

      $arTemplates = Arrays::from(CComponentUtil::GetTemplatesList(
      $sComponent,
      $siteTemplate
      ))->asArray(function ($key, $arTemplate) {
      return [
      'key' => $key,
      'value' => $arTemplate['NAME']
      ];
      });

      if (ArrayHelper::isIn($sTemplate, $arTemplates)) {
      $arRecommendedCommonParameters = [
      'SETTINGS_USE',
      'LAZYLOAD_USE'
      ];

      $arTemplateParameters = ArrayHelper::merge($arTemplateParameters, Component::getParameters(
      $sComponent,
      $sTemplate,
      $siteTemplate,
      $arCurrentValues,
      $sPrefix,
      function ($key, &$arParameter) use (&$arRecommendedCommonParameters) {
      if (ArrayHelper::isIn($key, $arRecommendedCommonParameters))
      return false;

      $arParameter['NAME'] = Loc::getMessage('C_CATALOG_CATALOG_1_INTEREST_PRODUCT').' '.$arParameter['NAME'];
      $arParameter['PARENT'] = 'LIST_SETTINGS';

      return true;
      },
      Component::PARAMETERS_MODE_TEMPLATE
      ));

      unset($arRecommendedCommonParameters);
      }

      unset($sTemplate, $sComponent, $sPrefix, $arTemplates);
      }
      }

      Также необходимо добавить код в lang файл
      Рабочий стол->Контент->Структура сайта->Файлы и папки->bitrix->templates->Название_вашего_шаблона->components->bitrix->catalog->Название_вашего_шаблона->lang->ru->.parameters.php
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCT'] = 'Вас могут заинтересовать. ';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_SHOW'] = 'Отображать блок "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'] = 'Использовать свойство "Категория" для вывода в блок "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY'] = 'Свойство для вывода в блок "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCT_TITLE'] = 'Заголовок блока "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCT_NAME_DEFAULT'] = 'Вас могут заинтересовать';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION'] = 'Позиция блока "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION_CONTENT'] = 'В блоке контента';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_POSITION_BOTTOM'] = 'Внизу страницы ';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES'] = 'Категория "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_ALL'] = 'Все';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_DEFAULT'] = 'По умолчанию';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_COUNT'] = 'Количество элементов в блоке "Вас могут заинтересовать" (минимум 1)';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_TITLE'] = 'Заголовок статей расширения';

      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_TITLE_DEFAULT'] = 'Полезные статьи';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT'] = 'Корневые разделы';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_SECTION_DESCRIPTION_SHOW'] = 'Отображать описание в корне';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_SECTION_DESCRIPTION_POSITION'] = 'Позиция описания в корне';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_SECTION_DESCRIPTION_POSITION_TOP'] = 'Сверху';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_SECTION_DESCRIPTION_POSITION_BOTTOM'] = 'Снизу';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_CANONICAL_URL_USE'] = 'Использовать канонический адрес в корне';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_CANONICAL_URL_TEMPLATE'] = 'Шаблон канонического адреса в корне';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_TEMPLATE'] = 'Шаблон корневых разделов';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ROOT_MENU_SHOW'] = 'Отображать меню в корневых разделах';

      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN'] = 'Вложенные разделы';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_SECTION_DESCRIPTION_SHOW'] = 'Отображать описание в разделах';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_SECTION_DESCRIPTION_POSITION'] = 'Позиция описания в разделах';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_SECTION_DESCRIPTION_POSITION_TOP'] = 'Сверху';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_SECTION_DESCRIPTION_POSITION_BOTTOM'] = 'Снизу';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_CANONICAL_URL_USE'] = 'Использовать канонический адрес вложенных разделов';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_CANONICAL_URL_TEMPLATE'] = 'Шаблон канонического адреса вложенных разделов';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_TEMPLATE'] = 'Шаблон вложенных разделов';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_MENU_SHOW'] = 'Отображать меню во вложенных разделах';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING'] = 'Расширение товаров';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_USE'] = 'Использовать расширение товаров за счет родительских разделов';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_COUNT'] = 'Максимальное количество товаров расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_PROPERTY'] = 'Свойство с разделами, откуда берутся товары расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_TITLE'] = 'Заголовок товаров расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_TITLE_DEFAULT'] = 'Смотрите также';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_TEMPLATE'] = 'Шаблон товаров расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_ARTICLES_EXTENDING'] = 'Выводить статьи для расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_QUANTITY'] = 'Количество выводимых статей для расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING'] = 'Выводить статьи для расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_COUNT'] = 'Максимальное количество статей расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_TITLE'] = 'Заголовок статей расширения';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_TITLE_DEFAULT'] = 'Полезные статьи';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_ARTICLES_EXTENDING_TEMPLATE'] = 'Шаблон статей расширения';
      $MESS['C_CATALOG_CATALOG_1_TAGS_COUNT'] = 'Теги. Подсчитывать количество элементов для каждого тэга';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_COUNT'] = 'Количество элементов в блоке "Вас могут заинтересовать" (минимум 1)';
      $MESS['C_CATALOG_CATALOG_1_TAGS_PROPERTY'] = 'Теги. Свойство "Тэги"';
      $MESS['C_CATALOG_CATALOG_1_SECTIONS_CHILDREN_EXTENDING_PROPERTY'] = 'Свойство с разделами, откуда берутся товары расширения';
      $MESS['C_CATALOG_CATALOG_1_PROPERTY_ADDITIONAL_ARTICLES'] = 'Свойство "Статьи раздела"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY_USE'] = 'Использовать свойство "Категория" для вывода в блок "Вас могут заинтересовать"';
      $MESS['C_CATALOG_CATALOG_1_INTEREST_PRODUCTS_CATEGORIES_PROPERTY'] = 'Свойство для вывода в блок "Вас могут заинтересовать"';

  1. Настройка шаблона списка разделов
    В данном шаблоне необходимо подправить файл result_modifier.php, он находится по адресу /bitrix/templates/название_вашего_шаблона/components/bitrix/catalog.section/название_шаблона                           
    a24.png

    В данный файл необходимо добавить следующий код
    $arSeo = $APPLICATION->IncludeComponent('intec.seo:iblocks.elements.modifier', '', [
    'IBLOCK_ID' => $arParams['IBLOCK_ID'],
    'SECTION_ID' => $arParams['SECTION_ID'],
    'SECTION_CODE' => $arParams['SECTION_CODE'],
    'ITEMS' => $arResult['ITEMS'],
    'PAGE_USE' => 'Y',
    'PAGE_COUNT' => !empty($arResult['NAV_RESULT']) ? $arResult['NAV_RESULT']->NavPageCount : null,
    'PAGE_SIZE' => !empty($arResult['NAV_RESULT']) ? $arResult['NAV_RESULT']->NavPageSize : null,
    'PAGE_NUMBER' => !empty($arResult['NAV_RESULT']) ? $arResult['NAV_RESULT']->NavPageNomer : null,
    'CACHE_TYPE' => 'N'
    ], $component);

    if (!empty($arSeo))
    $arResult['ITEMS'] = $arSeo['ITEMS'];

    foreach ($arResult['ITEMS'] as $arItem) {
    $arItems[] = $arItem['ID'];
    }

    $GLOBALS['arCatalogSectionsExtendingFilterMainItems'] = $arItems;


  2. Настройка шаблона списка элементов в разделе разделов
    В данном шаблоне необходимо подправить файл result_modifier.php, он находится по адресу /bitrix/templates/название_вашего_шаблона/components/bitrix/catalog.section.list/название_шаблона                           

    a25.png

    В данный файл необходимо добавить следующий код
    foreach($arResult['SECTIONS'] as $arSection) {
    if (!empty($arSection['PICTURE'])) {
    $arSection['PICTURE']['TITLE'] = ArrayHelper::getValue($arSection, ['IPROPERTY_VALUES', 'SECTION_PICTURE_FILE_TITLE']);
    $arSection['PICTURE']['ALT'] = ArrayHelper::getValue($arSection, ['IPROPERTY_VALUES', 'SECTION_PICTURE_FILE_ALT']);

    if (empty($arSection['PICTURE']['TITLE']))
    $arSection['PICTURE']['TITLE'] = $arSection['NAME'];

    if (empty($arSection['PICTURE']['ALT']))
    $arSection['PICTURE']['ALT'] = $arSection['NAME'];
    }

    $arSection['SECTIONS'] = [];
    $arSections[$arSection['ID']] = $arSection;
    }


    $arMeta = $APPLICATION->IncludeComponent('intec.seo:iblocks.metadata.loader', '', [

    'IBLOCK_ID' => $arParams['IBLOCK_ID'],
    'SECTION_ID' => ArrayHelper::getKeys($arSections),
    'TYPE' => 'section',
    'MODE' => 'multiple',
    'CACHE_TYPE' => 'N'
    ], $component);

    foreach ($arSections as &$arSection) {
    $arMetaSection = ArrayHelper::getValue($arMeta['SECTIONS'], $arSection['ID']);

    if (empty($arMetaSection))
    continue;

    if (!empty($arSection['PICTURE'])) {
    if (!empty($arMetaSection['META']['picturePreviewTitle']) || Type::isNumeric($arMetaSection['META']['picturePreviewTitle']))
    $arSection['PICTURE']['TITLE'] = $arMetaSection['META']['picturePreviewTitle'];

    if (!empty($arMetaSection['META']['picturePreviewAlt']) || Type::isNumeric($arMetaSection['META']['picturePreviewAlt']))
    $arSection['PICTURE']['ALT'] = $arMetaSection['META']['picturePreviewAlt'];
    }
    }

    unset($arMeta, $arMetaSection, $arSection);

Модуль также позволяет выводить верхнее, нижнее и дополнительное описание через отложенные функции.
Отложенные функции - технология, позволяющая задавать заголовок страницыпункты навигационной цепочкиCSS стилидополнительные кнопки в панель управлениямета-теги и т.п. с помощью функций используемых непосредственно в теле страницы. Соответствующие результаты работы этих функций выводятся в прологе, то есть выше по коду, чем они были заданы.
Для этого требуется вставить требуемые функции в желаемую часть кода.
  • Вывод верхнего описания
    $APPLICATION->ShowViewContent('seoFilterMetaDescriptionTop');
  • Вывод нижнего описания
    $APPLICATION->ShowViewContent('seoFilterMetaDescriptionBottom');
  • Вывод дополнительного описания
    $APPLICATION->ShowViewContent('seoFilterMetaDescriptionAdditional');

Наши решения