Comment obtenir le produit actuel dans Magento2?


15

J'essaie de récupérer les attributs du produit actuel dans un bloc dans Magento 2. Je peux obtenir un produit, comme l'id 1:

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

Je ne sais pas comment obtenir l'ID du produit actuel. Comment je fais ça?


vous pouvez appeler la fonction getProduct()dansMagento\Catalog\Block\Product\View
xanka

où voulez-vous obtenir le produit actuel?
Amit Bera

J'ajoute un module pour afficher les spécifications du produit (attributs) dans un onglet sur la page du produit. Problème résolu via $ block-> getProduct () par réponse de Rahil Patel.
Tim Trampedach

Veuillez vérifier les liens ci-dessous mageplaza.com/how-get-current-product-category-magento-2.html Vous pouvez obtenir le produit actuel en utilisant le registre. Merci !!
Mukesh Prajapati

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change. - De l'avis
Jai

Réponses:


11

Afin d'obtenir le produit actuel, l'un des moyens recommandés est:

  1. Étendre ou classe bloc d'utilisation: Magento\Catalog\Block\Product\View\AbstractView.
  2. Obtenez le produit en utilisant: $block->getProduct()dans votre fichier phtml.

6
Ou vous pouvez essayer ceci $ this -> _ coreRegistry-> Registry ('product'); ainsi que!!
Rahil Patel

# 2 fonctionne très bien. Je ne sais pas pourquoi je n'ai pas pu comprendre cela moi-même. Merci de votre aide!
Tim Trampedach

Pourriez-vous m'aider à obtenir l'erreur dans load () pour obtenir l'ID de produit $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam

@SachinS Veuillez fournir plus de détails afin que je puisse vous aider.
Rahil Patel

2
AbstractView commence par une majuscule A Magento \ Catalogue \ Block \ Product \ View \ AbstractView
Patrick van Bergen

29

Bien que d'autres réponses soient correctes, elles ne sont pas non plus la solution recommandée / appropriée.

L'utilisation de l'ObjectManager est absolument interdite dans Magento 2. Veuillez donc ne pas vous fier à cette solution, mais utilisez plutôt une DI appropriée pour y parvenir. Pour savoir comment utiliser DI dans Magento 2, consultez cette ressource: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Il n'est pas nécessaire d'étendre AbstractView. Si vous regardez la fonction d'origine dans AbstractView, vous pouvez voir que Magento a utilisé le registre pour récupérer le produit. Vous n'avez pas besoin d'étendre une classe spécifique pour ce faire, injectez simplement Magento \ Framework \ Registry dans votre constructeur et demandez l'élément de registre "produit".

Exemple de code complet:

<?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();
    }

}

bienvenue à Magento SE. Si vous avez des commentaires sur d'autres réponses, veuillez utiliser le lien "ajouter un commentaire" pour le faire. S'il vous plaît, écrivez une réponse qui se démarque autant que possible et ne vous fiez pas à d'autres réponses. D'autres réponses peuvent être supprimées ou «disparaître» dans les régions inférieures de la page.
7ochem

@ 7ochem excuses, il a dit que je n'étais pas encore autorisé à commenter, c'est pourquoi je l'ai fait comme ça, je vais utiliser les commentaires appropriés à l'avenir. :)
Wesley Vestjens

J'ai déjà un module et pouvez-vous s'il vous plaît guider comment utiliser votre fonction dans mon module actuel? ET je dirais que votre explication est la meilleure que je dois implémenter dans mon module. Merci
Sharma

Salut Sharma, il est difficile de dire exactement sans voir le code, mais l'idée reste la même: dans votre constructeur (celui avec 2 traits de soulignement), ajoutez un nouvel argument et injectez Magento \ Framework \ Registry dans votre bloc. Ensuite, utilisez le registre pour obtenir le produit comme ceci: $ this-> product = $ this-> Registry-> Registry ('product');
Wesley Vestjens

2
Le registre est obsolète et la méthode de @ rafael-corrêa-gomes doit être utilisée à la place.
Christophe Ferreboeuf

5

Si vous utilisez Magento 2.1 ou majeur, vous pouvez l'utiliser helpercar l'ancienne méthode était obsolète.

...
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;
}

0

La solution @Wesley Vestjens a également fonctionné pour moi. Assurez-vous simplement de prêter attention au modificateur d'accès, car privé peut ne pas être ce que vous voulez si vous utilisez getProduct()dans votre modèle. Dans l'exemple ci-dessus, cela fonctionne comme getProductName()la méthode publique à utiliser.


Il est généralement recommandé de ne pas donner des objets entiers à un modèle, mais de transmettre à la place les données dont il a besoin et rien de plus. C'est pourquoi getProduct()est privé et getProductName()public. Dans les versions plus récentes de Magento (2.2 / 2.3 et suivantes), ces méthodes sont également considérées comme obsolètes et les modèles de vue doivent être utilisés à la place.
Wesley Vestjens
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.