Magento 2のreferenceBlockの「名前」を見つける


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")を見つけることができました。

問題は、ブロックの名前を見つけるより良い方法があるかどうかです。MagentoのXMlファイルで使用されているすべての名前のリストがあるはずです。それとも何らかのリファレンスですか?

たとえば、メニューを削除したいとします(<div class="sections nav-sections">...</div>)。その名前を知るにはどうすればいいですか


1
あなたはそれをベーステーマのXMLファイルで見つけることができます。メニューを削除したい場合、この名前はcatalog.topnavです。私はそれをベースのテーマThemeのdefault.xmlで見つけます。
xanka 2016

回答:


17

これを行うにはいくつかの方法があります。

  1. 推測
  2. Base、Blank、Lumaテーマのレイアウトのレビュー
  3. クラスとID名のIDE検索を実行する
  4. 「ストアフロントで有効なテンプレートパスヒント」と「ヒントにブロック名を追加」を有効にします。

パスのヒントを有効にして、ヒントをブロックするには、管理インターフェイスにログインして次のように移動します。

Stores > Configuration > Advanced > Developer > Debug

残念ながら、私が知る限り、これらを簡単に見つける確実な方法はまだありません。コアに取り組んでいる人たちがそれに取り組んでいるようですが:

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


Garethが言ったように、テンプレートパスヒントを有効にして、テンプレートとブロックがコードのその部分をレンダリングしているテンプレートを理解しようとすることができます。
Barbanet 2016

3
私はあなたが「推測」を言った方法が好きです、パスヒントはいくつかのケースではかなり役に立たないです。
wlin 2016年

:ここで説明したように、私はホワイトリスト私のIPなかったので、#4には、まず第一に私のために仕事をしませんでしたdocs.magento.com/m2/ee/user_guide/system/...
ちょっと

15

ここに私がそれらを見つける方法があります...

コンテンツ > ウィジェット > ウィジェット
タイプの追加 = CMSスタティックブロック
デザインテーマ= [あなたのテーマ]

継続する

レイアウトの更新 > レイアウトの
表示を追加 = = [1つ選択]

コンテナの下の「選択してください」で「検査」を右クリックします。
展開<select>開発ツールの要素
のすべてのオプション値= 'sがあなたのreferenceContainer名前ですが。

:)


このリストにheader.panelやpage.wrapperなどのreferenceContainersが表示されないのはなぜですか?
DevonDahon 2017年

1
どうもありがとうございました!あなたは、magento 2開発者がドキュメントでこれらの名前を見つけるためのクイックリファレンスを提供すると思います。役立つヒントを
ありがとう

[表示オン]ドロップダウンで[ページレイアウト]を選択すると、すべての参照コンテナが表示されます
Samyer

ありがとうございました!これは私にとってごちそうでした-今すぐ明らかです!
Freshwebs

おかげで、M2を学習する際の非常に素晴らしいヒント:)
パンタブル

7

以下のphp-cliコードを実行して、すべての〜200のリストを取得できreferenceBlockます。Magento 2のルートフォルダーへのパスが正しいことを確認してください。instruction変数をlist blockcontainerおよびに変更することもできます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
天才。この方法はとても貴重です。共有してくれてありがとう
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が指定されています」出力なし。
Adrian Lopez

4

この無料の拡張機能を使用できます。

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

または、@ blizamに続いて、ウィジェットから選択されたいくつかの参照に答えます。

ページヘッダーの後> page.top

ページヘッダーの後> top.container

メイン列の前に> 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

var/log/フォルダー内のログファイルにXMLページ構造を書き込む小さなモジュールをまとめました。

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

ここで起こっていることはあまりにも驚くべきことではなく、改善の余地は十分にあると確信しています(組み込みのロガーを使用することもその1つです)が、サイトを開発しているときは、仕事が完了します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.