Основы использования Блоков при разработке на 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. В дальнейших статьях мы будем более детально разбирать данную тему.
Последние посты
Авраам Линкольн
Мы не поможем людям, делая за них то, что они могли бы сделать сами Авраам… Читать далее
Как хранить кофе, чтобы он не терял вкус и аромат
Вкус приготовленного напитка зависит не только от сорта кофе, способа и степени прожарки, помола зерен,… Читать далее
Габриэль Гарсиа Маркес
Возраст — это не то, сколько тебе лет, а то, — как ты их чувствуешь… Читать далее
Краткое описание лицензий с открытым исходным кодом
Если вы создаете программное обеспечение, которым хотите поделиться, или используете программный продукт, который хотите модифицировать,… Читать далее
Нил Гейман
Люди думают, что будут счастливы, если переедут в другое место, а потом оказывается: куда бы… Читать далее
Уроки JavaScript — как начать работать с объектами
Объекты являются одной из самых важных и мощных функций JavaScript, и во многих встроенных функциях… Читать далее