Magento 2'de SKU'ya ürün yükleme


29

Oldukça basit, ancak Stackexchange veya google'da çalışan bir örnek bulamıyorum. Bir ürünü bir yardımcı veya bloktan yüklemek istiyorum. Zaten bazı şeyleri denedim:

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

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

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

$product->getName();

Bu hiçbir şey döndürmez. Kullanılabilir modelleri ve API'leri yüklemeyi de denedim, ancak hiçbiri SKU'larla çalışmıyor gibi görünüyor.

Yanıtlar:


56

Magento 2 servis sözleşmelerine göre doğru yol depoları kullanmaktır:

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

Yapıcınıza sokmak Magento\Catalog\Api\ProductRepositoryInterfaceiçin kullanın .

Tam örnek:

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

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

Not:

Ürün yoksa, bu yöntem NoSuchEntityExceptionen iyi Magento2 uygulamasında olduğu gibi bir hata tetikler .

Bu nedenle, bir şekilde işlemeniz gerekirse, bir dene / yakala bloğuna sarın.


9
Ürün bulunamadığında bu yöntem hata verir. Yani bir ürünün var olup olmadığını kontrol etmek için, Görünüşe göre @ fschmengler'ın çözümü daha iyi bir yol olabilir.
— Dennis van Schaik

1
pls hakkında daha fazla ayrıntı ekleyebilir Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.miyim? Ne yapmalıyım? Çok teşekkürler
— davideghz

Benim güncellenmiş sonrası bakın
— Phoenix128_RiccardoT

Servis sözleşmelerini kullanmanın gerçek uygun Magento 2 yolu daha karmaşıktır. Depo-> get () hala kullanılmaması gereken bir model çağrısıdır. Doğru yol, depoyu-> getList () 'i SearchCriteriaBuilder ile kullanmaktır. Siparişler üzerindeki cevabımı gör (hemen hemen aynı yöntem): magento.stackexchange.com/questions/140374/…
— Jacques

1
@ JaccoAmersfoort, "get" in doğru yol olduğunu onaylıyorum. Örneğinizde, sipariş deposunda "get", "order id" gerektirdiğinden ve bu kullanıcının "artırıcı id" aradığından önerildi. Bu durumda bir getList en iyi seçenektir, ancak “get” seçeneğini kullanabiliyorsanız kullanmalısınız.
— Phoenix128_RiccardoT

27

Nesne yöneticisini doğrudan kullanmak yerine, ProductFactory'yi enjekte edin:

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

Öyleyse şöyle kullan:

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

veya tam bir yük yapmak için (yukarıdaki bir koleksiyonu kullanarak yükler):

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

7
Aslında bu hala çalışıyorken, kullanmak load()ve koleksiyonlar "Magento 1" yoludur, @RiccardoT tarafından önerilen depoyu daha iyi kullanın.
— Fabian Schmengler

1
Ayrıca, yönteminiz bir Ürün modelini geri döndürürken , Depo kullanmak size aptalca bir DTO'ya dönüştürülmüş bir Ürün modeli olan bir Ürün veri modeli ( Api/Data/Product) verir. Dikkate alınacak bir şey, oldukça farklı olduklarından.
— nevvermind

@FabianSchmengler: $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()Ürünün küçük resmini görüntülemek için kullanmaya çalıştı , ancak çalışmıyor.
— Slimshadddyyy

@FabianSchmengler Deponun evet önerisi @RiccardoT cevabı kadar iyidir. fakat eğer yanlış sku girersem, tüm operasyonu kıracak ve istisna atacağım, bu durumda buna bağlı olmalıyızproductFactory
— Himanshu

@Himanshu istisnayı yakalar. Ve bu durumda taze bir ürün örneğine ihtiyacınız varsa, fabrikayı kullanarak hala oluşturabilirsiniz
— Fabian Schmengler

7

@ Phoenix128-riccardot adlı kullanıcının yanıtını beğendim, ancak ürünün mevcut olmaması durumunda istisna eklerim:

Deneyin {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ İstisna \ NoSuchEntityException $ e) {
    // hata işleme konunuzu buraya ekleyin
}

Yorum olarak ekleyemedim (çok düşük itibar), üzgünüm.


4

Bunu deneyebilirsin

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

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

echo $productObj->getId();

3

Bunu dene:

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

Csv alma işlemi sırasında product_id dosyasını sku'dan (csv sütunu) almam ve yalnızca product_id'i kaydetmem gerekiyor .. Nasıl elde edilir?
— Sushivam

0

Bağımlılık Enjeksiyonunu Kullanma (DI)

Bağımlılık enjeksiyonunu kullanarak ürün bilgisini Magento 2'deki ürün kimliği ve SKU'ya göre almak için örnek kod.

Bunun içinde \ Magento \ Catalogue \ Model \ ProductRepository sınıfının nesnesini, modülümüzün blok sınıfının yapıcısına enjekte etmemiz ve buna view (.phtml) dosyasından erişmemiz gerekebilir.

Örnek Dosya Yolu: app / code / Şirketinizin Adı / 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);
    }
}

Şimdi, görünümümüzde (.phtml) dosyamızdaki işlevleri aşağıdaki gibi kullanabiliriz.

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

Nesne Yöneticisini Kullanma

Nesne yöneticisini kullanarak Magento 2'deki ürün kimliğine ve SKU'ya göre ürün bilgilerini almak için örnek kod.

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

?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.