So laden Sie das Produkt mit der Artikelnummer in Magento 2


29

Es ist ziemlich einfach, aber ich kann kein funktionierendes Beispiel für Stackexchange oder Google finden. Ich möchte ein Produkt von einem Helfer oder Block laden. Ich habe schon einige Dinge ausprobiert:

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

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

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

$product->getName();

Dies gibt nichts zurück. Ich habe auch versucht, verfügbare Modelle und APIs zu laden, aber mit SKUs scheint nichts zu funktionieren.

Antworten:


56

Der richtige Weg, laut Magento 2-Serviceverträgen, ist die Verwendung von Repositories:

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

Verwenden Sie Magento\Catalog\Api\ProductRepositoryInterface, um es in Ihren Konstruktor zu bekommen.

Vollständiges Beispiel:

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

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

Hinweis:

Wenn das Produkt nicht existiert, löst diese Methode einen NoSuchEntityExceptionFehler aus, wie es in der besten Magento2-Praxis der Fall wäre.

Wenn Sie also etwas anfassen müssen, wickeln Sie es in einen try / catch-Block.


9
Diese Methode gibt einen Fehler aus, wenn kein Produkt gefunden wird. Um zu überprüfen, ob ein Produkt vorhanden ist, ist die Lösung von @ fschmengler möglicherweise der bessere Weg.
Dennis van Schaik

1
Können Sie bitte weitere Details hinzufügen Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Was soll ich tun? Vielen Dank
davideghz

Siehe meinen aktualisierten Beitrag
Phoenix128_RiccardoT

Die eigentliche Verwendung von Serviceverträgen in Magento 2 ist komplizierter. Repository-> get () ist immer noch ein Modellaufruf, der nicht verwendet werden sollte. Der richtige Weg ist die Verwendung von repository-> getList () mit SearchCriteriaBuilder. Siehe meine Antwort auf Bestellungen (so ziemlich die gleiche Methode): magento.stackexchange.com/questions/140374/…
Jacques

1
@JaccoAmersfoort, ich bestätige "get" ist der richtige Weg. In Ihrem Beispiel wurde vorgeschlagen, dass "get" im Auftragsspeicher "order id" erfordert und dieser Benutzer nach "increment id" suchte. In diesem Fall ist eine getList die beste Option, aber wenn Sie "get" verwenden können, sollten Sie sie verwenden.
Phoenix128_RiccardoT

27

Anstatt den Objektmanager direkt zu verwenden, injizieren Sie die ProductFactory:

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

Dann benutze es so:

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

oder, um eine vollständige Ladung durchzuführen (die oben genannten laden sie mit einer Sammlung):

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

7
Während dies noch funktioniert, ist die Verwendung von load()und Sammlungen die "Magento 1" -Methode. Verwenden Sie besser das von @RiccardoT vorgeschlagene Repository.
Fabian Schmengler

1
Außerdem wird Ihre Methode ein Produkt zurückgeben Modell , während das Repository verwenden wird Ihnen ein Produktdatenmodell ( Api/Data/Product), die ein Produktmodell ist in eine abgespeckte DTO umgewandelt. Etwas zu beachten, da sie ganz anders sind.
Nevvermind

@FabianSchmengler: Es wurde versucht, ein $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()Miniaturbild des Produkts anzuzeigen, aber es funktioniert nicht.
Slimshadddyyy

@FabianSchmengler ja Empfehlung von Repository ist gut als @RiccardoT Antwort. aber was ist, wenn ich eine falsche SKU eingegeben habe, dann bricht es die gesamte Operation und wirft eine Ausnahme. In diesem Fall müssen wir uns also darauf verlassen, dassproductFactory
Himanshu,

@ Himanshu fangen die Ausnahme. Und wenn Sie in diesem Fall eine neue Produktinstanz benötigen, können Sie diese dennoch in der Fabrik erstellen
Fabian Schmengler,

7

Ich mag die Antwort von @ phoenix128-riccardot, würde aber eine Ausnahme hinzufügen, nur für den Fall, dass das Produkt nicht existiert:

Versuchen {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // Fügen Sie hier Ihre Fehlerbehandlung ein
}

Ich konnte es leider nicht als Kommentar hinzufügen (zu geringes Ansehen).


4

Sie können das versuchen

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

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

echo $productObj->getId();

3

Versuche dies:

/** @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

Ich muss die product_id von SKU (Spalte von CSV) während des CSV-Imports abrufen und nur die product_id speichern.
Sushivam

0

Verwenden der Abhängigkeitsinjektion (DI)

Hier ist der Beispielcode, um die Produktinformationen nach Produkt-ID und SKU in Magento 2 mithilfe der Abhängigkeitsinjektion abzurufen.

In diesem Fall müssen wir möglicherweise das Objekt der Klasse \ Magento \ Catalog \ Model \ ProductRepository in den Konstruktor der Blockklasse unseres Moduls einfügen und über die Ansichtsdatei (.phtml) darauf zugreifen.

Beispieldateipfad: 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);
    }
}

Jetzt können wir die Funktionen in unserer Ansichtsdatei (.phtml) wie folgt verwenden.

// 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>';

Verwenden des Objektmanagers

Hier ist der Beispielcode zum Abrufen der Produktinformationen nach Produkt-ID und SKU in Magento 2 mithilfe des Objektmanagers.

$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();

?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.