Magento2: Dodaj szablon niestandardowy do strony ze szczegółami produktu poniżej sekcji Dodaj do koszyka


10

Próbuję dodać niestandardowy szablon do strony produktu w sekcji udostępniania społecznościowego. W moim module śledzę kod w pliku układu 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>

zawartość social.phtml

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

Działa dobrze i wyświetla zawartość szablonu na stronie produktu. Gdy Magento\Catalog\Block\Product\Viewzamiast klasy używam klasy bloku, Magento\Framework\View\Element\Templateaby uzyskać obiekt produktu w moim szablonie $block->getProduct();, wyświetla pustą stronę.

1. Jaki błąd tutaj popełniam?
2. Jaki jest najlepszy sposób modyfikacji strony produktu?
3. Czy istnieje plik układu odniesienia, którego mogę użyć, aby dodać nowe szablony do dowolnej sekcji kodu układu strony produktu piszącego w moim module?


@amiteshree może być twój plik phtml zawiera funkcje zdefiniowane w Magento \ Catalog \ Block \ Product \ View plik bloku
Shaheer Ali

@ShaheerAli: W moim pliku phtml próbuję uzyskać obiekt produktu przy $_product = $block->getProduct();użyciu Magento\Catalog\Block\Product\Viewbloku.
amitshree

Dlaczego więc przypisujesz do szablonu blok Magento \ Framework \ View \ Element \ Template.
Shaheer Ali

1
@amiteshree, jeśli chcesz korzystać z funkcji widoku produktu, musisz przypisać Magento \ Catalog \ Block \ Product \ View do szablonu phtml. A Twoja metoda dodawania niestandardowego szablonu do strony produktu jest poprawna
Shaheer Ali

1
Pusta strona zwykle oznacza, że ​​wystąpił błąd. Czy zajrzałeś do error.log? logi wyjątków Magento? Z jakiego trybu korzystasz?
Anton Kril,

Odpowiedzi:


24

Pojawia się błąd „białej strony”, ponieważ Magento\Framework\View\Element\Templatenie ma getProduct()metody.

Myślę więc, że „najczystszym” sposobem na to jest stworzenie niestandardowego modułu z niestandardowym blokiem, układem i szablonem (nie martw się, poświęć kilka minut i wykonałeś kilka części)

Pliki modułów:

wprowadź opis zdjęcia tutaj

(Pominę /etc/module.xmli registration.phpponieważ są trywialne, jednak pełny przykład znajdziesz tutaj ).

Zacznijmy od pliku 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
{

}

Jak widać, jest to tylko konkretna klasa rozszerzająca (IMO) najlżejszy blok abstraktów produktów. Możesz także rozszerzyć, Magento\Framework\View\Element\Templateale w takim przypadku musisz zaimplementować getProduct()metodę i zmienić kontekst w konstruktorze, aby uzyskać dostęp do rejestru.

Przejdźmy więc do pliku układu:

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>

I wreszcie plik szablonu:

Test / Katalog / widok / frontend / szablony / produkt / widok / 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>

Jak widać, jest dość prosty, najprostszy niż M1-

Pamiętaj, że cała twoja niestandardowa logika powinna zostać zaimplementowana w Extra.phpklasie bloków, aby utrzymać widok w czystości.

to znaczy:

W klasie Extra.php :

public function getSomething()
{
    return 'something'
}

w widoku extra.phtml :

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

2
Więc układ catalog_product_view.xml mojego modułu ładuje się automatycznie, gdy jestem na stronie produktu?
amitshree

2
Absolutnie! jest bardzo podobny do M1, ale teraz każdy uchwyt znajduje się w osobnym pliku.
MauroNigrele

5

Suplement do zaakceptowanej odpowiedzi

Przyjęta odpowiedź jest dobra, ale teraz AbstractProductjest przestarzała .

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

Musimy więc użyć Magento\Framework\Registrydo osiągnięcia bloku , próbka bloku jest poniżej:

<?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;
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.