Categories: Мадженто 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. В дальнейших статьях мы будем более детально разбирать данную тему.

Tags: Magento2

Recent Posts

Инструкция по скачиванию видео с сервиса TikTok (бесплатно и без watermark)

Если вы еще не слышали о TikTok, тогда рекомендуем вам сначала ознакомиться с этим кратким… Read More

17/09/2020

Что есть в бюджетном ноутбуке – на какие характеристики рассчитывать?

Прошли те времена, когда приличный ноутбук стоил от 1000 долларов. Сегодня можно купить довольно неплохой… Read More

16/09/2020

Что лучше – цифровое телевидение Т2 или интернет-телевидение?

Современную жизнь невозможно представить без телевидения. Оно позволяет узнавать о событиях в Украине и мире,… Read More

02/09/2020

Гипоаллергенная подушка. Для чего она важна?

Сейчас найдется мало людей, у которых нет аллергии на продукты или пыльцу растений. Считается, что… Read More

28/08/2020

Футбольный Инстаграм: что нового у топовых футболистов

Некоторые известные футболисты тщательно скрывают свои личную жизнь, а другие - активно постят фотографии с… Read More

24/08/2020

Виды и типы компрессионных чулков

Изделия называют компрессионными, когда их применяют для лечения, а также профилактики нарушений кровотока в нижних… Read More

22/08/2020