Основы использования Блоков при разработке на 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. В дальнейших статьях мы будем более детально разбирать данную тему.
Последние посты
Генри Форд
Человек имеет два мотива поведения — один настоящий и второй, который красиво звучит Генри Форд…
Фридрих Ницше
Не нужно додумывать слишком много. Так вы создаете проблемы, которых изначально не было Фридрих Ницше…
Такой разный инвертор! Выбираем между кондиционерами Inverter, Inverter DC и Full DC
Лето в разгаре, а значит самое время задуматься о покупке кондиционера. Но как не потеряться…
Омар Хайям
Настоящий друг — это человек, который в глаза тебе выскажет все, что о тебе думает,…
Полезные советы по выбору раздвижной двери
Следует знать, что функциональность и дизайн работают рука об руку, когда вы используете раздвижную дверь.…