Magento 2: ¿Agregar HTML arbitrario al <encabezado> de cada página?

23

En Magento 2, ¿es posible agregar un bit arbitrario de HTML a todas las páginas frontend / cart <head/>?

Sé que puedo agregar un bloque al contenido / <body>área con un código como 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>

Sin embargo, no está claro si hay un bloque similar para agregar contenido al <head/>elemento de una página. He revisado el sitio de documentos de desarrollo y el código fuente, y hay muchas referencias a nuevas etiquetas que puedes usar con una <head/>etiqueta

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

pero no puedo encontrar ninguna referencia de una forma de agregar html / texto arbitrario a la <head/>sección de una página en Magento 2.

Alan Storm
fuente

Respuestas:

27

no estoy 100% seguro de esto, pero creo que puedes agregar código a la cabeza usando esto:

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

Lo sé, suena extraño agregar código en el <body>pero renderizar en el <head>pero aquí es por qué creo que sí:

El "esqueleto" de la página está determinado por esta plantilla: https://github.com/magento/magento2/blob/develop/app/code/Magento/Theme/view/base/templates/root.phtml
Esta plantilla echos $headAdditional( y otras variables)
Estas variables se inicializan en \ Magento \ Framework \ View \ Result :: render () y la var se $headAdditionalve así:

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

donde $addBlockesta

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

Luego busco referencias head.additionaly encontré esto enapp/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>

No probé el código real (me estoy volviendo vago) pero es el único cable que tengo.

Marius
fuente
3
En un año o dos serás lo suficientemente flojo como para hacer una pregunta en Stack Exchange cuando tengas uno :) Lo anterior funcionó perfectamente (no obstante los movimientos de ojos y sacudidas de cabeza)
Alan Storm
44
Si es representativo: esta es la aleta de mariposa que precede al tsunami de cuánto me va a disgustar la forma en que M2 nombra las cosas.
Brendan Falkowski