Come caricare il prodotto SKU in magento 2


29

È piuttosto semplice, ma non riesco a trovare un esempio funzionante su Stackexchange o Google. Voglio caricare un prodotto da un aiutante o un blocco. Ho già provato alcune cose come:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$product = $objectManager->create('\Magento\Catalog\Api\Data\ProductInterface');

$product->get('<SKU>');

$product->getName();

Questo non restituisce nulla. Ho anche provato a caricare tutti i modelli e le API disponibili, ma nulla sembra funzionare con gli SKU.

Risposte:


56

Il modo corretto, secondo i contratti di servizio di Magento 2, sta usando i repository:

$product = $this->productRepositoryInterface->get($sku);

Usa Magento\Catalog\Api\ProductRepositoryInterfaceper ottenerlo nel tuo costruttore.

Esempio completo:

...
private $productRepository; 
...
public function __construct(
    ...
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
    ...
) {
    ...
    $this->productRepository = $productRepository;
    ...
}

public function loadMyProduct($sku)
{
    return $this->productRepository->get($sku);
}
...

Nota:

Se il prodotto non esiste, questo metodo attiva un NoSuchEntityExceptionerrore come sarebbe nella migliore pratica di Magento2.

Quindi, se devi gestirlo in qualche modo, avvolgilo in un blocco try / catch.


9
Questo metodo genera un errore quando non viene trovato alcun prodotto. Quindi, per verificare se esiste un prodotto, sembra che la soluzione di @ fschmengler potrebbe essere la strada migliore da percorrere.
Dennis van Schaik,

1
potete aggiungere ulteriori dettagli su Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Cosa devo fare? Grazie mille
davideghz,

Vedi il mio post aggiornato
Phoenix128_RiccardoT

L'attuale modo corretto di Magento 2 di utilizzare i contratti di assistenza è più complicato. Repository-> get () è ancora una chiamata modello che non dovrebbe essere utilizzata. Il modo corretto è usare repository-> getList () con SearchCriteriaBuilder. Vedi la mia risposta sugli ordini (praticamente lo stesso metodo): magento.stackexchange.com/questions/140374/…
Jacques

1
@JaccoAmersfoort, confermo che "get" è la strada giusta. Nel tuo esempio è stato suggerito perché "get" nel repository order richiede "id ordine" e quell'utente stava cercando "id incremento". In tal caso, getList è l'opzione migliore, ma se puoi usare "get" dovresti usarlo.
Phoenix128_RiccardoT

27

Invece di utilizzare direttamente il gestore oggetti, iniettare ProductFactory:

public function __construct(\Magento\Catalog\Model\ProductFactory $productFactory)
{
    $this->productFactory = $productFactory;
}

Quindi usalo in questo modo:

$product = $this->productFactory->create();
$product->loadByAttribute('sku', $sku);

o per fare un pieno carico (quanto sopra lo carica usando una raccolta):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));

7
In realtà mentre continua a funzionare, l'utilizzo load()e le raccolte sono il modo "Magento 1", utilizzare meglio il repository come suggerito da @RiccardoT.
Fabian Schmengler,

1
Inoltre, il metodo restituirà un modello di prodotto , mentre l'utilizzo del repository fornisce un modello di dati del prodotto ( Api/Data/Product), che è un modello di prodotto convertito in un DTO minimizzato. Qualcosa da considerare, poiché sono abbastanza diversi.
nevvermind,

@FabianSchmengler: ho provato a utilizzare $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()per visualizzare l'immagine di anteprima del prodotto, ma non funziona.
Slimshadddyyy

@FabianSchmengler sì, la raccomandazione di Repository è buona come risposta @RiccardoT. ma cosa succede se ho inserito sku sbagliato allora interromperà l'intera operazione e genererà un'eccezione, quindi in questo caso dobbiamo dipendere daproductFactory
Himanshu

@Himanshu cattura l'eccezione. E se hai bisogno di una nuova istanza di prodotto in quel caso, puoi comunque crearla usando la fabbrica
Fabian Schmengler,

7

Mi piace la risposta di @ phoenix128-riccardot, ma aggiungerei un'eccezione, nel caso in cui il prodotto non esista:

provare {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // inserisci qui la tua gestione degli errori
}

Non sono stato in grado di aggiungerlo come commento (reputazione troppo bassa), scusa.


4

Puoi provarlo

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');
$productObj = $productRepository->get('<SKU>');

echo $productObj->getId();

3

Prova questo:

/** @var \Magento\Catalog\Model\ProductFactory $productFactory */
$product = $productFactory->create();
$product->loadByAttribute('sku', 'my sku');

// $product->load($product->getId()); // may need to do this too,
// see \Magento\Framework\Api\AttributeValueFactory\AbstractModel::loadByAttribute

Ho bisogno di ottenere il product_id da sku (colonna di csv) durante l'importazione csv e salvare solo il product_id..Come ottenere?
Sushivam,

0

Utilizzo di Dependency Injection (DI)

Ecco il codice di esempio per ottenere le informazioni sul prodotto per ID prodotto e SKU in Magento 2 usando l'iniezione delle dipendenze.

In questo, potremmo aver bisogno di iniettare l'oggetto della classe \ Magento \ Catalog \ Model \ ProductRepository nel costruttore della classe di blocco del nostro modulo e accedervi dal file view (.phtml).

Percorso file di esempio: app / code / YourCompanyName / YourModuleName / Block / YourCustomBlock.php

<?php
namespace YourCompanyName\YourModuleName\Block;

class YourCustomBlock extends \Magento\Framework\View\Element\Template
{ 
    protected $_productRepository;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context, 
        \Magento\Catalog\Model\ProductRepository $productRepository,
        array $data = []
    ) {
        $this->_productRepository = $productRepository;
        parent::__construct($context, $data);
    }

    public function getProductById($id) {
        return $this->_productRepository->getById($id);
    }

    public function getProductBySku($sku) {
        return $this->_productRepository->get($sku);
    }
}

Ora, possiamo usare le funzioni nel nostro file di visualizzazione (.phtml) come segue.

// get product by id
$product = $block->getProductById(15);

// get product by sku
$product = $block->getProductBySku('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

Utilizzando Object Manager

Ecco il codice di esempio per ottenere le informazioni sul prodotto per ID prodotto e SKU in Magento 2 usando il gestore oggetti.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$productRepository = $objectManager->get('\Magento\Catalog\Model\ProductRepository');

// get product by product id 
$product = $productRepository->getById(15);

// get product by product sku 
$product = $productRepository->get('MT12');

echo $product->getEntityId() . '<br>';
echo $product->getName() . '<br>';
echo $product->getSKU() . '<br>';
echo $product->getPrice() . '<br>';
echo $product->getSpecialPrice() . '<br>';
echo $product->getTypeId() . '<br>';
echo $product->getProductUrl() . '<br>';

-3
<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');


$sku ='24-MB01';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productObject = $objectManager->get('Magento\Catalog\Model\Product');
$product = $productObject->loadByAttribute('sku', $sku);
echo $product->getName();

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