Magento2: agregue una plantilla personalizada a la página de detalles del producto a continuación, agregue a la sección del carrito

10

Estoy tratando de agregar una plantilla personalizada a la página del producto en la sección de redes sociales. En mi módulo tengo el siguiente código en el archivo de diseño 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>

contenido social.phtml

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

Está funcionando bien y muestra el contenido de la plantilla en la página del producto. Cuando estoy usando la clase de bloque en Magento\Catalog\Block\Product\Viewlugar de Magento\Framework\View\Element\Templatepara poder usar el objeto del producto en mi plantilla $block->getProduct();, muestra una página en blanco.

1. ¿Qué error estoy haciendo aquí?
2. ¿Cuál es la mejor manera de modificar la página del producto?
3. ¿Hay un archivo de diseño de referencia que pueda usar para agregar nuevas plantillas a cualquier sección del código de diseño de escritura de la página del producto en mi módulo?

amitshree
fuente
@amiteshree puede ser su archivo phtml que incluye funciones que están definidas en Magento \ Catálogo \ Bloque \ Producto \ Ver archivo de bloque
Shaheer Ali
@ShaheerAli: en mi archivo phtml estoy tratando de usar el objeto del producto $_product = $block->getProduct();cuando estoy usando el Magento\Catalog\Block\Product\Viewbloque.
amitshree
Entonces, ¿por qué asigna el bloque Magento \ Framework \ View \ Element \ Template a su plantilla?
Shaheer Ali
1
@amiteshree si desea utilizar las funciones de vista del producto, entonces debe asignar Magento \ Catalog \ Block \ Product \ View a su plantilla phtml. Y su método para agregar una plantilla personalizada a la página del producto es correcto
Shaheer Ali,
1
La página en blanco generalmente significa que ocurrió algún error. ¿Buscaste en tu error.log? registro de excepciones de magento? ¿Qué modo usas?
Anton Kril el

Respuestas:

24

El error de "página blanca" viene porque Magento\Framework\View\Element\Templateno tiene un getProduct()método.

Así que creo que la forma "más limpia" de hacerlo es crear un módulo personalizado con un bloque, diseño y plantilla personalizados (no se preocupe, esto solo toma unos minutos y ya ha hecho algunas partes)

Archivos del módulo:

ingrese la descripción de la imagen aquí

(Saltaré /etc/module.xmly registration.phpporque son triviales, sin embargo, puedes encontrar el ejemplo completo aquí ).

Comencemos con el archivo Block php:

Prueba \ Catálogo \ Bloque \ Producto \ Ver \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

Como puede ver, es solo una clase concreta que extiende (IMO) el bloque de resumen de producto más liviano. También puede extender, Magento\Framework\View\Element\Templatepero en ese caso deberá implementar el getProduct()método y cambiar el contexto en el constructor para obtener acceso al registro.

Así que pasemos al archivo de diseño:

Prueba / Catálogo / 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>

Y finalmente el archivo de plantilla:

Prueba / 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 puede ver es bastante sencillo, más simple que M1-

Recuerde que toda su lógica personalizada debe implementarse en la Extra.phpclase de bloque para mantener limpia la vista.

es decir:

En la clase Extra.php :

public function getSomething()
{
    return 'something'
}

en la vista extra.phtml :

<?php echo $block->getSomething() ?>
MauroNigrele
fuente
2
Entonces, ¿el diseño de catalog_product_view.xml de mi módulo se carga automáticamente cuando estoy en la página del producto?
amitshree
2
Absolutamente! es muy similar a M1 pero ahora cada identificador está en un archivo separado.
MauroNigrele
5

Un suplemento para la respuesta aceptada

La respuesta aceptada es buena, pero ahora AbstractProductestá en desuso .

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

Entonces, tenemos que usar el Magento\Framework\Registrypara lograr el Bloque , la muestra del Bloque está a continuación:

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