Magento 2: Adicionando HTML arbitrário ao <head> de todas as páginas?

23

No Magento 2, é possível adicionar um bit arbitrário de HTML a todas as páginas de frontend / carrinho <head/>?

Eu sei que posso adicionar um bloco ao conteúdo / <body>área com código semelhante a este

<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>

No entanto, não está claro se há um bloco semelhante para adicionar conteúdo ao <head/>elemento de uma página. Examinei o site dev docs e o código fonte, e há muitas referências a novas tags que você pode usar com uma <head/>tag

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

mas não consigo encontrar nenhuma referência de maneira de adicionar html / texto arbitrário à <head/>seção de uma página no Magento 2.

Alan Storm
fonte

Respostas:

28

não tenho 100% de certeza disso, mas acho que você pode adicionar código à cabeça usando este:

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

Eu sei, parece estranho adicionar código no <body>mas renderizá-lo no <head>mas aqui está o porquê disso:

O "esqueleto" da página é determinado por este modelo: https://github.com/magento/magento2/blob/develop/app/code/Magento/Theme/view/base/templates/root.phtml
Este modelo ecoa $headAdditional( e outras variáveis)
Essas variáveis ​​são inicializadas em \ Magento \ Framework \ View \ Result :: render () e a var se $headAdditionalparece com isso:

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

onde $addBlockesta

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

Em seguida, procuro referências head.additionale encontrei isso emapp/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>

Não testei o código real (estou ficando preguiçoso), mas é a única pista que tenho.

Marius
fonte
3
Em um ano ou dois você vai ser o suficiente preguiçoso para apenas fazer uma pergunta no Stack Exchange quando você tem um :) O acima funcionou perfeitamente (rolos de olho e abana a cabeça não obstante)
Alan Storm
4
Se representativo: este é o retalho de borboleta que precede o tsunami de quanto eu odeio o modo como M2 nomeia as coisas.
Brendan Falkowski