Кеширование в компонентах
Войти

Кеширование в компонентах

Кеширование в компонентах

Два разных вида кеширования в компонентах

В большинстве стандартных компонентов битрикс используется одновременно кеширование массива $arResult и html-кода. Однако при написании собственных компонентов это не всегда бывает удобным, часто бывает, что в шаблоне необходимо выполнять какой-то код на каждом хите, поэтому кешировать лучше только данные в $arResult. Ниже я привел 2 примера кеширования (для component.php) - с кешированием html-кода и без. Обратите внимание, во втором варианте подключение шаблона производится после блока кеширования, а его место занимает $this->EndResultCache().

Кеширование $arResult и html-кода шаблона:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php 

if($this->startResultCache(false, array(($arParams["CACHE_GROUPS"]==="N" ?
false$USER->GetGroups()))))

{

   if(!
Loader::includeModule("iblock"))

   {

      
$this->abortResultCache();

      
ShowError("Iblock module not installed");

      return;

   }

   
$this->includeComponentTemplate();

}

?>
Кеширование только $arResult:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php 

if($this->startResultCache(false, array(($arParams["CACHE_GROUPS"]==="N"false$USER->GetGroups()))))

{

   if(!
Loader::includeModule("iblock"))

   {

      
$this->abortResultCache();

      
ShowError("Iblock module not installed");

      return;

   }

   
$this->EndResultCache();

}

$this->includeComponentTemplate();

?>
Добавляем данные к кешу из шаблона для использования в component_epilog.php

Component_epilog.php - это файл, который запускается после вывода шаблона, и не кешируется, т.е. он запускается независимо от того, был показан только что созданный html-код из шаблона или вывод из кеша. Соответственно мы можем использовать этот файл для выполнения каких-то действий на каждом хите, даже, например, выводить html-код выше на странице, используя отложенные функции. Но данные, доступные в component_epilog.php, как правило весьма ограничены в компонентах, использующих html-кеширование. В данном примере я покажу, как расширить перечень этих данных, для этого мы вставим следующий код в файл result_modifier.php в шаблоне компонета (Для примера используется ключ «ITEMS" в массиве $arResult, содержащий в компоненте "bitrix:news.list" основной массив данных):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 

if (is_object($this->__component)) 



    
$this->__component->SetResultCacheKeys(array('ITEMS')); 

    if (!isset(
$arResult['ITEMS'])) 

        
$arResult['ITEMS'] = $this->__component->arResult['ITEMS']; 

}

?>
Пишем в $arResult родительского комплексного компонента из шаблона

Ссылки по теме:

  1. 1. g-rain-design.ru
Теги:
php