Découvrez le «nom» d'un bloc de référence dans Magento 2


11

Je souhaite supprimer certains blocs de ma page. Dites par exemple que je souhaite supprimer le conteneur du logo.

Ensuite, je crée /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlavec le code suivant:

<page layout="3columns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <referenceBlock name="logo" remove="true"/>
</page>

Dans ce cas, j'ai réussi à trouver le nom (name = "logo") de ce bloc de référence en cherchant dans les fichiers du thème de base.

La question est: existe-t-il une meilleure façon de connaître les noms des blocs. Je suppose qu'il doit y avoir une liste de tous les noms utilisés dans les fichiers XMl dans Magento? Ou une sorte de référence?

Disons par exemple que je voudrais supprimer le menu ( <div class="sections nav-sections">...</div>). Comment puis-je trouver le nom de cette


1
vous pouvez le trouver dans un fichier XML dans le thème de base. si vous souhaitez supprimer le menu, ce nom est catalog.topnav. je le trouve dans default.xml dans le module Theme dans la base.
xanka

Réponses:


17

Il y a plusieurs façons de faire ça:

  1. Devine
  2. Revoir la disposition des thèmes de base, vierges et Luma
  3. Effectuer des recherches IDE pour les noms de classe et d'ID
  4. Activez «Conseils de chemin de modèle activés pour la vitrine» et «Ajouter des noms de bloc aux conseils».

Vous pouvez activer les indications de chemin et les indications de bloc en vous connectant à l'interface d'administration et en allant sur:

Stores > Configuration > Advanced > Developer > Debug

Malheureusement, il n'y a toujours aucun moyen infaillible de les trouver facilement, à ma connaissance. Bien qu'il semble que les gars travaillant sur le noyau y soient:

https://github.com/magento/magento2/issues/571


Comme l'a dit Gareth, vous pouvez activer les indications de chemin de modèle pour essayer de déterminer quel modèle et bloc rendent cette partie du code.
Barbanet

3
J'aime la façon dont vous avez dit "deviner", les indications de chemin sont assez inutiles dans certains cas.
wlin

# 4 n'a pas fonctionné pour moi dans un premier temps, car je n'ai pas ajouté mon IP à la liste blanche comme décrit ici: docs.magento.com/m2/ee/user_guide/system/…
hey

15

Voici comment je les trouve ...

Contenu > Widgets > Ajouter un
type de widget = CMS Static Block
Design Theme = [Votre thème]

Continuer

Mises à jour de mise en page > Ajouter l'
affichage de mise en page activé = [Choisir une]

Cliquez avec le bouton droit sur Inspecter "Veuillez sélectionner" sous le conteneur.
Développez l' <select>élément dans Dev Tools.
Toutes les options value = sont celles de referenceContainer Names.

:)


Pourquoi ne voyons-nous pas des conteneurs de référence comme header.panel ou page.wrapper dans cette liste?
DevonDahon

1
Merci beaucoup! Vous pensez que les développeurs de magento 2 fourniraient une référence rapide pour trouver ces noms dans leurs documents. Très apprécié pour votre conseil utile :)
Jonathan Marzullo

Vous devez sélectionner "Mise en page" dans la liste déroulante "Affichage
activé

Je vous remercie! Cela a fonctionné un régal pour moi - évident maintenant!
Freshwebs

Merci mec, très bons conseils pour apprendre M2 :)
puntable

7

Vous pouvez exécuter le code php-cli ci - dessous pour obtenir une liste de tous les ~ 200 referenceBlock. Assurez-vous que le chemin d'accès à votre dossier racine Magento 2 est correct. Vous pouvez également modifier la instructionvariable en liste block, containeret referenceContainer.

<?php

//$instruction = "container";
//$instruction = "referenceContainer";
$instruction = "block";
//$instruction = "referenceBlock";

$path = '/var/www/html/magento2/vendor/magento';
$command = 'cd '.$path.' && egrep -r -i --include \*.xml "<'.$instruction.'".*?"name=" *';
exec($command, $output);

