12  /  26

Как подготовить компонент к работе

Просмотров: 107114
Дата последнего изменения: 19.08.2021
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

  Адаптация компонента

Если компонент сам находится в динамической области, он всегда голосует за. Кроме этого есть возможность помечать определённые области, как постоянно голосующие за.

$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); в компоненте и шаблоне означает что компонент "голосует" против. Страница с таким компонентом никогда не будет работать в рамках технологии.

Пример кода компонента, голосующего "против"

Пример кода шаблона, голосующего "против"

Код в шаблоне $this->setFrameMode(true); означает что компонент "голосует" за.

Пример кода шаблона динамичного компонента, голосующего "за" и включённого в статичную зону.

Примечание: Шаблон компонента Цепочка навигации (bitrix:breadcrumb) фактически шаблоном не является и API шаблонов не работает в нём. Соответственно в нём не нужно вызывать setFrameMode().

Если шаблон компонента отдается из кеша (через $this->StartResultCache()) и при этом шаблон голосовал "против", то композитный режим будет отменен.

Метод createFrame можно использовать для создания динамичной зоны как в виде шаблона целиком, так и в виде динамичной зоны в части шаблона. Он указывает на начало динамической зоны шаблона.

Код шаблона компонента, целиком включенного в динамичную зону

Если в шаблоне установлено $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.

  Видео

Ниже вы можете ознакомиться с четырьмя видеороликами, в которых показана настройка компонентов на работу в технологии.


44
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии