Сьогоднішня стаття присвячена дуже важливому аспекті при розробці на 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()
Використовуючи цей метод, ви можете керувати рендерингом Блоку, доповнювати умови, створювати обгортки для 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. В подальших статтях ми будемо більш детально розбирати дану тему.
Сьогоднішній огляд присвячений людям, для яких важливе питання конфіденційності в Інтернеті, та хто цінує свої…
Вперше про бренд Pro Plan почули у 1986 році, коли він став частиною американської компанії…
Страх покарання гірше самого покарання (Покарання — завжди щось конкретне, і воно все ж краще,…
Якщо ви плануєте розмістити веб-сайт в мережі Інтернет, дуже важливо знайти для нього швидкий і…
Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…
Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…