Основы использования Блоков при разработке на 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. В дальнейших статьях мы будем более детально разбирать данную тему.
Последние посты
Томас Эдисон
Наша самая большая слабость заключается в том, что мы быстро сдаемся. Самый верный способ добиться… Читать далее
Самые красивые и впечатляющие мосты со всего мира (ТОП-10)
Мост — это нечто большее, чем просто сооружение, соединяющее два берега. Для того, чтобы появился… Читать далее
Соломон
Жизнь нас учит, что свою пару мы познаем, когда разводимся, своих братьев мы познаем, когда… Читать далее
Чак Паланик
Кто может — тот делает. Кто не может — тот критикует Чак Паланик Читать далее
Ричард Бах
Ни одно желание не дается тебе отдельно от силы, позволяющей его осуществить. Хотя, возможно, для… Читать далее
Стивен Кинг
Жизнь – это непрерывный опыт, и даже самые плохие моменты занимают свое место в пазле… Читать далее