Come posso ottenere il prodotto corrente in Magento2?


15

Sto cercando di recuperare gli attributi del prodotto corrente in un blocco in Magento 2. Posso ottenere un prodotto, come l'id 1:

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

Tuttavia, non so come ottenere l'ID del prodotto corrente. Come lo faccio?


puoi chiamare la funzione getProduct()inMagento\Catalog\Block\Product\View
xanka

dove vuoi ottenere il prodotto attuale?
Amit Bera

Sto aggiungendo un modulo per mostrare le specifiche (attributi) del prodotto in una scheda nella pagina del prodotto. Problema risolto tramite $ block-> getProduct () per risposta di Rahil Patel.
Tim Trampedach,

Si prega di controllare sotto i collegamenti mageplaza.com/how-get-current-product-category-magento-2.html È possibile ottenere il prodotto corrente tramite il registro. Grazie !!
Mukesh Prajapati,

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
Jai,

Risposte:


11

Per ottenere il prodotto corrente, uno dei modi consigliati è:

  1. Estendere o classe di uso del blocco: Magento\Catalog\Block\Product\View\AbstractView.
  2. Ottieni il prodotto usando: $block->getProduct()nel tuo file phtml.

6
Oppure puoi provare questo $ this -> _ coreRegistry-> register ('product'); anche!!
Rahil Patel,

# 2 funziona molto bene. Non so perché non sono riuscito a capirlo da solo. Grazie per l'aiuto!
Tim Trampedach,

Potresti aiutare a ottenere l'errore in load () per ottenere l'ID prodotto $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam,

@SachinS Fornisci maggiori dettagli in modo che io possa aiutarti.
Rahil Patel,

2
AbstractView inizia con A Magento \ Catalog \ Block \ Product \ View \ AbstractView
Patrick van Bergen

28

Sebbene le altre risposte siano corrette, non sono neanche la soluzione consigliata / corretta.

L'utilizzo dell'ObjectManager è assolutamente proibito in Magento 2. Quindi, per favore, non fare affidamento su questa soluzione, ma invece utilizzare DI adeguato. Per informazioni su come utilizzare DI in Magento 2, vedere questa risorsa: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

L'estensione di AbstractView non è necessaria. Se guardi la funzione originale in AbstractView, puoi vedere Magento usato il registro per recuperare il prodotto. Non è necessario estendere una classe specifica per fare ciò, è sufficiente iniettare Magento \ Framework \ Registry nel costruttore e richiedere l'elemento del registro "prodotto".

Esempio di codice 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();
    }

}

benvenuti a Magento SE. Se hai commenti su altre risposte, usa il link "aggiungi un commento" per farlo. Scrivi una risposta che sia autonoma il più possibile e non fare affidamento su altre risposte. Altre risposte potrebbero essere eliminate o potrebbero "scomparire" nelle aree inferiori della pagina.
7

@ 7ochem si scusa, ha detto che non mi era ancora permesso commentare, ecco perché l'ho fatto in questo modo, userò i commenti adeguati in futuro. :)
Wesley Vestjens il

Ho già un modulo e puoi per favore guidare come usare la tua funzione nel mio modulo attuale? E direi che la tua spiegazione è la migliore che devo implementare nel mio modulo. Grazie
Sharma,

Ciao Sharma, è difficile dire esattamente senza vedere il codice, ma l'idea rimane la stessa: nel tuo costruttore (quello con 2 caratteri di sottolineatura), aggiungi un nuovo argomento e inserisci Magento \ Framework \ Registry nel tuo blocco. Quindi, utilizzare il registro per ottenere il prodotto in questo modo: $ this-> product = $ this-> register-> register ('product');
Wesley Vestjens,

1
Il registro è obsoleto e al suo posto è necessario utilizzare il metodo di @ rafael-corrêa-gomes.
Christophe Ferreboeuf il

5

Se stai usando Magento 2.1 o versioni successive, puoi usarlo helperperché il vecchio metodo era obsoleto.

...
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 soluzione di @Wesley Vestjens ha funzionato anche per me. Assicurati di prestare attenzione al modificatore di accesso, poiché privato potrebbe non essere quello che desideri se stai usando getProduct()nel tuo modello. Nell'esempio sopra funziona come getProductName()è il metodo pubblico da usare.


In genere si consiglia di non assegnare interi oggetti a un modello, ma di passare invece i dati richiesti e nient'altro. Ecco perché getProduct()è privato ed getProductName()è pubblico. Nelle versioni più recenti di Magento (2.2 / 2.3 e successive) questi metodi sono anche considerati obsoleti e si dovrebbero usare invece Visualizza modelli.
Wesley Vestjens,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.