Magento2 : 아래 제품 세부 사항 페이지에 사용자 정의 템플리트 추가 장바구니 섹션에 추가


10

소셜 공유 섹션에서 제품 페이지에 사용자 지정 템플릿을 추가하려고합니다. 내 모듈에서 레이아웃 파일 default.xml의 코드를 따르고 있습니다.

 <body>
 <referenceContainer name="product.info.social">
  <block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
  </block>
 </referenceContainer>
</body>

social.phtml 컨텐츠

<p>Hey there !</p>
<?php //$_product = $block->getProduct();

제대로 작동하고 제품 페이지에 템플릿 내용을 표시합니다. 를 사용하여 템플릿에서 제품 객체를 얻을 수 있도록 Magento\Catalog\Block\Product\View대신 블록 클래스 를 Magento\Framework\View\Element\Template사용 $block->getProduct();하면 빈 페이지가 표시됩니다.

1. 내가 여기서하는 실수는 무엇입니까?
2. 제품 페이지를 수정하는 가장 좋은 방법은 무엇입니까?
3. 모듈의 레이아웃 코드를 작성하는 제품 페이지의 섹션에 새 템플릿을 추가하는 데 사용할 수있는 참조 레이아웃 파일이 있습니까?


@amiteshree는 phtml 파일 일 수 있습니다. Magento \ Catalog \ Block \ Product \ View 블록 파일에 정의 된 함수가 포함되어 있습니다
Shaheer Ali

@ShaheerAli : 내 phtml 파일에서 블록을 사용할 $_product = $block->getProduct();때 제품 객체를 사용하려고합니다 Magento\Catalog\Block\Product\View.
amitshree

그렇다면 왜 템플릿에 Magento \ Framework \ View \ Element \ Template 블록을 할당해야합니까?
Shaheer Ali

1
@amiteshree 제품보기 기능을 사용하려면 Magento \ Catalog \ Block \ Product \ View를 템플릿 phtml에 할당해야합니다. 그리고 제품 페이지에 커스텀 템플릿을 추가하는 방법이 정확합니다
Shaheer Ali

1
빈 페이지는 일반적으로 일부 오류가 발생했음을 의미합니다. error.log를 살펴 보셨습니까? 마 젠토 예외 로그? 어떤 모드를 사용하십니까?
Anton Kril

답변:


24

때문에 "화이트 페이지"오류가 제공 Magento\Framework\View\Element\Template되지 않은이 getProduct()방법을.

그래서 가장 깨끗한 방법은 커스텀 블록, 레이아웃 및 템플릿을 사용하여 커스텀 모듈을 만드는 것입니다 (몇 분이 걸리더라도 걱정하지 마십시오)

모듈 파일 :

여기에 이미지 설명을 입력하십시오

(나는 건너 뛸 /etc/module.xml것이고 registration.php사소한 것이기 때문에 완전한 예제를 여기서 찾을 수 있습니다 .)

Block php 파일로 시작하자 :

테스트 \ 카탈로그 \ 블록 \ 제품 \보기 \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

보시다시피 가장 가벼운 Product Abstract Block의 구체적인 클래스 확장 (IMO) 일뿐입니다. 또한 확장 할 수 Magento\Framework\View\Element\Template있지만이 경우 getProduct()레지스트리에 액세스 하려면 메소드 를 구현 하고 생성자의 컨텍스트를 변경해야합니다.

레이아웃 파일로 이동합니다 :

테스트 / 카탈로그 /view/frontend/layout/catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

그리고 마지막으로 템플릿 파일 :

테스트 / 카탈로그 /view/frontend/templates/product/view/extra.phtml

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

보다시피 M1-보다 가장 간단하고 간단합니다

Extra.php뷰를 깨끗하게 유지하려면 모든 사용자 정의 로직을 블록 클래스에 구현해야합니다 .

즉 :

에서 Extra.php의 클래스 :

public function getSomething()
{
    return 'something'
}

에서 extra.phtml 보기 :

<?php echo $block->getSomething() ?>

2
제품 페이지에있을 때 내 모듈의 catalog_product_view.xml 레이아웃이 자동으로로드됩니까?
amitshree

2
물론입니다! M1과 매우 유사하지만 이제는 모든 핸들이 분리 된 파일에 있습니다.
MauroNigrele

5

허용되는 답변에 대한 보충

허용되는 답변은 좋지만 현재 AbstractProduct더 이상 사용되지 않습니다 .

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

따라서 BlockMagento\Framework\Registry 을 달성하기 위해 를 사용해야합니다 . 블록 샘플은 다음과 같습니다.

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

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