Основы использования Блоков при разработке на 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. В дальнейших статьях мы будем более детально разбирать данную тему.