ค้นหา "ชื่อ" สำหรับการอ้างอิงบล็อกใน Magento 2


11

ฉันต้องการลบบล็อกบางส่วนออกจากหน้าของฉัน พูดเช่นฉันต้องการลบคอนเทนเนอร์สำหรับโลโก้

จากนั้นฉันสร้าง/app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlด้วยรหัสต่อไปนี้:

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

ในกรณีนี้ฉันจัดการเพื่อหาชื่อ (name = "logo") ของบล็อกอ้างอิงนี้โดยการค้นหาไฟล์ใน Theme Base

คำถามคือ: มีวิธีที่ดีกว่าในการหาชื่อของบล็อก ฉันคิดว่าต้องมีรายชื่อทั้งหมดที่ใช้ในไฟล์ XMl ใน Magento? หรือการอ้างอิงบางอย่าง?

พูดเช่นว่าฉันต้องการลบเมนู ( <div class="sections nav-sections">...</div>) ฉันจะหาชื่อได้อย่างไร


1
คุณสามารถค้นหาได้ในไฟล์ XML ในชุดรูปแบบพื้นฐาน catalog.topnavหากคุณต้องการที่จะลบเมนูชื่อนี้คือ ฉันพบมันใน default.xml ในโมดูล Theme ในฐาน
xanka

คำตอบ:


17

มีสองวิธีในการทำสิ่งนี้:

  1. เดา
  2. ทบทวนเค้าโครงสำหรับธีมฐานเปล่าและลูม่า
  3. ทำการค้นหา IDE สำหรับชื่อคลาสและ ID
  4. เปิดใช้งาน 'คำแนะนำเส้นทางแม่แบบที่เปิดใช้งานสำหรับหน้าร้าน' และ 'เพิ่มชื่อบล็อกเป็นคำแนะนำ'

คุณสามารถเปิดใช้งานคำแนะนำเส้นทางและบล็อกคำแนะนำได้โดยลงชื่อเข้าใช้อินเทอร์เฟซผู้ดูแลระบบและไปที่:

Stores > Configuration > Advanced > Developer > Debug

น่าเสียดายที่ยังไม่มีวิธีที่แน่นอนในการค้นหาสิ่งเหล่านี้ได้อย่างง่ายดายเท่าที่ฉันรู้ แม้ว่าดูเหมือนว่าพวกที่ทำงานบนแกนหลักจะเป็น:

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


ดังที่ Gareth กล่าวว่าคุณสามารถเปิดใช้งานคำแนะนำเส้นทางเทมเพลตเพื่อลองคิดดูว่าเทมเพลตและบล็อกใดที่กำลังแสดงผลส่วนนั้นของรหัส
Barbanet

3
ฉันชอบที่คุณพูดว่า 'เดา' คำแนะนำเส้นทางไม่มีประโยชน์ในบางกรณี
wlin

# 4 ไม่ทำงานสำหรับฉันในกรณีแรกเพราะผมไม่ได้รายการที่อนุญาต IP ของฉันตามที่อธิบายไว้ที่นี่: docs.magento.com/m2/ee/user_guide/system/...
เฮ้

15

นี่คือวิธีที่ฉันพบพวกเขา ...

เนื้อหา > วิดเจ็ต > เพิ่ม
ประเภทวิดเจ็ต =
ธีมการออกแบบบล็อกคง CMS = [ธีมของคุณ]

ต่อ

การอัพเดตเลย์เอาต์ > เพิ่มการ
แสดงเลย์เอาต์เปิด = [เลือกหนึ่ง]

คลิกขวาตรวจสอบที่ "กรุณาเลือก" ใต้คอนเทนเนอร์
ขยาย<select>องค์ประกอบในเครื่องมือ Dev
ทุกตัวเลือกค่า = 's เป็นของคุณ referenceContainer ชื่อ

:)


เหตุใดเราจึงไม่เห็นผู้อ้างอิงคอนเทนเนอร์เช่น header.panel หรือ page.wrapper ในรายการนี้
DevonDahon

1
ขอบคุณมาก! คุณคิดว่า magento 2 devs จะให้การอ้างอิงอย่างรวดเร็วเพื่อค้นหาชื่อเหล่านี้ในเอกสารของพวกเขา นิยมมากสำหรับเคล็ดลับที่เป็นประโยชน์ของคุณ :)
Jonathan Marzullo

คุณต้องเลือก "เลย์เอาต์ของหน้าเว็บ" ในรายการแบบเลื่อนลง "ดิสเพลย์เปิด" จากนั้นคุณจะเห็นคอนเทนเนอร์อ้างอิงทั้งหมด
Samyer

