Magento2: Adicione um modelo personalizado à página de detalhes do produto abaixo, seção adicionar ao carrinho

10

Estou tentando adicionar um modelo personalizado à página do produto na seção de compartilhamento social. No meu módulo eu tenho o seguinte código no arquivo de 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>

conteúdo social.phtml

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

Está funcionando bem e mostrando o conteúdo do modelo na página do produto. Quando estou usando a classe de bloco em Magento\Catalog\Block\Product\Viewvez de Magento\Framework\View\Element\Templatepoder obter o objeto do produto no meu modelo $block->getProduct();, ele mostra uma página em branco.

1. Que erro estou cometendo aqui?
2. Qual é a melhor maneira de modificar a página do produto?
3. Existe um arquivo de layout de referência que eu possa usar para adicionar novos modelos a qualquer seção da página do produto, escrevendo o código de layout no meu módulo?

amitshree
fonte
@amiteshree pode ser seu arquivo phtml inclui funções que são definidas no Magento \ Catalog \ Bloco \ Product \ Ver arquivo de bloco
Shaheer Ali
@ ShaheerAli: No meu arquivo phtml, estou tentando obter o objeto do produto usando $_product = $block->getProduct();quando estou usando o Magento\Catalog\Block\Product\Viewbloco.
amitshree
Então, por que você atribui o bloco Magento \ Framework \ View \ Element \ Template ao seu modelo?
Shaheer Ali 22/01
1
@amiteshree se você quiser usar as funções de visualização do produto, precisará atribuir Magento \ Catalog \ Block \ Product \ View ao seu template phtml. E seu método de adição de modelo personalizado à página do produto está correta
Shaheer Ali
1
Página em branco geralmente significa que ocorreu algum erro. Você olhou no seu error.log? log de exceções magento? Que modo você usa?
Anton Kril

Respostas:

24

O erro "página em branco" vem porque Magento\Framework\View\Element\Templatenão possui um getProduct()método.

Então, acho que a maneira "mais limpa" de fazer isso é criar um módulo personalizado com um bloco, layout e modelo personalizados (não se preocupe, isso leva apenas alguns minutos e você já fez algumas partes)

Arquivos de módulo:

insira a descrição da imagem aqui

(Eu vou pular /etc/module.xmle registration.phppor ser trivial, no entanto, você pode encontrar o exemplo completo aqui .)

Vamos começar com o arquivo php Block:

Teste \ Catálogo \ Bloco \ Produto \ Visualização \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Como você pode ver, é apenas uma classe concreta que estende (IMO) o bloco de resumo de produtos mais leve. Você também pode estender, Magento\Framework\View\Element\Templatemas, nesse caso, precisará implementar o getProduct()método e alterar o contexto no construtor para obter acesso ao registro.

Então, vamos para o arquivo Layout:

Teste / Catálogo / Visualizar / 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 finalmente o arquivo de modelo:

Teste / catálogo / 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>

Como você pode ver, é bem direto, mais simples que o M1-

Lembre-se de que toda a sua lógica personalizada deve ser implementada na Extra.phpclasse de blocos para manter a visualização limpa.

ou seja:

Na classe Extra.php :

public function getSomething()
{
    return 'something'
}

na visualização extra.phtml :

<?php echo $block->getSomething() ?>
MauroNigrele
fonte
2
Portanto, o layout catalog_product_view.xml do meu módulo é carregado automaticamente quando estou na página do produto?
amitshree
2
Absolutamente! é muito semelhante ao M1, mas agora todo identificador está em um arquivo separado.
MauroNigrele 27/01
5

Um suplemento para a resposta aceita

A resposta aceita é boa, mas agora AbstractProductestá 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

Então, temos que usar o Magento\Framework\Registrypara alcançar o bloco , a amostra do bloco está abaixo:

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