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代わりに、ブロッククラスを使用すると、空白のページが表示されます。 1.ここで私がしている間違いは何ですか? 2.製品ページを変更する最良の方法は何ですか? 3.モジュール内のレイアウトコードを作成する製品ページの任意のセクションに新しいテンプレートを追加するために使用できる参照レイアウトファイルはありますか?Magento\Framework\View\Element\Template$block->getProduct();




@amiteshreeは、Magento \ Catalog \ Block \ Product \ View block file
Shaheer Ali

@ShaheerAli:私のphtmlファイルで、ブロックを使用している$_product = $block->getProduct();ときに製品オブジェクトを取得しようとし ていMagento\Catalog\Block\Product\Viewます。
amitshree

次に、Magento \ Framework \ View \ Element \ Templateブロックをテンプレートに割り当てるのはなぜですか。
Shaheer Ali 2016

1
@amiteshree製品ビュー関数を使用する場合は、Magento \ Catalog \ Block \ Product \ Viewをテンプレートphtmlに割り当てる必要があります。そして、カスタムテンプレートを製品ページに追加する方法は正しい
Shaheer Ali

1
空白ページは通常、何らかのエラーが発生したことを意味します。error.logを確認しましたか?magento例外ログ?どのモードを使用していますか?
Anton Kril、2016年

回答:


24

「ホワイトページ」エラーはメソッドMagento\Framework\View\Element\Templateがないために発生しますgetProduct()

だから私はそれを行うための「最もクリーンな」方法はカスタムブロック、レイアウト、テンプレートを使ってカスタムモジュールを作成することだと思います(これは数分かかるだけで、いくつかの部分を実行したことを心配しないでください)

モジュールファイル:

ここに画像の説明を入力してください

(私はスキップ/etc/module.xmlregistration.phpます。ささいなことなので、ここで完全な例を見つけることができます。)

Block phpファイルから始めましょう:

Test \ Catalog \ Block \ Product \ View \ 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()、レジストリにアクセスするために、メソッドを実装してコンストラクタのコンテキストを変更する必要があります。

それでは、レイアウトファイルに移動しましょう。

Test / Catalog / 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>

そして最後にテンプレートファイル:

Test / Catalog / 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 2016年

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

したがって、を使用しMagento\Framework\RegistryBlockを達成する必要があります。Blockのサンプルは以下のとおりです。

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