magento 2でSKUによって製品をロードする方法


29

それはかなり基本的ですが、Stackexchangeやgoogleで動作する例を見つけることができません。ヘルパーまたはブロックから製品をロードしたい。私はすでに次のようなことを試しました:

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

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

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

$product->getName();

これは何も返しません。また、使用可能なモデルとAPIをロードしようとしましたが、SKUで機能するものはないようです。

回答:


56

Magento 2サービス契約によると、正しい方法はリポジトリを使用することです。

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

Magento\Catalog\Api\ProductRepositoryInterfaceコンストラクタで取得するために使用します。

完全な例:

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

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

注意:

製品が存在しない場合、NoSuchEntityExceptionMagento2のベストプラクティスと同様に、このメソッドはエラーをトリガーします。

そのため、何らかの方法で処理する必要がある場合は、try / catchブロックでラップします。


9
製品が見つからない場合、このメソッドはエラーを返します。したがって、製品が存在するかどうかを確認するには、@ fschmenglerのソリューションが最適な方法であると思われます。
デニスヴァンシャイック

1
についての詳細を追加できますUse Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.か?何をすればよいでしょうか?どうもありがとう
davideghz

私の更新記事を参照してください
Phoenix128_RiccardoT

サービス契約を使用する実際の適切なMagento 2の方法はより複雑です。Repository-> get()はまだ使用すべきではないモデル呼び出しです。正しい方法は、SearchCriteriaBuilderでrepository-> getList()を使用することです。注文に関する私の回答をご覧ください(ほぼ同じ方法):magento.stackexchange.com/questions/140374/…–
ジャック

1
@JaccoAmersfoort、「get」が正しい方法であることを確認します。あなたの例では、オーダーリポジトリの「get」には「order id」が必要であり、そのユーザーは「increment id」を探していたため、提案されています。その場合、getListが最適なオプションですが、「get」を使用できる場合はそれを使用する必要があります。
Phoenix128_RiccardoT

27

オブジェクトマネージャを直接使用する代わりに、ProductFactoryを注入します。

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

次に、次のように使用します。

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

または完全なロードを行うには(上記はコレクションを使用してロードします):

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

7
実際、これがまだ機能している間、使用load()とコレクションは「マゼント1」の方法であり、@ RiccardoTによって提案されているようにリポジトリをより適切に使用します。
ファビアンシュメングラー

1
また、メソッドはProduct モデルを返しますが、Repositoryを使用すると、製品データモデルApi/Data/Product)が得られます。これは、製品モデルがa落したDTOに変換されたものです。考慮すべき点があります。それらはまったく異なるからです。
-nevvermind

@FabianSchmengler:$product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()製品のサムネイル画像の表示に使用しようとしましたが、機能しませんでした。
Slimshadddyyy

@FabianSchmenglerはい、リポジトリの推奨事項は@RiccardoTの回答として適切です。しかし、私は間違ったSKUを入力した場合、それは全体の動作を何を破るだろうと例外をスローするので、この場合には、我々はに依存している必要がありますproductFactory
ヒマンシュ

@Himanshuは例外をキャッチします。また、その場合に新鮮な製品インスタンスが必要な場合は、ファクトリーを使用して作成することができます
Fabian Schmengler

7

私は@ phoenix128-riccardotの答えが好きですが、製品が存在しない場合のために例外を追加します:

{
    $ product = $ this-> productRepositoryInterface-> get($ sku);
} catch(\ Magento \ Framework \ Exception \ NoSuchEntityException $ e){
    //ここにエラー処理を挿入します
}

コメントとして追加できませんでした(評判が低すぎます)、ごめんなさい。


4

あなたはそれを試すことができます

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

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

echo $productObj->getId();

3

これを試して:

/** @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のインポート中にsku(csvの列)からproduct_idを取得し、product_idのみを保存する必要があります。
スシバム

0

依存性注入(DI)の使用

依存性注入を使用して、Magento 2の製品IDおよびSKUごとに製品情報を取得するサンプルコードを次に示します。

この場合、モジュールのブロッククラスのコンストラクターに\ Magento \ Catalog \ Model \ ProductRepositoryクラスのオブジェクトを挿入し、ビュー(.phtml)ファイルからアクセスする必要があります。

サンプルファイルパス: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);
    }
}

これで、ビュー(.phtml)ファイルの関数を次のように使用できます。

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

オブジェクトマネージャーの使用

オブジェクトマネージャを使用して、Magento 2で製品IDとSKUごとに製品情報を取得するサンプルコードを次に示します。

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

?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.