Como obtenho o produto atual no Magento2?

15

Estou tentando recuperar os atributos do produto atual em um bloco no Magento 2. Posso obter um produto, como o id 1:

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

Não sei como obter o ID do produto atual. Como faço isso?

Tim Trampedach
fonte
u pode chamar a função getProduct()emMagento\Catalog\Block\Product\View
xanka
Onde você deseja obter o produto atual?
Amit Bera
Estou adicionando um módulo para mostrar as especificações (atributos) do produto em uma guia na página do produto. Problema resolvido através de $ block-> getProduct () por resposta de Rahil Patel.
Tim Trampedach
Por favor, verifique os links abaixo mageplaza.com/how-get-current-product-category-magento-2.html Você pode obter produtos atuais usando o Registro. Obrigado !!
Mukesh Prajapati
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Do comentário
Jai

Respostas:

11

Para obter o produto atual, uma das maneiras recomendadas é:

  1. Estenda ou use a classe de bloco: Magento\Catalog\Block\Product\View\AbstractView .
  2. Obtenha o produto usando: $block->getProduct()no seu arquivo phtml.
Rahil Patel
fonte
6
Ou você pode tentar este $ this -> _ coreRegistry-> registry ('product'); também!!
Rahil Patel
# 2 funciona muito bem. Não sei por que eu não conseguia descobrir isso sozinho. Obrigado pela ajuda!
Tim Trampedach
Você poderia ajudar quanto a obter o erro em load () para obter o ID do produto $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Fornecedor \ Módulo \ Modelo \ Fila') -> load ($ productId);
Sushivam
@SachinS Forneça mais detalhes para que eu possa ajudá-lo.
Rahil Patel
2
AbstractView começa com A maiúsculo Magento \ Catalog \ Bloco \ Product \ Ver \ AbstractView
Patrick van Bergen
28

Embora outras respostas estejam corretas, elas também não são a solução recomendada / adequada.

O uso do ObjectManager é absolutamente proibido no Magento 2. Portanto, não confie nesta solução, mas use o DI adequado para isso. Para aprender como usar o DI no Magento 2, consulte este recurso: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Não é necessário estender o AbstractView. Se você observar a função original no AbstractView, poderá ver que o Magento usou o registro para buscar o produto. Você não precisa estender uma classe específica para fazer isso, basta injetar o Magento \ Framework \ Registry em seu construtor e solicitar o item de registro "produto".

Exemplo 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
fonte
bem-vindo ao Magento SE. Se você tiver comentários sobre outras respostas, use o link "adicionar um comentário" para fazer isso. Escreva uma resposta que seja autônoma o máximo possível e não dependa de outras respostas. Outras respostas podem ser excluídas ou podem "desaparecer" nas regiões inferiores da página.
7ochem 28/11
Desculpas @ 7ochem, disse que eu não tinha permissão para comentar ainda, é por isso que eu fiz assim, vou usar os comentários adequados no futuro. :)
Wesley Vestjens
Eu já tenho um módulo e você pode orientar como usar sua função no meu módulo atual? E eu diria que você é a melhor explicação que eu preciso implementar no meu módulo. Obrigado
Sharma
Olá Sharma, é difícil dizer exatamente sem ver o código, mas a idéia permanece a mesma: em seu construtor (aquele com 2 sublinhados), adicione um novo argumento e injete o Magento \ Framework \ Registry em seu bloco. Em seguida, use o registro para obter o produto assim: $ this-> product = $ this-> registry-> registry ('product');
Wesley Vestjens
11
O registro está obsoleto e o método @ rafael-corrêa-gomes deve ser usado.
Christophe Ferreboeuf 26/04/19
5

Se você estiver usando o Magento 2.1 ou maior, poderá usá-lo helperporque o método antigo foi preterido.

...
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
fonte
0

A solução @Wesley Vestjens também funcionou para mim. Apenas preste atenção ao modificador de acesso, pois o privado pode não ser o que você deseja se estiver usando getProduct()no seu modelo. No exemplo acima, ele funciona como getProductName()é o método público a ser usado.

Joshua Fricke
fonte
Geralmente, é recomendável não fornecer objetos inteiros a um modelo, mas transmitir os dados necessários e nada mais. É por isso que getProduct()é privado e getProductName()público. Nas versões mais recentes do Magento (2.2 / 2.3 e posteriores), esses métodos também são considerados obsoletos e o View Models deve ser usado.
Wesley Vestjens 23/03/19