Коварная война россии против Украины. Ориентировочные потери врага
(по состоянию на 15.03.2024)
428420
солдат
347
самолетов
325
вертолетов
6758
танков
12949
ББМ
10580
артиллерия
717
ПВО
1017
РСЗО
13993
машин
26
корабли и катера
Основы использования Блоков при разработке на Magento 2
Опубликовано

Основы использования Блоков при разработке на Magento 2

Сегодняшняя статья посвящена очень важному аспекту при разработке на Magento 2 – основам использования Блоков. Будут рассмотрены следующие моменты: основы блочной архитектуры и ее использование, этапы жизненного цикла Блока, отображение и кэширование Блоков.

 

 

Основы блочной архитектуры; ее использование при разработке

Какова типичная роль Блока?

Разделение на блок-шаблон позволяет отделить бизнес-логику от дизайна. Блоки обычно (но не всегда) связаны с файлами шаблонов .phtml. Блоки можно рассматривать как контейнер данных для шаблона, в котором представлен HTML-код. С помощью XML макетов можно управлять блоками на странице, например, добавлять новые, задавать шаблоны для них, перемещать и удалять.

 

 

Какие объекты доступны из Блока?

Все Блоки расширяют класс \Magento\Framework\View\Element\Template, поэтому по умолчанию блоки внедряются с объектом \Magento\Framework\View\Element\Template\Context и поддерживают геттеры и сеттеры для возврата и хранения любых объектов или данных. Этот объект содержит ряд других объектов, которые загружаются в экземпляр:

$this->validator: \Magento\Framework\View\Element\Template\File\Validator
$this->resolver: \Magento\Framework\View\Element\Template\File\Resolver
$this->_filesystem: \Magento\Framework\Filesystem
$this->templateEnginePool: \Magento\Framework\View\TemplateEnginePool
$this->_storeManager: \Magento\Store\Model\StoreManagerInterface
$this->_appState: \Magento\Framework\App\State
$this->pageConfig: \Magento\Framework\View\Page\Config

 

 

Этапы жизненного цикла Блока

Существуют две фазы жизненного цикла блока: генерация блоков и рендеринг блоков. Блоки создаются в момент создания макета. Они не выполняются в этот момент, а только создаются. Также на этом этапе строится структура, задаются дочерние блоки, и для каждого блока вызывается метод prepareLayout().

 

Рендеринг происходит на более позднем этапе визуализации.

 

Фаза генерации:

Magento\Framework\View\Page\Config::publicBuild()
Magento\Framework\View\Page\Config::build()
Magento\Framework\View\Layout\Builder::build()
Magento\Framework\View\Layout\Builder::generateLayoutBlocks()
Magento\Framework\View\Layout::generateElements()
Magento\Framework\View\Layout\GeneratorPool::process()

 

GeneratePool проходит через все генераторы и генерирует все запланированные элементы. Он имеет генераторы со следующими элементами:

Magento\Framework\View\Page\Config\Generator\Head
Magento\Framework\View\Page\Config\Generator\Body
Magento\Framework\View\Layout\Generator\Block
Magento\Framework\View\Layout\Generator\Container
Magento\Framework\View\Layout\Generator\UiComponent

 

 

Фаза рендеринга:

Magento\Framework\View\Result\Page::render()
Magento\Framework\View\Layout::getOutput()

 

 

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

Magento\Framework\View\Layout::renderElement()
Magento\Framework\View\Layout::renderNonCachedElement()

 

В этом методе проверяется тип отображаемых элементов. Он создает их и возвращает html, используя метод toHtml(). Этот метод не рекомендуется переопределять. Если вы хотите изменить блок рендеринга, переопределите метод _toHtml().

 

 

Основные моменты использования методов _prepareLayout(), _beforeToHtml() и _toHtml()

_prepareLayout() – чаще всего используется для:

  • добавления потомков
  • добавления вкладок (табов) в бэкэнде
  • назначения заголовка
  • добавления постраничной навигации, хлебных крошек и т. д.
  • установки рендера для элементов

 

 

_beforeToHtml()

  • подготовка данных
  • присвоение значений
  • добавление потомков

 

 

_toHtml()

Используя этот метод, вы можете управлять рендерингом Блока, дополнять условия, создавать обертки для html, изменять шаблон для блока и т.д.

 

 

 

Генерирование Блоков и их кэширование

Самый важный метод для рендеринга блока – это Magento\Framework\View\Element\AbstractBlock::toHtml(). Сначала он запускает _loadCache(), если кеш отсутствует, он запускает _beforeToHtml() после того, как блок визуализируется методом _toHtml(), после чего сохраняется кеш _saveCache($html), и запускает _afterToHtml($html).

Метод _loadCache() использует возврат cache_key от getCacheKey() и _saveCache($html)cache_tags, полученные методом getCacheTags(). Значение cache_key каждого блока складывается как BLOCK_$cache_key, а если это свойство не определено – BLOCK_sha1($name_in_layout). Значение cache_tags является массивом и состоит из свойства $cache_tags, если оно определено в блоке и если в массив добавлены значения экземпляра Magento\Framework\DataObject\IdentityInterface, возвращаемые методом getIdentities(). Мы можем управлять переменной $cache_lifetime. Значение устанавливается в секундах, если вы хотите отключить кеш, тогда вы можете установить значение 0 или не устанавливать значение, потому что все блоки не кэшируются по умолчанию.

 

 

Для чего используются разные типы блоков?

  • Magento\Framework\View\Element\AbstractBlock – родительский блок для всех пользовательских блоков;
  • Magento\Framework\View\Element\Template – блок с заданным шаблоном (.phtml);
  • Magento\Framework\View\Element\Text – простой рендеринг текста;
  • Magento\Framework\View\Element\FormKey – возвращает скрытый input с ключом формы;
  • Magento\Framework\View\Element\Messages – отображение уведомлений разных типов.

 

 

На сегодня это все по теме использования Блоков в Magento 2. В дальнейших статьях мы будем более детально разбирать данную тему.

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *