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

 

Share
Теги: Magento2

Последние посты

Авраам Линкольн

Мы не поможем людям, делая за них то, что они могли бы сделать сами Авраам… Читать далее

15/03/2024

Как хранить кофе, чтобы он не терял вкус и аромат

Вкус приготовленного напитка зависит не только от сорта кофе, способа и степени прожарки, помола зерен,… Читать далее

11/03/2024

Габриэль Гарсиа Маркес

Возраст — это не то, сколько тебе лет, а то, — как ты их чувствуешь… Читать далее

10/03/2024

Краткое описание лицензий с открытым исходным кодом

Если вы создаете программное обеспечение, которым хотите поделиться, или используете программный продукт, который хотите модифицировать,… Читать далее

09/03/2024

Нил Гейман

Люди думают, что будут счастливы, если переедут в другое место, а потом оказывается: куда бы… Читать далее

20/02/2024

Уроки JavaScript — как начать работать с объектами

Объекты являются одной из самых важных и мощных функций JavaScript, и во многих встроенных функциях… Читать далее

17/02/2024