Magento2: Aggiungi modello personalizzato alla pagina dei dettagli del prodotto in basso Aggiungi alla sezione carrello


10

Sto cercando di aggiungere un modello personalizzato alla pagina del prodotto nella sezione di condivisione social. Nel mio modulo ho seguito il codice nel file di 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>

contenuto di social.phtml

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

Funziona bene e mostra il contenuto del modello nella pagina del prodotto. Quando sto usando la classe a blocchi Magento\Catalog\Block\Product\Viewinvece Magento\Framework\View\Element\Templateche in modo da poter ottenere l'oggetto prodotto nel mio modello usando $block->getProduct();, mostra una pagina vuota.

1. Che errore sto facendo qui?
2. Qual è il modo migliore per modificare la pagina del prodotto?
3. Esiste un file di layout di riferimento che posso utilizzare per aggiungere nuovi modelli a qualsiasi sezione della pagina del prodotto che scrive il codice del layout nel mio modulo?


@amiteshree potrebbe essere il tuo file phtml che include funzioni definite in Magento \ Catalog \ Block \ Product \ View file di blocco
Shaheer Ali

@ShaheerAli: Nel mio file phtml sto cercando di ottenere l'oggetto prodotto usando $_product = $block->getProduct();quando sto usando il Magento\Catalog\Block\Product\Viewblocco.
amitshree

Quindi perché stai assegnando il blocco Magento \ Framework \ View \ Element \ Template al tuo modello.
Shaheer Ali,

1
@amiteshree se si desidera utilizzare le funzioni di visualizzazione del prodotto, è necessario assegnare Magento \ Catalog \ Block \ Product \ View al phtml del modello. E il tuo metodo per aggiungere un modello personalizzato alla pagina del prodotto è corretto
Shaheer Ali,

1
Pagina vuota di solito significa che si è verificato un errore. Hai cercato nel tuo error.log? registro eccezioni magento? Quale modalità usi?
Anton Kril,

Risposte:


24

L'errore "pagina bianca" arriva perché Magento\Framework\View\Element\Templatenon hanno un getProduct()metodo.

Quindi penso che il modo "più pulito" per farlo sia creare un modulo personalizzato con un blocco, layout e template personalizzati (non preoccuparti, ti bastano pochi minuti e hai fatto alcune parti)

File del modulo:

inserisci qui la descrizione dell'immagine

(Salterò /etc/module.xmle registration.phpperché sono banali, tuttavia puoi trovare l'esempio completo qui .)

Cominciamo con il file Block php:

Test \ Catalog \ Blocco \ prodotto \ Visualizza \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Come puoi vedere, è solo una classe concreta che estende (IMO) il blocco di prodotto più leggero. Puoi anche estenderlo, Magento\Framework\View\Element\Templatema in tal caso dovrai implementare il getProduct()metodo e cambiare il contesto nel costruttore per ottenere l'accesso al registro.

Passiamo quindi al file Layout:

Test / Catalogo / vedere / 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>

E infine il file modello:

Test / Catalogo / view / frontend / templates / prodotto / 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>

Come puoi vedere è piuttosto semplice, più semplice di M1-

Ricorda che tutta la logica personalizzata deve essere implementata nella Extra.phpclasse di blocco per mantenere pulita la vista.

vale a dire:

Nella classe Extra.php :

public function getSomething()
{
    return 'something'
}

nella vista extra.phtml :

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

2
Quindi il layout catalog_product_view.xml del mio modulo si carica automaticamente quando sono sulla pagina del prodotto?
amitshree

2
Assolutamente! è molto simile a M1 ma ora ogni handle è in un file separato.
MauroNigrele,

5

Un supplemento per la risposta accettata

La risposta accettata è buona, ma ora AbstractProductè obsoleta .

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

Quindi, dobbiamo usare il Magento\Framework\Registryper ottenere il blocco , l'esempio di blocco è di seguito:

<?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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.