¿Cómo obtengo el producto actual en Magento2?

15

Estoy tratando de recuperar los atributos del producto actual en un bloque en Magento 2. Puedo obtener un producto, como id 1:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\ProductRepository')->getById(1);

Sin embargo, no sé cómo obtener la identificación del producto actual. ¿Cómo puedo hacer eso?

Tim Trampedach
fuente
puedes llamar a la función getProduct()enMagento\Catalog\Block\Product\View
xanka
¿Dónde quieres obtener el producto actual?
Amit Bera
Estoy agregando un módulo para mostrar las especificaciones (atributos) del producto en una pestaña en la página del producto. Problema resuelto a través de $ block-> getProduct () por respuesta de Rahil Patel.
Tim Trampedach
Consulte los enlaces a continuación mageplaza.com/how-get-current-product-category-magento-2.html Puede obtener el producto actual mediante el registro. Gracias !!
Mukesh Prajapati
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. - De la opinión
Jai

Respuestas:

11

Para obtener el producto actual, una de las formas recomendadas es:

  1. Ampliar o clase bloque de utilización: Magento\Catalog\Block\Product\View\AbstractView.
  2. Obtenga el producto usando: $block->getProduct()en su archivo phtml.
Rahil Patel
fuente
66
O puede probar este $ this -> _ coreRegistry-> registro ('producto'); ¡¡también!!
Rahil Patel
# 2 funciona muy bien. No estoy seguro de por qué no pude resolver eso yo mismo. ¡Gracias por tu ayuda!
Tim Trampedach
¿Podría ayudarme a obtener el error en load () para obtener la identificación del producto $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam
@SachinS Proporcione más detalles para que pueda ayudarlo.
Rahil Patel
2
AbstractView comienza con mayúscula A Magento \ Catálogo \ Bloque \ Producto \ Vista \ AbstractView
Patrick van Bergen
28

Aunque otras respuestas son correctas, tampoco son la solución recomendada / adecuada.

El uso del ObjectManager está absolutamente prohibido en Magento 2. Por lo tanto, no confíe en esta solución, sino que utilice la DI adecuada para lograrlo. Para aprender a usar DI en Magento 2, consulte este recurso: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

No es necesario extender AbstractView. Si observa la función original en AbstractView, puede ver que Magento utilizó el registro para obtener el producto. No necesita extender una clase específica para hacer esto, simplemente inyecte Magento \ Framework \ Registry en su constructor y solicite el elemento de registro "producto".

Ejemplo de código completo:

<?php

// Example = Module namespace, Module = module name, rest of the namespace is just for example only, change this to whatever it is in your case.
namespace Example\Module\Block\Frontend\Catalog\Product\General;

use Magento\Catalog\Model\Product;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Framework\View\Element\Template;

class Information extends Template
{

    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var Product
     */
    private $product;

    public function __construct(Template\Context $context,
                                Registry $registry,
                                array $data)
    {
        $this->registry = $registry;

        parent::__construct($context, $data);
    }


    /**
     * @return Product
     */
    private function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');

            if (!$this->product->getId()) {
                throw new LocalizedException(__('Failed to initialize product'));
            }
        }

        return $this->product;
    }

    public function getProductName()
    {
        return $this->getProduct()->getName();
    }

}
Wesley Vestjens
fuente
bienvenido a Magento SE. Si tiene comentarios sobre otras respuestas, utilice el enlace "agregar un comentario" para hacerlo. Por favor, escriba una respuesta que sea independiente tanto como sea posible y no confíe en otras respuestas. Es posible que se eliminen otras respuestas o que "desaparezcan" en las regiones inferiores de la página.
7ochem
@ 7ochem disculpas, decía que todavía no tenía permitido comentar, por eso lo hice así, usaré los comentarios adecuados en el futuro. :)
Wesley Vestjens
Ya tengo un módulo y ¿puede guiarme sobre cómo usar su función en mi módulo actual? Y diría que su explicación es la mejor que necesito implementar en mi módulo. Gracias
Sharma
Hola Sharma, es difícil decir exactamente sin ver el código, pero la idea sigue siendo la misma: en su constructor (el que tiene 2 guiones bajos), agregue un nuevo argumento e inyecte Magento \ Framework \ Registry en su bloque. Luego, use el registro para obtener el producto de esta manera: $ this-> product = $ this-> Registry-> Registry ('product');
Wesley Vestjens
1
El registro está en desuso y el método de @ rafael-corrêa-gomes tiene que usarse en su lugar.
Christophe Ferreboeuf
5

Si está utilizando Magento 2.1 o mayor, puede usar esto helperporque el método anterior estaba en desuso.

...
use Magento\Catalog\Helper\Data;
...

public function __construct(
        Context $context,
        Data $helper,
        array $data = []
    ){
        $this->context = $context;
        $this->helper = $helper;
        $this->data = $data;
        parent::__construct($context, $data);
    }

...

public function getProduct(){
    if(is_null($this->_product)){
        $this->_product = $this->helper->getProduct();
    }
    return $this->_product;
}
Rafael Corrêa Gomes
fuente
0

La solución de @Wesley Vestjens también funcionó para mí. Solo asegúrese de prestar atención al modificador de acceso, ya que privado podría no ser lo que desea si está utilizando getProduct()su plantilla. En el ejemplo anterior funciona como getProductName()es el método público a utilizar.

Joshua Fricke
fuente
En general, se recomienda no dar objetos completos a una plantilla, sino pasar los datos que requiere y nada más. Por eso getProduct()es privado y getProductName()público. En las versiones más recientes de Magento (2.2 / 2.3 y posteriores), estos métodos también se consideran obsoletos y en su lugar se deben usar los modelos de vista.
Wesley Vestjens el