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입니다. 기본 모듈 테마의 default.xml에서 찾을 수 있습니다.
xanka

답변:


17

이를 수행하는 몇 가지 방법이 있습니다.

  1. 추측
  2. 기본, 공백 및 루마 테마의 레이아웃 검토
  3. 클래스 및 ID 이름에 대한 IDE 검색 수행
  4. '상점에 대한 사용 가능한 템플리트 경로 힌트'및 '힌트에 블록 이름 추가'를 사용하십시오.

관리자 인터페이스에 로그인하고 다음으로 이동하여 경로 힌트 및 블록 힌트를 활성화 할 수 있습니다.

Stores > Configuration > Advanced > Developer > Debug

불행히도, 내가 아는 한 이것을 쉽게 찾을 수있는 확실한 방법은 없습니다. 핵심 작업을하는 사람들이 여기에있는 것처럼 보이지만 :

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


Gareth가 말했듯이 템플릿 경로 힌트를 사용하여 템플릿을 파악하고 블록이 코드의 해당 부분을 렌더링하도록 할 수 있습니다.
Barbanet

3
나는 당신이 '추측'이라고 말한 것을 좋아합니다. 경로 힌트는 경우에 따라 쓸모가 없습니다.
wlin


15

내가 찾는 방법은 다음과 같습니다.

콘텐츠 > 위젯 > 위젯
유형 추가 = CMS 정적 블록
디자인 테마 = [내 테마]

계속하다

레이아웃 업데이트 > 레이아웃 추가
표시 켜기 = [하나 선택]

마우스 오른쪽 버튼으로 클릭하여 검사 컨테이너 아래에 "제발 선택"에. 개발 도구
에서 <select>요소 확장
모든 value 값은 referenceContainer 이름입니다.

:)


이 목록에 header.panel 또는 page.wrapper와 같은 referenceContainers가 표시되지 않는 이유는 무엇입니까?
DevonDahon

1
대단히 감사합니다! magento 2 개발자는 문서에서 이러한 이름을 찾기위한 빠른 참조를 제공한다고 생각합니다. 귀하의 유용한 팁에 감사드립니다 :)
Jonathan Marzullo

"표시 켜기"드롭 다운에서 "페이지 레이아웃"을 선택하면 모든 참조 컨테이너가 표시됩니다.
Samyer

감사합니다! 이것은 나를 위해 치료를했습니다-지금 당연합니다!
Freshwebs 2019

감사합니다 사람은 아주 좋은 팁 : M2를 배울 때
puntable

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
천재. 이 방법은 매우 귀중합니다. 공유해 주셔서 감사합니다.
crashtestxxx

1
매우 도움이 된 덕분입니다. 전체 사이트의 텍스트 파일로 모두 덤프하는 것으로 수정했습니다. gist.github.com/LiamKarlMitchell/…
Liam Mitchell

특정 버전의 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

After Page Header 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

사이드 바 추가> 사이드 바 추가

사이드 바 메인> 사이드 바 메인


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__
);

앱 / 코드 /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;
    }
}

여기에 너무 놀라운 일이 없으며 개선해야 할 여지가 충분하다고 확신합니다 (내장 로거로 작업하는 것이 그 중 하나입니다).하지만 사이트를 개발할 때 나를 위해 일을 처리합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.