Magento2: Tambahkan templat khusus ke halaman detail produk di bawah ini, tambahkan ke bagian keranjang

10

Saya mencoba menambahkan templat khusus ke halaman produk di bawah bagian berbagi sosial. Dalam modul saya, saya sudah mengikuti kode dalam file layout 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>

konten social.phtml

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

Ini berfungsi dengan baik dan menampilkan konten template di halaman produk. Ketika saya menggunakan kelas blok Magento\Catalog\Block\Product\Viewalih-alih Magento\Framework\View\Element\Templateagar saya bisa mendapatkan objek produk dalam templat saya gunakan $block->getProduct();, itu menunjukkan halaman kosong.

1. Kesalahan apa yang saya lakukan di sini?
2. Apa cara terbaik untuk memodifikasi halaman produk?
3. Apakah ada file tata letak referensi yang dapat saya gunakan untuk menambahkan template baru ke bagian mana pun dari kode tata letak halaman produk dalam modul saya?

amitshree
sumber
@amiteshree mungkin file phtml Anda mencakup fungsi-fungsi yang didefinisikan dalam file blok Magento \ Catalog \ Block \ Product \ View
Shaheer Ali
@ShaheerAli: Dalam file phtml saya, saya mencoba untuk mendapatkan objek produk menggunakan $_product = $block->getProduct();ketika saya menggunakan Magento\Catalog\Block\Product\Viewblok.
amitshree
Lalu mengapa Anda menetapkan blok Magento \ Framework \ View \ Element \ Template ke template Anda.
Shaheer Ali
1
@amiteshree jika Anda ingin menggunakan fungsi tampilan produk maka Anda perlu menetapkan Magento \ Catalog \ Block \ Product \ View ke phtml templat Anda. Dan metode Anda menambahkan template khusus ke halaman produk sudah benar
Shaheer Ali
1
Halaman kosong biasanya berarti, beberapa kesalahan terjadi. Apakah Anda melihat di error.log Anda? log pengecualian Magento? Mode apa yang Anda gunakan?
Anton Kril

Jawaban:

24

Kesalahan "halaman putih" muncul karena Magento\Framework\View\Element\Templatetidak memiliki getProduct()metode.

Jadi saya pikir cara "terbersih" untuk melakukannya adalah membuat modul khusus dengan blok, tata letak, dan template khusus (jangan khawatir ini hanya perlu beberapa menit dan Anda telah melakukan beberapa bagian)

File Modul:

masukkan deskripsi gambar di sini

(Saya akan melewati /etc/module.xmldan registration.phpkarena sepele, namun Anda dapat menemukan contoh lengkap di sini .)

Mari kita mulai dengan file Block php:

Tes \ Katalog \ Blok \ Produk \ Lihat \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Seperti yang dapat Anda lihat, itu hanya kelas beton perluasan (IMO) Blok Abstrak Produk paling ringan. Anda juga dapat memperluas Magento\Framework\View\Element\Templatetetapi dalam hal ini Anda harus menerapkan getProduct()metode dan mengubah konteks dalam konstruktor untuk mendapatkan akses ke registri.

Jadi mari kita pindah ke file Layout:

Tes / Katalog / tampilan / tampilan depan / tata letak / 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>

Dan akhirnya file templat:

Tes / Katalog / view / frontend / templates / produk / 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>

Seperti yang Anda lihat adalah sangat mudah, paling sederhana dari M1-

Ingat bahwa semua logika khusus Anda harus diimplementasikan di Extra.phpkelas blok agar tampilan tetap bersih.

yaitu:

Di kelas Extra.php :

public function getSomething()
{
    return 'something'
}

dalam tampilan extra.phtml :

<?php echo $block->getSomething() ?>
MauroNigrele
sumber
2
Jadi layout module_product_view.xml modul saya dimuat secara otomatis ketika saya berada di halaman produk?
amitshree
2
Benar-benar! ini sangat mirip dengan M1 tetapi sekarang setiap pegangan ada dalam file yang terpisah.
MauroNigrele
5

Tambahan untuk Jawaban yang Diterima

Jawaban yang diterima baik, tetapi AbstractProductsudah usang sekarang.

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

Jadi, kita harus menggunakan Magento\Framework\Registryuntuk mencapai Blok , sampel Blok di bawah ini:

<?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;
    }
}
Key Shang
sumber