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.