Октябрь 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;
}
}