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\View
vez de Magento\Framework\View\Element\Template
poder 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?
$_product = $block->getProduct();
quando estou usando oMagento\Catalog\Block\Product\View
bloco.Respostas:
O erro "página em branco" vem porque
Magento\Framework\View\Element\Template
não possui umgetProduct()
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:
(Eu vou pular
/etc/module.xml
eregistration.php
por ser trivial, no entanto, você pode encontrar o exemplo completo aqui .)Vamos começar com o arquivo php Block:
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\Template
mas, nesse caso, precisará implementar ogetProduct()
método e alterar o contexto no construtor para obter acesso ao registro.Então, vamos para o arquivo Layout:
E finalmente o arquivo de modelo:
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.php
classe de blocos para manter a visualização limpa.ou seja:
fonte
Um suplemento para a resposta aceita
A resposta aceita é boa, mas agora
AbstractProduct
está obsoleta .Então, temos que usar o
Magento\Framework\Registry
para alcançar o bloco , a amostra do bloco está abaixo:fonte