$container_max_length = 1;
$pattern = '/(.*?):.*<'.$instruction.'.*name="(.*?)".*/';
foreach ($output as $subject) {
  preg_match($pattern, $subject, $matches);
  $containers[$matches[2]][] = $matches[1];
  if (strlen($matches[2]) > $container_max_length) $container_max_length = strlen($matches[2]);
}

$n=1;
ksort($containers);
foreach ($containers as $k => $v) {
  printf("%6s", "$n. ");
  printf("%-".$container_max_length."s".$v[0]."\n", $k);
  $i=1;
  while (isset($v[$i])) {
    printf("      %-".$container_max_length."s".$v[$i]."\n", "");
    $i++;
  }
  $n++;
}

?>

1
Génie. Cette méthode n'a pas de prix. Merci beaucoup d'avoir partagé.
crashtestxxx

1
C'est génial merci beaucoup super utile. Je l'ai modifié en un qui les viderait tous sous forme de fichiers texte pour l'ensemble du site. gist.github.com/LiamKarlMitchell/…
Liam Mitchell

Faut-il une version spécifique de php / magento? Sur PHP 7.2.24 + Magento 2.3.3, j'obtiens l'erreur: "PHP Warning: ksort () s'attend à ce que le paramètre 1 soit un tableau, null donné dans /home/magento/Desktop/list-magento.php sur la ligne 21" et obtenu pas de sortie.
Adrian Lopez

4

Vous pouvez utiliser cette extension gratuite:

https://github.com/ho-nl/magento2-Ho_Templatehints

Ou en suivant @blizam, répondez à quelques références choisies parmi les widgets:

Après l'en-tête de page> page.top

Après l'en-tête de page Haut> top.container

Avant les colonnes principales> columns.top

Avant le pied de page> page.bottom

Conteneur de pied de page avant> page.bottom.container

Liens de pied de page CMS> cms_footer_links_container

Comparer Link Wrapper> comparer-link-wrapper

Zone de contenu principale> contenu

Contenu principal à part> content.aside

Contenu principal en bas> content.bottom

Conteneur de contenu principal> main

Contenu principal Haut> content.top

Bloc promotionnel mini-chariot> minicart.addons

Bas de la page> before.body.end

Pied de page> pied de page

Conteneur de pied de page> conteneur de pied de page

En-tête de page> wrapper d'en-tête

Conteneur d'en-tête de page> header.container

Panneau En-tête de page> header.panel

Haut de la page> after.body.start

Barre latérale supplémentaire> barre latérale supplémentaire

Barre latérale principale> barre latérale.


3

J'ai mis en place un petit module qui va écrire la structure de la page XML dans un fichier journal dans le var/log/dossier.

app / code / CustomerParadigm / PageXml / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="CustomerParadigm_PageXml" setup_version="1.0.0" schema_version="1.0.0">
        <sequence>
            <module name="Magento_Catalog"/>
            <module name="Magento_Theme"/>
        </sequence>
    </module>
</config>

app / code / CustomerParadigm / PageXml / etc / events.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="layout_generate_blocks_after">
        <observer name="customerparadigm_layout_generate_blocks_after" instance="CustomerParadigm\PageXml\Model\Layout" />
    </event>
</config>

app / code / CustomerParadigm / PageXml / registration.php

<?php
    \Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'CustomerParadigm_PageXml',
    __DIR__
);

app / code / CustomerParadigm / PageXml / Model / Layout.php

<?php

namespace CustomerParadigm\PageXml\Model;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class Layout  implements ObserverInterface {
    protected $_logger;

    public function __construct ( \Psr\Log\LoggerInterface $logger ) {
        $this->_logger = $logger;
    }

    public function execute(\Magento\Framework\Event\Observer $observer) {
        $log_file = BP . '/var/log/page_layout.xml';
        if (file_exists($log_file)) {
            unlink($log_file);
        }
        $xml = $observer->getEvent()->getLayout()->getXmlString();
        /*$this->_logger->debug($xml);*/
        $writer = new \Zend\Log\Writer\Stream($log_file);
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info($xml);
        return $this;
    }
}

Rien de trop étonnant ne se passe ici, et je suis sûr qu'il y a beaucoup de place à améliorer (travailler avec l'enregistreur intégré en fait partie) mais cela fait le travail pour moi lorsque je développe un site.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.