Адаптация компонента
Если компонент сам находится в динамической области, он всегда голосует за. Кроме этого есть возможность помечать определённые области, как постоянно голосующие за.
$staticHTMLCache = \Bitrix\Main\Data\StaticHTMLCache::getInstance();
$staticHTMLCache->disableVoting();
//компонент и шаблон не участвуют в голосовании
$APPLICATION->includeComponent("mycompany:mycomponent", "template", array(), null, array());
$staticHTMLCache->enableVoting();
Примечание: Часть компонентов выпущена с настройками по умолчанию "против". Это: Универсальные списки (bitrix:lists), Подписка (bitrix:sale.personal.subscribe), Поиск (bitrix:search.page).
Контроль за адаптацией компонентов - регулируемая опция. Чтобы шаблон "проголосовал" за, нужно адаптировать его. Если хоть один из шаблонов компонентов страницы не адаптирован, то для этой страницы Композитный сайт включен не будет. В этом случае в журнал отладки функцией AddMessage2Log делается запись. (В критических местах компонентов, в шаблонах сайта, на которые надо обратить внимание, так же вызывается эта функция.)
Перевод сайта на технологию означает сделать так, чтобы все шаблоны компонентов на странице работали корректно в композитном режиме. Корректность означает определение шаблонов как:
- статичный, его можно складывать в кеш.
- динамичный, поэтому страницу с ним складывать в кеш бесполезно.
- статичный, но у него есть зоны, которые можно назвать динамичными.
И как только на странице все шаблоны компонентов станут корректно определёнными, то технология Композитный сайт будет применяться на этой странице.
Код $this->setFrameMode(false);
в компоненте и шаблоне означает что компонент "голосует" против. Страница с таким компонентом никогда не будет работать в рамках технологии.
Пример кода компонента, голосующего "против"
|
1 <?
2 if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
3 /** @global CMain $APPLICATION */
4 /** @global CUser $USER */
5 /** @global CDatabase $DB */
6 /** @var CBitrixComponent $this */
7 /** @var array $arParams */
8 /** @var array $arResult */
9 /** @var string $componentName */
10 /** @var string $componentPath */
11 /** @var string $componentTemplate */
12 /** @var string $parentComponentName */
13 /** @var string $parentComponentPath */
14 /** @var string $parentComponentTemplate */
15 $this->setFrameMode(false);
16 /** @var CCacheManager $CACHE_MANAGER */
17 global $CACHE_MANAGER;
18
19 if(!CModule::IncludeModule('lists'))
20 {
21 ShowError(GetMessage("CC_BLF_MODULE_NOT_INSTALLED"));
22 return;
23 } |
Пример кода шаблона, голосующего "против"
|
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
//delayed function must return a string
$this->setFrameMode(false);
if(empty($arResult))
return "";
$strReturn = '<div class="bx_breadcrumbs"><ul>';
$num_items = count($arResult);
for($index = 0, $itemSize = $num_items; $index < $itemSize; $index++)
{
$title = htmlspecialcharsex($arResult[$index]["TITLE"]);
if($arResult[$index]["LINK"] <> "" && $index != $itemSize-1)
$strReturn .= '<li><a href="'.$arResult[$index]["LINK"].'" title="'.$title.'">'.$title.'</a></li>';
else
$strReturn .= '<li><span>'.$title.'</span></li>';
}
$strReturn .= '</ul></div>';
return $strReturn;
?> |
Код в шаблоне $this->setFrameMode(true);
означает что компонент "голосует" за.
Пример кода шаблона динамичного компонента, голосующего "за" и включённого в статичную зону.
|
1 <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
2 /** @var array $arParams */
3 /** @var array $arResult */
4 /** @global CMain $APPLICATION */
5 /** @global CUser $USER */
6 /** @global CDatabase $DB */
7 /** @var CBitrixComponentTemplate $this */
8 /** @var string $templateName */
9 /** @var string $templateFile */
10 /** @var string $templateFolder */
11 /** @var string $componentPath */
12 /** @var CBitrixComponent $component */
13 $this->setFrameMode(true);?>
14 <div class="search-form">
15 <form action="<?=$arResult["FORM_ACTION"]?>">
34 </form>
35 </div> |
Примечание: Шаблон компонента Цепочка навигации (bitrix:breadcrumb) фактически шаблоном не является и API шаблонов не работает в нём. Соответственно в нём не нужно вызывать setFrameMode().
Если шаблон компонента отдается из кеша (через $this->StartResultCache()
) и при этом шаблон голосовал "против", то композитный режим будет отменен.
Метод createFrame можно использовать для создания динамичной зоны как в виде шаблона целиком, так и в виде динамичной зоны в части шаблона. Он указывает на начало динамической зоны шаблона.
Код шаблона компонента, целиком включенного в динамичную зону
|
1 <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
2 /** @var array $arParams */
3 /** @var array $arResult */
4 /** @global CMain $APPLICATION */
5 /** @global CUser $USER */
6 /** @global CDatabase $DB */
7 /** @var CBitrixComponentTemplate $this */
8 /** @var string $templateName */
9 /** @var string $templateFile */
10 /** @var string $templateFolder */
11 /** @var string $componentPath */
12 /** @var CBitrixComponent $component */
13 $this->createFrame()->begin("Загрузка");
14 ?>
15 <div class="statistic-table">
...
124 </div>
|
Если в шаблоне установлено $this->createFrame()->begin('Загрузка');
, то это означает, что компонент помечен как статичный с динамичной зоной. И все содержимое данного компонента будет отдаваться динамически, а в статике запишется заглушка "Загрузка".
Примечание: Если этот тег стоит в начале компонента и нигде не завершается (зона в этом случае завершается автоматически), то реально это означает что компонент - динамичный.
Самый типичный сценарий применения. Рассмотрим его на примере шаблона Корзины:
18 <span id="sale-basket-basket-line-container">
19 <?
20 $frame = $this->createFrame("sale-basket-basket-line-container", false)->begin();
21 if (intval($arResult["NUM_PRODUCTS"])>0)
22 {
23 ?><a class="bx_cart_top_inline_link" href="<?=$arParams["PATH_TO_BASKET"]?>">
<?echo str_replace('#NUM#', intval($arResult["NUM_PRODUCTS"]), GetMessage('YOUR_CART'))?></a><?
24 }
25 else
26 {
27 ?><a class="bx_cart_top_inline_link" href="<?=$arParams["PATH_TO_BASKET"]?>">
<?echo GetMessage('YOUR_CART_EMPTY')?> <span id="bx_cart_num">(0)</span></a><?
28 }
29 $frame->beginStub();
30 ?><a class="bx_cart_top_inline_link" href="<?=$arParams["PATH_TO_BASKET"]?>">
<?echo GetMessage('YOUR_CART_EMPTY')?> <span id="bx_cart_num">(0)</span></a><?
31 $frame->end();
32 ?>
33 </span>
В качестве аргумента для метода createFrame можно указать контейнер, который будет использован в оформлении вывода данных. Это позволит оформить динамическую зону в соответствии с дизайном сайта.
В разметке сначала указывается собственно динамичная часть, которая будет различной для каждого пользователя, а затем, через $frame->beginStub();
- та часть, которая будет записана на диск и которая должна быть отображена пользователю пока не получены данные из первой части. Это "заглушка", которая будет выведена до получения данных второго хита. В ней может быть как какой-то сложный код, так и просто слово, например, Loading или Загрузка. (См. пример Кода шаблона компонента, целиком включенного в динамичную зону.)
Контент заглушки учитывается при подсчете хеш-суммы кеша.
$frame->end();
завершает разметку динамичной части в шаблоне компонента.
Примечание: Важно понимать, что код между вызовами begin-beginStub
и beginStub-end
выполняется всегда. И на первом хите к странице (на котором создается кеш) и на аякс-хите. Эти методы занимаются буферизацией контента и не являются аналогами конструкции if-else.
Внимание! Динамичных зон в шаблоне компонента может быть несколько, но они не могут быть вложенными друг в друга.
Пример нескольких динамичных зон
foreach ($arResult["ITEMS"] as $i => $arItem)
{
$frame = $this->createFrame()->begin('loading '.$i);
print_r($arItem);
$frame->end();
}
В критических местах компонентов, в шаблонах сайта, на которые надо обратить внимание, вызывается функция AddMessage2Log.