Znajdź „nazwę” referencyjnego bloku w Magento 2


11

Chcę usunąć niektóre bloki z mojej strony. Powiedz na przykład, że chcę usunąć pojemnik na logo.

Następnie tworzę /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlza pomocą następującego kodu:

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

W tym przypadku udało mi się znaleźć nazwę (nazwa = „logo”) tego bloku referencyjnego, przeszukując pliki w temacie podstawowym.

Pytanie brzmi: czy istnieje lepszy sposób na znalezienie nazw bloków. Myślę, że musi istnieć lista wszystkich nazw używanych w plikach XMl w Magento? A może jakieś odniesienie?

Powiedz na przykład, że chciałbym usunąć menu ( <div class="sections nav-sections">...</div>). Jak mogę znaleźć nazwę tego


1
można go znaleźć w pliku XML w temacie podstawowym. jeśli chcesz usunąć menu, ta nazwa to catalog.topnav. znajduję go w default.xml w module Motyw w bazie.
xanka

Odpowiedzi:


17

Można to zrobić na kilka sposobów:

  1. Odgadnąć
  2. Przejrzyj układ dla motywów podstawowych, pustych i Luma
  3. Wykonuj wyszukiwania IDE dla nazw klas i identyfikatorów
  4. Włącz „Włączone wskazówki dotyczące ścieżki szablonu dla witryny sklepowej” i „Dodaj nazwy bloków do wskazówek”.

Możesz włączyć podpowiedzi do ścieżek i podpowiedzi blokować, logując się do interfejsu administratora i przechodząc do:

Stores > Configuration > Advanced > Developer > Debug

Niestety, o ile wiem, wciąż nie ma pewnego sposobu na ich łatwe znalezienie. Chociaż wygląda na to, że faceci pracujący nad rdzeniem się tym zajęli:

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


Jak powiedział Gareth, możesz włączyć wskazówki dotyczące ścieżki szablonu, aby dowiedzieć się, który szablon i blok renderuje tę część kodu.
Barbanet

3
Podoba mi się to, jak powiedziałeś „zgadnij”, podpowiedzi ścieżek są w niektórych przypadkach całkiem bezużyteczne.
wlin

# 4 nie działało dla mnie w pierwszej instancji, ponieważ nie dodałem
hej

15

Oto jak je znajduję ...

Treść > Widżety > Dodaj
typ widżetu = CMS Static Block
Design Theme = [Your Theme]

Kontyntynuj

Aktualizacje układu > Dodaj
wyświetlanie układu włączone = [Wybierz jeden]

Kliknij prawym przyciskiem Sprawdzić na „Wybierz” pod pojemnikiem.
Rozwiń <select>element w Narzędziach dla programistów
Wszystkie wartości = są opcją referencyjną Nazwy kontenerów

:)


Dlaczego nie widzimy na tej liście referencyjnych kontenerów, takich jak header.panel lub page.wrapper?
DevonDahon,

1
Dziękuję Ci bardzo! Myślisz, że magento 2 devs zapewniłoby szybkie odniesienie do znalezienia tych nazw w swoich dokumentach. Bardzo ceniony za pomocną wskazówkę :)
Jonathan Marzullo

Musisz wybrać „Układy strony” z rozwijanego menu „Wyświetl
włączone

Dziękuję Ci! To zadziałało dla mnie - teraz oczywiste!
Freshwebs

Dzięki człowieku, bardzo fajne wskazówki podczas nauki M2 :)
dostępny do

7

Możesz wykonać poniższy kod php-cli, aby uzyskać listę wszystkich ~ 200 referenceBlock. Upewnij się, że ścieżka do folderu głównego Magento 2 jest poprawna. Można również zmienić instructionzmienną do listy block, containeri 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
Geniusz. Ta metoda jest tak bezcenna. Dziękuję bardzo za udostępnienie.
crashtestxxx

1
To niesamowite dzięki bardzo pomocne. Zmodyfikowałem go w taki, aby zrzucił je wszystkie jako pliki tekstowe dla całej witryny. gist.github.com/LiamKarlMitchell/…
Liam Mitchell

Czy wymaga konkretnej wersji php / magento? Na PHP 7.2.24 + Magento 2.3.3 pojawia się błąd: „Ostrzeżenie PHP: ksort () oczekuje, że parametr 1 będzie tablicą, wartość null podana w /home/magento/Desktop/list-magento.php w linii 21” i otrzymałem brak wyjścia.
Adrian Lopez,

4

Możesz użyć tego bezpłatnego rozszerzenia:

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

Lub po @blizam odpowiedz na niektóre referencje wybrane z widżetów:

Po nagłówku strony> page.top

Po nagłówku strony Góra> top.kontener

Przed kolumnami głównymi> columns.top

Przed stopką strony> page.bottom

Przed kontenerem stopki strony> page.bottom.container

Linki stopki CMS> cms_footer_links_container

Porównaj opakowanie otoki> porównaj opakowanie otoki

Główny obszar treści> treść

Główna treść na boku> content.aside

Main Content Bottom> content.bottom

Główny kontener zawartości> główny

Główna treść Góra> content.top

Blok promocyjny mini-koszyka> minicart.addons

Page Bottom> before.body.end

Stopka strony> stopka

Strona Kontener stopki> kontener stopki

Nagłówek strony> opakowanie nagłówka

Kontener nagłówka strony> header.container

Panel nagłówka strony> header.panel

Góra strony> after.body.start

Pasek boczny Dodatkowe> sidebar.additional

Pasek boczny Główny> pasek boczny


3

Złożyłem mały moduł, który zapisze strukturę strony XML do pliku dziennika w var/log/folderze.

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 / register.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;
    }
}

Nie dzieje się tu nic niesamowitego i jestem pewien, że jest dużo miejsca do ulepszenia (praca z wbudowanym loggerem jest jednym z nich), ale robi to dla mnie, gdy tworzę witrynę.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.