Finden Sie den „Namen“ für einen Referenzblock in Magento 2 heraus

11

Ich möchte einige Blöcke von meiner Seite entfernen. Angenommen, ich möchte den Container für das Logo entfernen.

Dann erstelle ich /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlmit folgendem Code:

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

In diesem Fall konnte ich den Namen (name = "logo") dieses Referenzblocks herausfinden, indem ich die Dateien im Basisthema durchsuchte.

Die Frage ist: Gibt es eine bessere Möglichkeit, die Namen von Blöcken herauszufinden? Ich denke, es muss eine Liste aller Namen geben, die in den XMl-Dateien in Magento verwendet werden. Oder eine Art Referenz?

Sagen Sie zum Beispiel, dass ich das Menü ( <div class="sections nav-sections">...</div>) entfernen möchte . Wie finde ich den Namen heraus?

Gordova
quelle
1
Sie finden es in einer XML-Datei im Basisthema. Wenn Sie das Menü entfernen möchten, lautet dieser Name catalog.topnav. Ich finde es in default.xml im Modul Theme in Base.
Xanka

Antworten:

17

Es gibt verschiedene Möglichkeiten, dies zu tun:

  1. Vermuten
  2. Überprüfen Sie das Layout für Basis-, Leer- und Luma-Themen
  3. IDE-Suche nach Klassen- und ID-Namen durchführen
  4. Aktivieren Sie "Aktivierte Vorlagenpfadhinweise für Storefront" und "Hinzufügen von Blocknamen zu Hinweisen".

Sie können Pfadhinweise aktivieren und Hinweise blockieren, indem Sie sich bei der Administrationsoberfläche anmelden und gehen zu:

Stores > Configuration > Advanced > Developer > Debug

Leider gibt es meines Wissens immer noch keinen todsicheren Weg, diese leicht zu finden. Obwohl es so aussieht, als wären die Leute, die am Kern arbeiten, dabei:

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

Gareth Daine
quelle
Wie Gareth sagte, können Sie Hinweise zum Vorlagenpfad aktivieren, um herauszufinden, welche Vorlage und welcher Block diesen Teil des Codes rendern.
Barbanet
3
Mir gefällt, wie Sie "raten" sagten, Pfadhinweise sind in einigen Fällen ziemlich nutzlos.
Wlin
# 4 hat in erster Linie nicht für mich funktioniert, weil ich meine IP nicht wie hier beschrieben auf die Whitelist gesetzt habe: docs.magento.com/m2/ee/user_guide/system/…
hey
15

So finde ich sie ...

Inhalt > Widgets > Widget-
Typ hinzufügen = CMS Static Block
Design Theme = [Ihr Theme]

Fortsetzen

Layout-Updates > Layout-
Anzeige hinzufügen ein = [Wählen Sie eine aus]

Klicken Sie mit der rechten Maustaste auf "Bitte auswählen " unter "Container".
Erweitern Sie das <select>Element in Dev Tools.
Alle Optionswerte = sind Ihre referenceContainer-Namen.

:) :)

Blizam
quelle
Warum sehen wir in dieser Liste keine Referenzcontainer wie header.panel oder page.wrapper?
DevonDahon
1
Vielen Dank! Sie denken, Magento 2-Entwickler bieten eine Kurzreferenz, um diese Namen in ihren Dokumenten zu finden. Sehr geschätzt für Ihren hilfreichen Tipp :)
Jonathan Marzullo
Sie müssen "Seitenlayouts" in der Dropdown-Liste "Anzeige ein" auswählen, dann sehen Sie alle Referenzcontainer
Samyer
Vielen Dank! Das war ein Vergnügen für mich - jetzt offensichtlich!
Freshwebs
7

Sie können den folgenden PHP-CLI- Code ausführen , um eine Liste aller ~ 200 zu erhalten referenceBlock. Stellen Sie sicher, dass der Pfad zu Ihrem Magento 2- Stammordner korrekt ist. Sie können auch die ändern instructionVariable Liste block, containerund 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++;
}

?>
DevonDahon
quelle
1
Genius. Diese Methode ist so unbezahlbar. Vielen Dank für das Teilen.
Crashtestxxx
1
Das ist großartig, danke, super, super hilfreich. Ich habe es in eine geändert, die alle als Textdateien für die gesamte Site ausgeben würde. gist.github.com/LiamKarlMitchell/…
Liam Mitchell
Benötigt es eine bestimmte Version von PHP / Magento? Unter PHP 7.2.24 + Magento 2.3.3 erhalte ich die Fehlermeldung: "PHP-Warnung: ksort () erwartet, dass Parameter 1 ein Array ist, null angegeben in /home/magento/Desktop/list-magento.php in Zeile 21" und bekam keine Leistung.
Adrian Lopez
4

Sie können diese kostenlose Erweiterung verwenden:

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

Oder folgen Sie @blizam und beantworten Sie einige Referenzen, die aus den Widgets ausgewählt wurden:

Nach Seitenkopf> page.top

Nach Seitenkopf oben> top.container

Vor Hauptspalten> columns.top

Vor Seitenfuß> page.bottom

Vor dem Seitenfußcontainer> page.bottom.container

CMS-Fußzeilenlinks> cms_footer_links_container

Compare Link Wrapper> Compare-Link-Wrapper

Hauptinhaltsbereich> Inhalt

Hauptinhalt beiseite> content.aside

Hauptinhalt Unten> content.bottom

Hauptinhaltscontainer> main

Hauptinhalt Oben> content.top

Mini-Cart-Werbeblock> minicart.addons

Seite unten> before.body.end

Seitenfußzeile> Fußzeile

Seitenfußzeilencontainer> Fußzeilencontainer

Seitenkopf> Header-Wrapper

Seitenkopfcontainer> header.container

Seitenkopfzeile> header.panel

Seitenoberseite> after.body.start

Sidebar Additional> sidebar.additional

Seitenleiste Main> sidebar.main

open-ecommerce.org
quelle
3

Ich habe ein kleines Modul zusammengestellt, das die XML-Seitenstruktur in eine Protokolldatei im var/log/Ordner schreibt .

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

Hier ist nichts allzu Erstaunliches los, und ich bin mir sicher, dass es viel Raum für Verbesserungen gibt (die Arbeit mit dem eingebauten Logger ist eine davon), aber es erledigt die Arbeit für mich, wenn ich eine Site entwickle.

Kreismix
quelle
0

https://gist.github.com/joshfortyfour/11d0f7dbc7be9e85bf4e9c62c668f465

@hier finden Sie eine Liste von Containern noch ist es schwierig, den richtigen zu finden, aber ich weiß, dass Sie es schaffen können, den richtigen zu finden.

oder wie oben bietet jemand einen kostenlosen Modul-Link, um Container oder Block in Magento zu finden. Ich habe es versucht, aber es ist immer noch so nützlich, um über das Web zu wandern.

Gaurav Kumar
quelle