Magento2: Aşağıdaki ürün detayları sayfasına özel şablon ekle Sepete ekle bölümüne


10

Sosyal paylaşım bölümü altında ürün sayfasına özel şablon eklemeye çalışıyorum. Modülümde default.xml mizanpaj dosyasındaki kodu izledim

 <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 içeriği

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

İyi çalışıyor ve şablon içeriğini ürün sayfasında gösteriyor. Şablon nesnesini kullanarak ürün nesnesini alabilmek için blok sınıfı Magento\Catalog\Block\Product\Viewkullandığımda boş bir sayfa gösteriyor. 1. Burada ne hata yapıyorum? 2. Ürün sayfasını değiştirmenin en iyi yolu nedir? 3. Modülümde ürün kodu yazma düzeni kodunun herhangi bir bölümüne yeni şablonlar eklemek için kullanabileceğim bir referans mizanpaj dosyası var mı?Magento\Framework\View\Element\Template$block->getProduct();




@amiteshree phtml dosyanız Magento \ Katalog \ Blok \ Ürün \ Blok dosyasını görüntüle
Shaheer Ali

@ShaheerAli: Benim phtml dosyasında kullanıyorum ürün nesneyi almaya çalışıyorum $_product = $block->getProduct();kullanıyorum zaman Magento\Catalog\Block\Product\Viewbloğu.
amitshree

Öyleyse neden şablonunuza Magento \ Framework \ View \ Element \ Template bloğunu atasınız?
Shaheer Ali

1
@amiteshree Ürün görünümü işlevlerini kullanmak istiyorsanız şablon phtml'nize Magento \ Catalogue \ Block \ Product \ View atamanız gerekir. Ve ürün sayfasına özel şablon ekleme yönteminiz doğru
Shaheer Ali

1
Boş sayfa genellikle bazı hataların meydana geldiği anlamına gelir. Error.log dosyasına baktınız mı? magento istisnalar günlüğü? Hangi modu kullanıyorsunuz?
Anton Kril

Yanıtlar:


24

"Beyaz sayfa" hatası Magento\Framework\View\Element\Templatebir getProduct()yöntem olmadığı için gelir .

Bu yüzden bunu yapmak için "temiz" yolu özel bir blok, düzen ve şablon ile özel bir modül oluşturmak olduğunu düşünüyorum (bu sadece birkaç dakika sürer endişelenmeyin ve bazı parçalar yaptık)

Modül Dosyaları:

resim açıklamasını buraya girin

(Atlayacağım /etc/module.xmlve registration.phpönemsiz olduğu için tam örneği burada bulabilirsiniz .)

Block php dosyası ile başlayalım:

Testi \ Katalog \ Blok \ Ürün \ Görünüm \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Gördüğünüz gibi, sadece en hafif Ürün Özet Bloğunu genişleten somut bir sınıf (IMO). Ayrıca genişletebilirsiniz, Magento\Framework\View\Element\Templateancak bu durumda getProduct()kayıt defterine erişmek için yöntemi uygulamanız ve yapıcıdaki içeriği değiştirmeniz gerekir .

Şimdi Layout dosyasına geçelim:

Testi / Katalog / görüntülemek / kullanıcı arayüzü / düzeni / 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>

Ve son olarak şablon dosyası:

Testi / Katalog / görünüm / kullanıcı arayüzü / templates / ürün / görünüm / 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>

Gördüğünüz gibi oldukça basit, M1-

Extra.phpGörünümü temiz tutmak için tüm özel mantığınızın blok sınıfında uygulanması gerektiğini unutmayın .

yani:

In Extra.php sınıfında:

public function getSomething()
{
    return 'something'
}

içinde extra.phtml görünümü:

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

2
Ürün sayfamdayken modülümün catalog_product_view.xml düzeni otomatik olarak yükleniyor mu?
amitshree

2
Absolutly! M1'e çok benzer, ancak şimdi her tanıtıcı ayrı bir dosyada.
MauroNigrele

5

Kabul Edilen Cevap için Ek

Kabul cevap iyidir, ama AbstractProductbir kullanımdan kaldırıldı şimdi.

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

Demek ki kullanmak zorunda Magento\Framework\Registryelde etmek Blok , Blok örnek aşağıda verilmiştir:

<?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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.