Descubra el "nombre" para una referencia Bloqueo en Magento 2

11

Quiero eliminar algunos bloques de mi página. Digamos, por ejemplo, que quiero eliminar el contenedor del logotipo.

Luego creo /app/design/frontend/MYVENDORNAME/MYTHEMENAME/Magento_Theme/layout/default.xmlcon el siguiente 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>

En este caso, logré encontrar el nombre (nombre = "logo") de este bloque de referencia buscando en los archivos del tema base.

La pregunta es: ¿hay una mejor manera de averiguar los nombres de los bloques? Me imagino que debe haber una lista de todos los nombres utilizados en los archivos XMl en Magento. ¿O algún tipo de referencia?

Digamos, por ejemplo, que me gustaría eliminar el menú ( <div class="sections nav-sections">...</div>). ¿Cómo puedo saber el nombre de ese

Gordova
fuente
1
Puede encontrarlo en un archivo XML en el tema base. si desea eliminar el menú, este nombre es catalog.topnav. Lo encuentro en default.xml en el tema del módulo en la base.
xanka

Respuestas:

17

Hay un par de formas de hacer esto:

  1. Adivinar
  2. Diseño de revisión para temas base, en blanco y luma
  3. Realizar búsquedas IDE para nombres de clase e ID
  4. Habilite 'Sugerencias de ruta de plantilla habilitadas para escaparate' y 'Agregar nombres de bloque a sugerencias'.

Puede habilitar sugerencias de ruta y sugerencias de bloqueo iniciando sesión en la interfaz de administrador y yendo a:

Stores > Configuration > Advanced > Developer > Debug

Desafortunadamente, todavía no hay una forma segura de encontrarlos fácilmente, que yo sepa. Aunque parece que los chicos que trabajan en el núcleo están en ello:

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

Gareth Daine
fuente
Como dijo Gareth, puede habilitar las sugerencias de ruta de la plantilla para intentar averiguar qué plantilla y bloque representa esa parte del código.
Barbanet
3
Me gusta cómo dijiste 'adivinar', las sugerencias de ruta son bastante inútiles en algunos casos.
wlin
# 4 no funcionó para mí en primera instancia, porque no incluí mi IP en la lista blanca como se describe aquí: docs.magento.com/m2/ee/user_guide/system/…
Hola,
15

Así es como los encuentro ...

Contenido > Widgets > Agregar
tipo de widget =
Tema de diseño de bloque estático CMS = [Su tema]

Seguir

Actualizaciones de diseño > Agregar
visualización de diseño en = [Elegir uno]

Haga clic derecho en Inspeccionar en "Seleccione" debajo de Contenedor.
Expanda el <select>elemento en Dev Tools.
Todos los valores de la opción = son sus nombres de referencia de contenedor.

:)

blizam
fuente
¿Por qué no vemos contenedores de referencia como header.panel o page.wrapper en esta lista?
DevonDahon
1
¡Muchas gracias! Cree que los desarrolladores de magento 2 proporcionarían una referencia rápida para encontrar estos nombres en sus documentos. Muy apreciado por su consejo útil :)
Jonathan Marzullo
Debe
¡Gracias! Esto funcionó para mí, ¡obvio ahora!
Freshwebs
Gracias hombre, muy buenos consejos al aprender M2 :)
puntable
7

Puede ejecutar el código php-cli a continuación para obtener una lista de todos los ~ 200 referenceBlock. Asegúrese de que la ruta a su carpeta raíz de Magento 2 sea ​​correcta. También puede cambiar la instructionvariable a la lista block, containery 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++;
}

?>
DevonDahon
fuente
1
Genio. Este método no tiene precio. Muchas gracias por compartir.
crashtestxxx
1
Esto es increíble, muchas gracias súper útil. Lo modifiqué en uno que los volcaría a todos como archivos de texto para todo el sitio. gist.github.com/LiamKarlMitchell/…
Liam Mitchell
¿Requiere alguna versión específica de php / magento? En PHP 7.2.24 + Magento 2.3.3 me sale el error: "Advertencia de PHP: ksort () espera que el parámetro 1 sea matriz, nulo dado en /home/magento/Desktop/list-magento.php en la línea 21" Y obtuve ninguna salida.
Adrián López
4

Puedes usar esta extensión gratuita:

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

O siguiendo @blizam responde algunas referencias elegidas de los widgets:

Después del encabezado de página> page.top

Después del encabezado de página Arriba> top.container

Antes de columnas principales> columnas.top

Antes del pie de página> page.bottom

Antes del contenedor de pie de página> page.bottom.container

Enlaces de pie de página de CMS> cms_footer_links_container

Compare Link Wrapper> compare-link-wrapper

Área de contenido principal> contenido

Contenido principal aparte> content.aside

Contenido principal Inferior> content.bottom

Contenedor de contenido principal> principal

Contenido principal Inicio> content.top

Bloque de promoción de minicarros> minicart.addons

Parte inferior de la página> before.body.end

Pie de página> pie de página

Contenedor de pie de página> contenedor de pie de página

Encabezado de página> contenedor de encabezado

Contenedor de encabezado de página> header.container

Panel de encabezado de página> header.panel

Inicio de página> after.body.start

Barra lateral Adicional> barra lateral.addicional

Barra lateral Principal> barra lateral.main

open-ecommerce.org
fuente
3

Creé un pequeño módulo que escribirá la estructura de la página XML en un archivo de registro en la var/log/carpeta.

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

No pasa nada increíble aquí, y estoy seguro de que hay mucho espacio para mejorar (trabajar con el registrador incorporado es uno de ellos) pero hace el trabajo por mí cuando estoy desarrollando un sitio.

Círculosix
fuente
0

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

@Aquí encontrarás una lista de contenedores, aún así es difícil ubicar uno correcto, pero sé que puedes lograr encontrar el correcto.

o como arriba, alguien proporciona un enlace de módulo gratuito para encontrar el contenedor o el bloque en magento, lo probé pero aún así es útil para responder a deambular por la web.

Gaurav Kumar
fuente