Узнайте «имя» для ссылочного блока в 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") этого ссылочного блока путем поиска по файлам в базовой теме.

Вопрос в том, есть ли лучший способ узнать названия блоков. Я полагаю, что должен быть список всех имен, используемых в файлах XMl в Magento? Или какая-то ссылка?

Скажем, например, что я хотел бы удалить меню ( <div class="sections nav-sections">...</div>). Как мне узнать название этого


1
Вы можете найти его в файле XML в базовой теме. если вы хотите удалить меню это имя catalog.topnav. Я нахожу это в default.xml в модуле Тема в базе.
xanka

Ответы:


17

Есть несколько способов сделать это:

  1. Угадать
  2. Обзор макета для базовой, пустой и Luma тем
  3. Выполните поиск IDE для классов и имен ID
  4. Включите «Включенные подсказки путей к шаблонам для витрины» и «Добавить имена блоков в подсказки».

Вы можете включить подсказки пути и заблокировать подсказки, войдя в интерфейс администратора и перейдя к:

Stores > Configuration > Advanced > Developer > Debug

К сожалению, до сих пор нет надежного способа найти это легко, насколько я знаю. Хотя похоже, что ребята, работающие над ядром, заняты этим:

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


Как сказал Гарет, вы можете включить подсказки пути к шаблону, чтобы попытаться выяснить, какой шаблон и блок визуализируют эту часть кода.
Барбанет

3
Мне нравится, как вы сказали «угадай», подсказки пути в некоторых случаях довольно бесполезны.
wlin

# 4 не работал для меня в первую очередь, потому что я не внес
эй,

15

Вот как я их нахожу ...

Содержимое > Виджеты > Добавить
тип виджета =
Тема оформления статического блока CMS = [Ваша тема]

Продолжать

Обновления макета > Добавить
отображение макета вкл. = [Выбрать один]

Щелкните правой кнопкой мыши Осмотреть на «Выберите» под контейнер.
Разверните <select>элемент в Dev Tools.
Все значения параметра = являются вашими именами referenceContainer.

:)


Почему мы не видим в этом списке referenceContainers, например header.panel или page.wrapper?
DevonDahon

1
Большое спасибо! Вы думаете, что разработчики magento 2 могли бы быстро найти эти имена в своих документах. Очень признателен за ваш полезный совет :)
Джонатан Марзулло

Вам нужно выбрать «Макеты страниц» в выпадающем меню «Отображение
включено

Спасибо! Это сработало для меня - теперь очевидно!
Freshwebs

Спасибо человек, очень хорошие советы при изучении M2 :)
наказуемо

7

Вы можете выполнить код php-cli ниже, чтобы получить список всех ~ 200 referenceBlock. Убедитесь, что путь к корневой папке Magento 2 указан правильно. Вы также можете изменить instructionпеременную в список block, containerи 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
Genius. Этот метод так бесценен. Большое спасибо, что поделились.
crashtestxxx

1
Это потрясающе, спасибо, очень полезно. Я изменил его в один, который будет выводить все из них в виде текстовых файлов для всего сайта. gist.github.com/LiamKarlMitchell/...
Лиам Митчелл

Требуется ли какая-то конкретная версия php / magento? В PHP 7.2.24 + Magento 2.3.3 я получаю сообщение об ошибке: «Предупреждение PHP: ksort () ожидает, что параметр 1 будет массивом, значение NULL указано в /home/magento/Desktop/list-magento.php в строке 21» нет выхода.
Адриан Лопес

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

Сравнить Link Wrapper> Сравнить-ссылка-обертка

Основная область контента> контент

Основное содержание в стороне> content.aside

Основное содержание Bottom> content.bottom

Контейнер основного контента> main

Главное содержание Top> content.top

Блок продвижения мини-корзины> minicart.addons

Страница внизу> before.body.end

Нижний колонтитул страницы> нижний колонтитул

Контейнер нижнего колонтитула страницы> Контейнер нижнего колонтитула

Заголовок страницы> header-wrapper

Контейнер заголовка страницы> header.container

Панель заголовка страницы> header.panel

Начало страницы> after.body.start

Боковая панель Дополнительно> боковая панель

Sidebar Main> sidebar.main


3

Я собрал небольшой модуль, который запишет структуру XML-страницы в файл журнала в var/log/папке.

Приложение / код / ​​CustomerParadigm / PageXml / и т.д. / 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>

Приложение / код / ​​CustomerParadigm / PageXml / и т.д. / 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>

Приложение / код / ​​CustomerParadigm / PageXml / registration.php

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

Приложение / код / ​​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

@ Здесь вы найдете список контейнеров, но найти нужный вам по-прежнему сложно, но я знаю, что вам удастся найти подходящий.

или, как указано выше, кто-то предоставляет бесплатную ссылку на модуль, чтобы найти контейнер или блок в magento, я попробовал это, но все же это кое-что, насколько полезно в отношении блуждания по сети.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.