Ускорение: catalog.section

Модуль расширенного управления меню для битрикс

Октябрь 4, 2019

Теги: Инфоблоки, Ускорение

Повышение производительности компонента "catalog.section" путем исключения из выборки ненужных полей, например, детального описания (DETAIL_TEXT).

Копируем шаблон компонента, наследуем его класс и заменяем функцию getElementList:


<?

use 
\Bitrix\Main;
use 
\Bitrix\Main\Loader;
use 
\Bitrix\Main\Error;
use 
\Bitrix\Main\Type\DateTime;
use 
\Bitrix\Main\Localization\Loc;
use 
\Bitrix\Iblock;
use 
\Bitrix\Iblock\Component\ElementList;

if (!
defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

/**
 * @global CUser $USER
 * @global CMain $APPLICATION
 * @global CIntranetToolbar $INTRANET_TOOLBAR
 */

Loc::loadMessages(__FILE__);

if (!
\Bitrix\Main\Loader::includeModule('iblock'))
{
    
ShowError(Loc::getMessage('IBLOCK_MODULE_NOT_INSTALLED'));
    return;
}

CBitrixComponent::includeComponentClass("bitrix:catalog.section");


class 
GrainCatalogSectionComponent extends CatalogSectionComponent
{
    protected function 
getElementList($iblockId$products)
    {
        
//return parent::getElementList($iblockId, $products);
        
        
static $i=1\Bitrix\Main\Diag\Debug::startTimeLabel("main_sections_catalog_section_getlist_".$i); // считаем затраченное время

        // initialLoad case with only deferred bigData items
        
if (is_array($this->navParams) && isset($this->navParams['nTopCount']) && $this->navParams['nTopCount'] == 0)
        {
            return 
false;
        }

        if (!empty(
$elementIterator) && $this->isPaginationMode())
        {
            
$this->initNavString($elementIterator);
        }

        
$selectFields $this->selectFields;
        
$filterFields $this->filterFields;

        if (
$iblockId 0)
        {
            
$filterFields['IBLOCK_ID'] = $iblockId;
        }

        if (!empty(
$products))
        {
            
$filterFields['ID'] = $products;
        }

        if (
$this->isIblockCatalog || $this->offerIblockExist($iblockId))
        {
            
$selectFields[] = 'CATALOG_TYPE';
        }

        
// Начало добавленного фрагмента 
        
        
$filter array_merge($this->globalFilter$filterFields);

        if(
array_key_exists('CHECK_PERMISSIONS'$filter))
            unset(
$filter['CHECK_PERMISSIONS']);
        if(
array_key_exists('MIN_PERMISSION'$filter))
            unset(
$filter['MIN_PERMISSION']);
        if(
array_key_exists('IBLOCK_LID'$filter))
            unset(
$filter['IBLOCK_LID']);
        if(
array_key_exists('ACTIVE_DATE'$filter))
            unset(
$filter['ACTIVE_DATE']);
    
        
$selectFields array_diff($selectFields, array(
            
'DETAIL_TEXT',
            
'DETAIL_TEXT_TYPE',
            
'TAGS',
            
'DATE_ACTIVE_FROM',
            
'DATE_ACTIVE_TO',
            
'CREATED_BY',
            
'MODIFIED_BY',
            
'TIMESTAMP_X'
        
));
        
        
// Конец добавленного фрагмента 
        
        
$elementIterator \CIBlockElement::GetList(
            
$this->sortFields,
            
$filter// Changed.SE
            
false,
            
$this->navParams,
            
$selectFields
        
);
        
$elementIterator->SetUrlTemplates($this->arParams['DETAIL_URL']);

        if (!empty(
$elementIterator) && $this->isPaginationMode())
        {
            
$this->initNavString($elementIterator);
        }

        
\Bitrix\Main\Diag\Debug::endTimeLabel("main_sections_catalog_section_getlist_".$i++); // считаем затраченное время

        
if (
            !empty(
$elementIterator)
            && 
$this->arParams['BY_LINK'] !== 'Y'
            
&& !$this->arParams['SHOW_ALL_WO_SECTION']
            && !
$this->arParams['USE_MAIN_ELEMENT_SECTION']
        )
        {
            
$elementIterator->SetSectionContext($this->arResult);
        }

        return 
$elementIterator;
    }

}

См. также:

← Переход к списку