ขอขอบคุณ! สิ่งนี้ได้ผลสำหรับฉัน - ชัดเจนแล้วตอนนี้!
Freshwebs

ขอบคุณชายคำแนะนำที่ดีมากเมื่อเรียนรู้ M2 :)
puntable

7

คุณสามารถรันโค้ดphp-cliด้านล่างเพื่อรับรายการของ ~ 200 referenceBlockทั้งหมด ตรวจสอบให้แน่ใจว่าเส้นทางไปยังโฟลเดอร์รูทของMagento 2ถูกต้อง นอกจากนี้คุณยังสามารถเปลี่ยนinstructionตัวแปรรายการblock, และcontainerreferenceContainer

<?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
อัจฉริยภาพ วิธีนี้ไม่มีค่าเลย ขอบคุณมากสำหรับการแบ่งปัน.
crashtestxxx

1
ขอบคุณมากสุดยอดมากที่เป็นประโยชน์ ฉันแก้ไขมันเป็นไฟล์เดียวที่จะทิ้งมันทั้งหมดเป็นไฟล์ข้อความสำหรับทั้งไซต์ gist.github.com/LiamKarlMitchell/…
Liam Mitchell

มันต้องใช้ php / magento รุ่นที่เฉพาะเจาะจงหรือไม่? ใน PHP 7.2.24 + Magento 2.3.3 ฉันได้รับข้อผิดพลาด: "PHP Warning: ksort () คาดว่าพารามิเตอร์ 1 จะเป็น array, null ให้ใน /home/magento/Desktop/list-magento.php ที่บรรทัด 21" และได้รับ ไม่มีเอาต์พุต
Adrian Lopez

4

คุณสามารถใช้ส่วนขยายฟรีนี้:

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

หรือทำตาม @blizam ตอบคำถามอ้างอิงที่เลือกจากวิดเจ็ต:

หลังจากส่วนหัวของหน้า> page.top

After Page Header Top> top.container

ก่อนคอลัมน์หลัก> คอลัมน์หยุด

ก่อนหน้าส่วนท้ายของหน้า> page.bottom

ก่อนหน้าส่วนท้ายของหน้าคอนเทนเนอร์> page.bottom.container

ลิงก์ CMS Footer> cms_footer_links_container

เปรียบเทียบ Link Wrapper> compar-link-wrapper

พื้นที่เนื้อหาหลัก> เนื้อหา

เนื้อหาหลักนอกเหนือจาก> content.aside

เนื้อหาหลักด้านล่าง> content.bottom

คอนเทนเนอร์เนื้อหาหลัก> หลัก

เนื้อหาหลักด้านบน> content.top

โปรโมชั่นรถมินิบล็อก> minicart.addons

Page Bottom> before.body.end

Page Footer> ส่วนท้าย

Page Footer Container> ส่วนท้ายของคอนเทนเนอร์

Page Header> header-wrapper

คอนเทนเนอร์ของส่วนหัวของหน้า> header.container

แผงส่วนหัวของหน้า> header.panel

หน้าแรก> after.body.start

แถบข้างเพิ่มเติม> sidebar.additional

แถบด้านข้างหลัก> แถบด้านข้างหลัก


3

ฉันรวบรวมโมดูลเล็ก ๆ น้อย ๆ ที่จะเขียนโครงสร้างหน้า XML ไปยังไฟล์บันทึกในvar/log/โฟลเดอร์

app / รหัส / 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 / รหัส / 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 / รหัส / CustomerParadigm / PageXml / registration.php

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

app / รหัส / CustomerParadigm / PageXml / รุ่น / 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;
    }
}

ไม่มีอะไรน่าประหลาดใจนักที่เกิดขึ้นที่นี่และฉันมั่นใจว่ามีพื้นที่เหลือเฟือที่จะต้องปรับปรุง (การทำงานกับตัวบันทึกในตัวเป็นหนึ่งในนั้น) แต่มันก็ทำให้ฉันได้งานเมื่อฉันพัฒนาเว็บไซต์


0

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

@ ที่นี่คุณพบรายการของภาชนะบรรจุยังคงเป็นเรื่องยากที่จะหาที่ถูกต้อง แต่ฉันรู้ว่าคุณสามารถจัดการเพื่อหาที่เหมาะสม

หรืออย่างที่กล่าวไว้ข้างต้นมีลิงก์โมดูลฟรีเพื่อค้นหาคอนเทนเนอร์หรือบล็อกในวีโอไอพีฉันลองใช้ แต่ก็ยังมีประโยชน์ในการท่องไปบนเว็บ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.