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

在这种情况下,我通过搜索基本主题中的文件来设法找出此参考块的名称(名称=“徽标”)。

问题是:是否有更好的方法来找出块的名称。我认为必须在Magento的XMl文件中使用的所有名称都有一个列表吗?还是某种参考?

举例来说,我要删除菜单(<div class="sections nav-sections">...</div>)。我怎么知道那个名字


1
您可以在基本主题的XML文件中找到它。如果要删除菜单,则名称为catalog.topnav。我在base主题模块的default.xml中找到它。
xanka '16

Answers:


17

有两种方法可以做到这一点:

  1. 猜测
  2. 基本,空白和亮度主题的审阅布局
  3. 执行IDE搜索类和ID名称
  4. 启用“为店面启用模板路径提示”和“向提示添加块名称”。

您可以通过登录管理界面并转到以下路径来启用路径提示和阻止提示:

Stores > Configuration > Advanced > Developer > Debug

不幸的是,据我所知,仍然没有可靠的方法可以轻松地找到它们。尽管看起来正在核心工作的人正在努力:

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


就像Gareth所说的那样,您可以启用模板路径提示来尝试找出模板,而Block正在渲染该部分代码。
Barbanet '16

3
我喜欢您所说的“猜测”,在某些情况下,路径提示几乎没有用。
wlin

#4最初对我不起作用,因为我没有按如下所述将我的IP列入白名单:docs.magento.com/m2/ee/user_guide/system/…–
嘿,

15

这是我找到它们的方式...

内容 > 小部件 > 添加小部件
类型= CMS静态块
设计主题= [您的主题]

继续

布局更新 > 启用
打开布局显示= [选择一个]

右键单击“ 检查”,在“容器”下面。在“开发工具 ”中
展开<select>元素
所有选项value =是您的referenceContainer名称。

:)


为什么在此列表中没有看到诸如header.panel或page.wrapper之类的referenceContainer?
DevonDahon

1
非常感谢你!您认为magento 2开发人员将提供快速参考,以在其文档中找到这些名称。非常感谢您提供有用的提示:)
Jonathan Marzullo

您需要在“显示于”下拉列表中选择“页面布局”,然后您将看到所有参考容器
Samyer 18'Aug

谢谢!这为我工作了-现在很明显!
Freshwebs

谢谢男人,学习M2时非常不错的技巧:)
puntable

7

您可以执行以下php-cli代码以获取所有〜200的列表referenceBlock。确保您的Magento 2根文件夹的路径正确。你也可以改变instruction变量列表blockcontainerreferenceContainer

<?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/...
利亚姆·米切尔

是否需要特定版本的php / magento?在PHP 7.2.24 + Magento 2.3.3上,我得到以下错误:“ PHP警告:ksort()期望参数1为数组,在第21行的/home/magento/Desktop/list-magento.php中给出的null”并得到没有输出。
阿德里安·洛佩兹

4

您可以使用以下免费扩展名:

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

或跟随@blizam回答从小部件中选择的一些参考:

在页面标题> page.top之后

在页面标题顶部> top.container之后

在Main Columns之前> columns.top

在页脚> page.bottom之前

在“页脚容器”>“ page.bottom.container”之前

CMS页脚链接> cms_footer_links_container

比较链接包装器>比较链接包装器

主要内容区>内容

除了主要内容> content.aside

主要内容底部> content.bottom

主要内容容器>主要

主要内容首页> content.top

迷你推车促销区> minicart.addons

页面底部> before.body.end

页脚>页脚

页脚容器>页脚容器

页眉>页眉包装器

页面标题容器> header.container

页面标题面板> header.panel

页面顶部> after.body.start

补充工具栏> sidebar.additional

侧边栏主> sidebar.main


3

我放了一个小模块,它将XML页面结构写入文件var/log/夹中的日志文件。

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

这里没有什么令人惊奇的事情,而且我敢肯定还有很多改进的空间(使用内置记录器是其中之一),但是当我开发站点时,它可以为我完成工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.