Magento 2: добавление произвольного HTML в <head> каждой страницы?

23

В Magento 2 возможно ли добавить произвольный бит HTML на каждую страницу интерфейса / корзины? <head/> ?

Я знаю, что могу добавить блок к содержанию / <body>области с кодом примерно так

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="content">
            <block type="Pulsestorm\Test\Block\Head" name="pulsestorm.head" as="pulsestorm.head" template="pulsestorm/head.phtml"/>
        </referenceBlock>
    </body>
</page>

Тем не менее, неясно, есть ли подобный блок для добавления контента в <head/>элемент страницы. Я просмотрел сайт разработчиков документации и исходный код, и есть много ссылок на новые теги, которые можно использовать с <head/>тегом

<head>
    <css.../>
    <js.../>
</head>

но я не могу найти ссылку на способ добавить произвольный HTML / текст в <head/>раздел страницы в Magento 2.

Алан Сторм
источник

Ответы:

27

не уверен на 100% в этом, но я думаю, что вы можете добавить код в голову, используя это:

<body>
    <referenceBlock name="head.additional">
        <block class="Pulsestorm\Test\Block\Head" name="pulsestorm.head" as="pulsestorm.head" template="pulsestorm/head.phtml"/>
    </referenceBlock>
</body>

Я знаю, это звучит странно, чтобы добавить код в, <body>но отрендерить его в, <head>но вот почему я так думаю:

«Скелет» страницы определяется этим шаблоном: https://github.com/magento/magento2/blob/develop/app/code/Magento/Theme/view/base/templates/root.phtml
Этот шаблон повторяется $headAdditional( и другие переменные)
Эти переменные инициализируются в \ Magento \ Framework \ View \ Result :: render (), и переменная $headAdditionalвыглядит так:

'headAdditional' => $addBlock ? $addBlock->toHtml() : null,

где $addBlockнаходится

$addBlock = $this->getLayout()->getBlock('head.additional');

Затем я ищу ссылки head.additionalи нашел это вapp/code/Magento/Catalog/view/frontend/layout/catalog_product_opengraph.xml

<body>
    <referenceBlock name="head.additional">
        <block class="Magento\Catalog\Block\Product\View" name="opengraph.general" template="Magento_Catalog::product/view/opengraph/general.phtml">
            <block class="Magento\Directory\Block\Currency" name="opengraph.currency" as="meta.currency" template="Magento_Catalog::product/view/opengraph/currency.phtml"/>
        </block>
    </referenceBlock>
</body>

Я не проверял реальный код (я становлюсь ленивым), но это единственное, что у меня есть.

Мариус
источник
3
Через год или два вы будете достаточно ленивы, чтобы просто задать вопрос на Stack Exchange, когда он у вас есть :) Вышеприведенное сработало отлично (не выдерживают перекаты глаз и тряски головы)
Alan Storm
4
Если представительный: это откидная створка бабочки, предшествующая цунами того, как сильно мне не понравится то, как М2 называет вещи.
Брендан Фальковски