Cari tahu "nama" untuk referensi. Buka di Magento 2


11

Saya ingin menghapus beberapa blok dari halaman saya. Katakan misalnya bahwa saya ingin menghapus wadah untuk logo.

Lalu saya buat /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmldengan kode berikut:

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

Dalam hal ini saya berhasil mengetahui nama (nama = "logo") dari blok referensi ini dengan mencari melalui file di Tema Basis.

Pertanyaannya adalah: Apakah ada cara yang lebih baik untuk mengetahui nama-nama blok. Saya pikir harus ada daftar semua nama yang digunakan dalam file XMl di Magento? Atau semacam referensi?

Katakan misalnya bahwa saya ingin menghapus menu ( <div class="sections nav-sections">...</div>). Bagaimana saya mengetahui nama itu?


1
Anda dapat menemukannya di file XML di tema dasar. jika Anda ingin menghapus menu nama ini catalog.topnav. saya menemukannya di default.xml di modul Theme in base.
xanka

Jawaban:


17

Ada banyak cara melakukan ini:

  1. Tebak
  2. Tinjau Tata Letak untuk Tema Dasar, Kosong dan Luma
  3. Lakukan Pencarian IDE untuk Nama Kelas dan ID
  4. Aktifkan 'Diaktifkan Petunjuk Jalur Template untuk Etalase' dan 'Tambahkan Nama Blokir ke Petunjuk'.

Anda dapat mengaktifkan petunjuk jalur dan memblokir petunjuk dengan masuk ke antarmuka admin dan pergi ke:

Stores > Configuration > Advanced > Developer > Debug

Sayangnya, masih ada cara pasti untuk menemukan ini dengan mudah, sejauh yang saya tahu. Meskipun sepertinya orang-orang yang mengerjakan inti ada di dalamnya:

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


Seperti yang dikatakan Gareth, Anda dapat mengaktifkan petunjuk jalur templat untuk mencoba mencari tahu templat dan blok mana yang merender bagian kode itu.
Barbanet

3
Saya suka bagaimana Anda mengatakan 'tebak', petunjuk jalur cukup berguna dalam beberapa kasus.
Mengayun

# 4 tidak bekerja untuk saya pada contoh pertama, karena saya tidak memasukkan daftar putih IP saya seperti yang dijelaskan di sini: docs.magento.com/m2/ee/user_guide/system/…
hey

15

Begini cara saya menemukan mereka ...

Konten > Widget > Tambahkan
Jenis Widget = CMS Static Block
Design Theme = [Your Theme]

Terus

Layout Updates > Add Layout
Display On = [Pilih Satu]

Klik kanan Periksa pada "Silakan Pilih" di bawah Container.
Luaskan <select>elemen di Dev Tools
Semua nilai opsi = adalah nama ReferenceContainer Anda.

:)


Mengapa kita tidak melihat kontainer referensi seperti header.panel atau page.wrapper dalam daftar ini?
DevonDahon

1
Terima kasih banyak! Anda pikir magento 2 devs akan memberikan referensi cepat untuk menemukan nama-nama ini di dokumen mereka. Sangat dihargai atas tip bermanfaat Anda :)
Jonathan Marzullo

Anda harus memilih "Tata Letak Halaman" pada drop-down "Tampilan Aktif", maka Anda akan melihat semua kontainer referensi
Samyer

Terima kasih! Ini berhasil bagiku - sudah jelas sekarang!
Freshwebs

Terima kasih sobat, tips yang sangat bagus ketika belajar M2 :)
puntable

7

Anda dapat menjalankan kode php-cli di bawah ini untuk mendapatkan daftar semua ~ 200 referenceBlock. Pastikan path ke folder root Magento 2 Anda sudah benar. Anda juga dapat mengubah instructionvariabel ke daftar block, containerdan 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
Jenius. Metode ini sangat berharga. Terima kasih banyak sudah berbagi.
crashtestxxx

1
Ini luar biasa, terima kasih banyak, sangat membantu. Saya memodifikasinya menjadi satu yang akan membuang semuanya sebagai file teks untuk seluruh situs. gist.github.com/LiamKarlMitchell/…
Liam Mitchell

Apakah ini memerlukan versi php / magento tertentu? Pada PHP 7.2.24 + Magento 2.3.3 saya mendapatkan kesalahan: "PHP Peringatan: ksort () mengharapkan parameter 1 menjadi array, null diberikan di /home/magento/Desktop/list-magento.php on line 21" Dan mendapat tidak ada output.
Adrian Lopez

4

Anda dapat menggunakan ekstensi gratis ini:

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

Atau mengikuti @blizam, jawab beberapa referensi yang diambil dari widget:

Setelah Header Halaman> page.top

Setelah Page Header Top> top.container

Sebelum Kolom Utama> kolom.top

Sebelum Footer Halaman> page.bottom

Sebelum Halaman Footer Container> page.bottom.container

Tautan Footer CMS> cms_footer_links_container

Bandingkan Link Wrapper> bandingkan-link-wrapper

Area Konten Utama> konten

Konten Utama Selain> content.aside

Konten Utama Bawah> content.bottom

Kontainer Konten Utama> utama

Konten Utama Top> content.top

Blok promosi gerobak mini> minicart.addons

Halaman Bawah> before.body.end

Footer Halaman> footer

Halaman Footer Container> footer-container

Header Halaman> header-wrapper

Kontainer Header Halaman> header.container

Panel Header Halaman> header.panel

Halaman Atas> after.body.start

Sidebar Tambahan> sidebar.additional

Sidebar Utama> sidebar.main


3

Saya mengumpulkan modul kecil yang akan menulis struktur halaman XML ke file log di var/log/folder.

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

Tidak ada yang terlalu luar biasa terjadi di sini, dan saya yakin ada banyak ruang untuk ditingkatkan (bekerja dengan logger bawaan adalah salah satunya) tapi itu dapat menyelesaikan pekerjaan saya ketika saya sedang mengembangkan sebuah situs.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.