Descubra o "nome" para um bloco de referência no Magento 2


11

Quero remover alguns blocos da minha página. Digamos, por exemplo, que desejo remover o contêiner do logotipo.

Então eu crio /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlcom o seguinte código:

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

Nesse caso, consegui descobrir o nome (nome = "logotipo") desse bloco de referência pesquisando os arquivos no Tema Base.

A questão é: existe uma maneira melhor de descobrir os nomes dos blocos. Eu acho que deve haver uma lista de todos os nomes usados ​​nos arquivos XMl no Magento? Ou algum tipo de referência?

Digamos, por exemplo, que eu gostaria de remover o menu ( <div class="sections nav-sections">...</div>). Como faço para descobrir o nome desse


1
Você pode encontrá-lo no arquivo XML no tema base. se você deseja remover o menu, esse nome é catalog.topnav. Acho que no default.xml no módulo Theme na base.
xanka

Respostas:


17

Há algumas maneiras de fazer isso:

  1. Acho
  2. Revisar o layout dos temas base, em branco e Luma
  3. Executar pesquisas IDE para nomes de classe e ID
  4. Habilite 'Dicas de caminho de modelo habilitadas para fachada de loja' e 'Adicionar nomes de bloco às dicas'.

Você pode ativar as dicas de caminho e bloquear, entrando na interface de administração e acessando:

Stores > Configuration > Advanced > Developer > Debug

Infelizmente, ainda não há uma maneira infalível de encontrá-los facilmente, tanto quanto eu sei. Embora pareça que os caras que trabalham no núcleo estão envolvidos nisso:

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


Como Gareth disse, você pode ativar as dicas de caminho do modelo para tentar descobrir qual modelo e bloco está processando essa parte do código.
Barbanet

3
Eu gosto de como você disse 'palpite', dicas de caminho são bastante inúteis em alguns casos.
Wlin

# 4 não funcionou para mim, em primeira instância, porque eu não fiz whitelist meu IP, conforme descrito aqui: docs.magento.com/m2/ee/user_guide/system/...
hey

15

Aqui está como eu os encontro ...

Conteúdo > Widgets > Adicionar
tipo de widget =
Tema de design de bloco estático do CMS = [Seu tema]

Continuar

Atualizações de layout > Adicionar
exibição de layout ativada = [Escolha uma]

Clique com o botão direito do mouse em Inspecionar em "Por favor, selecione" abaixo do container.
Expanda o <select>elemento nas Ferramentas de desenvolvimento.
Todos os valores = = da opção são os nomes referenceContainer.

:)


Por que não vemos referenceContainers como header.panel ou page.wrapper nesta lista?
DevonDahon

1
Muito obrigado! Você acha que os desenvolvedores do magento 2 forneceriam uma referência rápida para encontrar esses nomes em seus documentos. Muito apreciado por sua dica útil :)
Jonathan Marzullo

Você precisa selecionar "Layouts de página" na lista suspensa "Exibir
ativada

Obrigado! Isso funcionou para mim - óbvio agora!
Freshwebs

Obrigado cara, muito boas dicas ao aprender M2 :)
puntable

7

Você pode executar o código php-cli abaixo para obter uma lista de todos os ~ 200 referenceBlock. Verifique se o caminho para a pasta raiz do Magento 2 está correto. Você também pode alterar a instructionvariável à lista block, containere 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
Gênio. Este método não tem preço. Muito obrigado por compartilhar.
crashtestxxx

1
Isso é incrível, muito obrigado super útil. Eu o modifiquei em um que despejaria todos eles como arquivos de texto para todo o site. gist.github.com/LiamKarlMitchell/…
Liam Mitchell

Requer alguma versão específica do php / magento? No PHP 7.2.24 + Magento 2.3.3, recebo o erro: "Aviso do PHP: o ksort () espera que o parâmetro 1 seja array, nulo fornecido em /home/magento/Desktop/list-magento.php na linha 21" E obtive sem saída.
Adrian Lopez

4

Você pode usar esta extensão gratuita:

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

Ou siga @blizam responder a algumas referências selecionadas dos widgets:

Após o cabeçalho da página> page.top

Após o cabeçalho da página Início> top.container

Antes das colunas principais> columns.top

Antes do rodapé da página> page.bottom

Antes do Contêiner do Rodapé da Página> page.bottom.container

Links de rodapé do CMS> cms_footer_links_container

Compare Link Wrapper> compare-link-wrapper

Área de conteúdo principal> content

Além do conteúdo> content.aside

Conteúdo principal Bottom> content.bottom

Contentor Principal> main

Principal conteúdo Início> content.top

Bloco de promoção para carrinho de compras> minicart.addons

Parte inferior da página> before.body.end

Rodapé da página> rodapé

Contêiner de Rodapé da Página> contêiner de rodapé

Cabeçalho da página> wrapper de cabeçalho

Contêiner de cabeçalho da página> header.container

Painel do cabeçalho da página> header.panel

Topo da página> after.body.start

Barra lateral adicional> sidebar.additional

Barra lateral principal> sidebar.main


3

Eu montei um pequeno módulo que gravará a estrutura da página XML em um arquivo de log na var/log/pasta.

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

Não há nada de incrível acontecendo aqui, e tenho certeza de que há muito espaço para melhorar (trabalhar com o criador de logs incorporado é um deles), mas ele faz o trabalho para mim quando estou desenvolvendo um site.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.