Jak załadować produkt według SKU w magento 2

29

To dość proste, ale nie mogę znaleźć działającego przykładu na Stackexchange lub Google. Chcę załadować produkt z pomocnika lub bloku. Próbowałem już takich rzeczy jak:

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

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

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

$product->getName();

To nic nie zwraca. Próbowałem również załadować dostępne modele i interfejsy API, ale wydaje się, że nic nie działa z SKU.

Dennis van Schaik
źródło

Odpowiedzi:

56

Prawidłowym sposobem, zgodnie z umowami serwisowymi Magento 2, jest użycie repozytoriów:

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

Użyj, Magento\Catalog\Api\ProductRepositoryInterfaceaby pobrać go do swojego konstruktora.

Pełny przykład:

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

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

Uwaga:

Jeśli produkt nie istnieje, ta metoda powoduje NoSuchEntityExceptionbłąd, tak jak w najlepszej praktyce Magento2.

Jeśli więc chcesz jakoś sobie z tym poradzić, zawiń go w bloku try / catch.

Phoenix128_RiccardoT
źródło
9
Ta metoda powoduje błąd, gdy nie znaleziono produktu. Aby sprawdzić, czy produkt istnieje, wydaje się, że najlepszym rozwiązaniem może być rozwiązanie @ fschmengler.
Dennis van Schaik,
1
czy możesz dodać więcej szczegółów na temat Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Co powinienem zrobić?
Wielkie
Zobacz mój zaktualizowany post
Phoenix128_RiccardoT
Właściwy sposób korzystania z umów serwisowych Magento 2 jest bardziej skomplikowany. Repository-> get () jest nadal wywołaniem modelowym, którego nie należy używać. Prawidłowym sposobem jest użycie repository-> getList () z SearchCriteriaBuilder. Zobacz moją odpowiedź na temat zamówień (prawie ta sama metoda): magento.stackexchange.com/questions/140374/…
Jacques
1
@JaccoAmersfoort, potwierdzam, że „get” to właściwy sposób. W twoim przykładzie zasugerowano to, ponieważ „get” w repozytorium zamówień wymaga „id zamówienia”, a ten użytkownik szukał „id przyrostu”. W takim przypadku najlepszą opcją jest getList, ale jeśli możesz użyć „get”, powinieneś go użyć.
Phoenix128_RiccardoT
27

Zamiast bezpośrednio używać menedżera obiektów, wstrzyknij ProductFactory:

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

Następnie użyj go w następujący sposób:

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

lub wykonać pełne ładowanie (powyższe ładuje je za pomocą kolekcji):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));
Fabian Schmengler
źródło
7
W rzeczywistości, gdy to wciąż działa, używanie load()i kolekcje są sposobem „Magento 1”, lepiej skorzystaj z repozytorium, jak sugeruje @RiccardoT.
Fabian Schmengler 17.04.16
1
Ponadto metoda zwróci model produktu , natomiast użycie repozytorium da model danych produktu ( Api/Data/Product), który jest modelem produktu przekształconym w głupi DTO. Coś do rozważenia, ponieważ są one zupełnie różne.
nevvermind,
@FabianSchmengler: Próbowałem $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()wyświetlić miniaturę produktu, ale nie działa.
Slimshadddyyy
@FabianSchmengler tak zalecenie Repozytorium jest dobre jak odpowiedź @RiccardoT. ale co jeśli źle wprowadzę SKU, to przerwie całą operację i wyrzuci wyjątek, więc w tym przypadku musimy polegać naproductFactory
Himanshu,
@Himanshu złapał wyjątek. A jeśli potrzebujesz instancji świeżego produktu w takim przypadku, nadal możesz ją utworzyć za pomocą fabryki
Fabian Schmengler,
7

Podoba mi się odpowiedź @ phoenix128-riccardot, ale dodałbym wyjątek, na wypadek gdyby produkt nie istniał:

próbować {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // wstaw tutaj obsługę błędów
}

Przepraszam, nie mogłem dodać tego jako komentarza (zbyt niska reputacja).

gdzie
źródło
4

Możesz tego spróbować

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

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

echo $productObj->getId();
Nadeem0035
źródło
3

Spróbuj tego:

/** @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
niejasny
źródło
Muszę pobrać identyfikator_produktu z SKU (kolumna CSV) podczas importu CSV i zapisać tylko identyfikator_produktu .Jak osiągnąć?
Sushivam,
0

Korzystanie z wstrzykiwania zależności (DI)

Oto przykładowy kod, aby uzyskać informacje o produkcie według identyfikatora produktu i kodu SKU w Magento 2 przy użyciu wstrzykiwania zależności.

W tym przypadku możemy potrzebować wstrzyknąć obiekt klasy \ Magento \ Catalog \ Model \ ProductRepository do konstruktora klasy blokowej naszego modułu i uzyskać do niego dostęp z pliku widoku (.phtml).

Przykładowa ścieżka pliku: 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);
    }
}

Teraz możemy korzystać z funkcji w naszym pliku widoku (.phtml) w następujący sposób.

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

Korzystanie z Menedżera obiektów

Oto przykładowy kod, aby uzyskać informacje o produkcie według identyfikatora produktu i jednostki SKU w Magento 2 przy użyciu menedżera obiektów.

$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>';
Amir Hosseinzadeh
źródło
-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();

?>
Nagaraju K
źródło