Magento 2: Ajouter du HTML arbitraire à la <head> de chaque page?

23

Dans Magento 2, est-il possible d'ajouter un bit arbitraire de HTML à chaque page frontend / panier <head/>?

Je sais que je peux ajouter un bloc au contenu / à la <body>zone avec du code quelque chose comme ça

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

Cependant, il n'est pas clair s'il existe un bloc similaire pour ajouter du contenu à l' <head/>élément d'une page. J'ai parcouru le site de documentation et le code source, et il y a beaucoup de références à de nouvelles balises que vous pouvez utiliser avec une <head/>balise

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

mais je ne trouve aucune référence sur un moyen d'ajouter du html / texte arbitraire à la <head/>section d'une page dans Magento 2.

Alan Storm
la source

Réponses:

27

pas sûr à 100%, mais je pense que vous pouvez ajouter du code à la tête en utilisant ceci:

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

Je sais, cela semble étrange d'ajouter du code dans le <body>mais de le rendre dans le <head>mais voici pourquoi je pense que oui:

Le "squelette" de la page est déterminé par ce modèle: https://github.com/magento/magento2/blob/develop/app/code/Magento/Theme/view/base/templates/root.phtml
Ce modèle fait écho $headAdditional( et d'autres variables)
Ces variables sont initialisées dans \ Magento \ Framework \ View \ Result :: render () et la var $headAdditionalressemble à ceci:

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

$addBlockest

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

Ensuite, je recherche des références à head.additionalet l' ai trouvé dansapp/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>

Je n'ai pas testé le code réel (je deviens paresseux) mais c'est la seule piste que j'ai.

Marius
la source
3
Dans un an ou deux, vous serez assez paresseux pour simplement poser une question sur Stack Exchange lorsque vous en aurez un :) Les éléments ci-dessus ont parfaitement fonctionné (les yeux roulent et les secousses de tête nonobstant)
Alan Storm
4
Si représentatif: c'est le volet papillon précédant le tsunami de combien je vais détester la façon dont M2 nomme les choses.
Brendan Falkowski