Категорії: Мадженто 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
Теги: Мадженто2

Останні пости

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

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

15/03/2024

Як зберігати каву, щоб вона не втрачала смаку і аромату

Смак приготованого напою залежить не тільки від сорту кави, способу та ступеня прожарювання, помелу зерен,… Читати далі

11/03/2024

Габрієль Гарсія Маркес

Вік — це не те, скільки тобі років, а те, — як ти їх відчуваєш… Читати далі

10/03/2024

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

Якщо ви створюєте програмне забезпечення, яким хочете поділитися, або використовуєте програмний продукт, який хочете модифікувати,… Читати далі

09/03/2024

Ніл Ґейман

Люди думають, що будуть щасливі, якщо переїдуть в інше місце, а потім виявляється: куди б… Читати далі

20/02/2024

Уроки JavaScript — як почати працювати з об’єктами

Об’єкти є однією з найважливіших і найпотужніших функцій JavaScript, і в багатьох вбудованих функціях об’єкти… Читати далі

17/02/2024