Основи використання Блоків при розробці на 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)
Міст — це щось більше, ніж просто споруда, яка поєднує два береги. Для того, щоб… Читати далі
Соломон
Життя нас вчить, що свою пару ми пізнаємо, коли розлучаємося, своїх братів ми пізнаємо, коли… Читати далі
Річард Бах
Жодне бажання не дається тобі окремо від сили, що дозволяє його здійснити. Хоча, можливо, для… Читати далі
Стівен Кінг
Життя — це безперервний досвід, і навіть найгірші моменти займають своє місце у пазлі нашого… Читати далі
невідомий автор
Люди, які люблять самотність, дорого заплатили за дружбу з кимось... (невідомий автор) Читати далі