Cara memuat produk dengan SKU di magento 2

29

Ini cukup mendasar, tetapi saya tidak dapat menemukan contoh yang berfungsi di Stackexchange atau google. Saya ingin memuat produk dari helper atau blok. Saya sudah mencoba beberapa hal seperti:

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

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

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

$product->getName();

Ini tidak menghasilkan apa-apa. Saya juga mencoba memuat model dan API yang tersedia, tetapi sepertinya tidak ada yang berhasil dengan SKU.

Dennis van Schaik
sumber

Jawaban:

56

Cara yang benar, menurut kontrak layanan Magento 2, adalah menggunakan repositori:

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

Gunakan Magento\Catalog\Api\ProductRepositoryInterfaceuntuk mendapatkannya di konstruktor Anda.

Contoh lengkap:

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

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

catatan:

Jika produk tidak ada, metode ini memicu NoSuchEntityExceptionkesalahan karena itu akan menjadi praktik Magento2 terbaik.

Jadi, jika Anda perlu mengatasinya, bungkus dengan balok coba / tangkap.

Phoenix128_RiccardoT
sumber
9
Metode ini memberikan kesalahan ketika tidak ada produk yang ditemukan. Jadi untuk memeriksa apakah suatu produk ada, sepertinya solusi @ fschmengler mungkin merupakan cara yang lebih baik.
Dennis van Schaik
1
dapatkah Anda menambahkan lebih detail Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Apa yang harus saya lakukan? Terima kasih banyak
davideghz
Lihat posting saya yang diperbarui
Phoenix128_RiccardoT
Cara Magento 2 sebenarnya yang tepat untuk menggunakan kontrak layanan lebih rumit. Repositori-> get () masih merupakan panggilan model yang tidak boleh digunakan. Cara yang benar adalah dengan menggunakan repositori-> getList () dengan SearchCriteriaBuilder. Lihat jawaban saya tentang Pesanan (metode yang hampir sama): magento.stackexchange.com/questions/140374/…
Jacques
1
@JaccoAmersfoort, saya mengkonfirmasi "get" adalah cara yang benar. Dalam contoh Anda itu telah disarankan karena "get" dalam repositori pesanan memerlukan "order id" dan pengguna itu mencari "increment id". Dalam hal itu, getList adalah opsi terbaik, tetapi jika Anda dapat menggunakan "get", Anda harus menggunakannya.
Phoenix128_RiccardoT
27

Alih-alih menggunakan manajer objek secara langsung, menyuntikkan ProductFactory:

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

Kemudian gunakan seperti ini:

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

atau untuk melakukan pemuatan penuh (di atas memuatnya menggunakan koleksi):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));
Fabian Schmengler
sumber
7
Sebenarnya saat ini masih berfungsi, menggunakan load()dan koleksi adalah cara "Magento 1", lebih baik gunakan repositori seperti yang disarankan oleh @RiccardoT.
Fabian Schmengler
1
Selain itu, metode Anda akan mengembalikan model Produk , sementara menggunakan Repositori akan memberi Anda model data Produk ( Api/Data/Product), yang merupakan model Produk yang dikonversi menjadi DTO yang dumbed-down. Sesuatu untuk dipertimbangkan, karena mereka sangat berbeda.
nevvermind
@FabianSchmengler: Mencoba menggunakan $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()untuk menampilkan gambar mini produk, tetapi tidak berfungsi.
Slimshadddyyy
@FabianSchmengler ya rekomendasi Repositori bagus sebagai jawaban @RiccardoT. tetapi bagaimana jika saya memasukkan sku yang salah maka itu akan merusak seluruh operasi & membuang pengecualian, jadi dalam hal ini kita harus bergantung padaproductFactory
Himanshu
@ Himanshu menangkap pengecualian. Dan jika Anda membutuhkan contoh produk baru dalam kasus itu, Anda masih dapat membuatnya menggunakan pabrik
Fabian Schmengler
7

Saya suka jawaban @ phoenix128-riccardot, tetapi akan menambahkan pengecualian, kalau-kalau produk tersebut tidak ada:

coba {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // masukkan penanganan kesalahan Anda di sini
}

Saya tidak dapat menambahkannya sebagai komentar (reputasi terlalu rendah), maaf.

dimana
sumber
4

Anda bisa mencobanya

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

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

echo $productObj->getId();
Nadeem0035
sumber
3

Coba ini:

/** @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
mengaburkan
sumber
Saya perlu mendapatkan product_id dari sku (kolom csv) selama impor csv dan hanya menyimpan product_id..Bagaimana mencapainya?
Sushivam
0

Menggunakan Dependency Injection (DI)

Berikut adalah contoh kode untuk mendapatkan informasi produk berdasarkan ID produk dan SKU di Magento 2 menggunakan injeksi ketergantungan.

Dalam hal ini, kita mungkin perlu menyuntikkan objek dari kelas \ Magento \ Catalog \ Model \ ProductRepository dalam konstruktor kelas blok modul kita dan mengaksesnya dari file view (.phtml).

Contoh File Path: 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);
    }
}

Sekarang, kita dapat menggunakan fungsi dalam file view (.phtml) kita sebagai berikut.

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

Menggunakan Object Manager

Berikut adalah contoh kode untuk mendapatkan informasi produk berdasarkan id produk dan SKU di Magento 2 menggunakan manajer objek.

$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
sumber
-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
sumber