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);
}
...

노트 :

제품이 존재하지 않는 경우이 방법 NoSuchEntityException은 최상의 Magento2 사례에서와 같이 오류를 트리거합니다 .

따라서 어떻게 든 처리 해야하는 경우 try / catch 블록으로 감싸십시오.


9
이 방법은 제품을 찾을 수 없을 때 오류를 발생시킵니다. 따라서 제품이 존재하는지 확인하려면 @fschmengler의 솔루션이 더 나은 방법 일 것 같습니다.
Dennis van Schaik

1
pls 자세한 내용을 추가 할 수 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/…
Jacques

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()컬렉션을 사용 하는 것이 "Magento 1"방식이므로 @RiccardoT에서 제안한대로 저장소를 더 잘 사용하십시오.
Fabian Schmengler

1
또한, 당신의 방법은 제품 반환 모델을 당신에게 제품 줄 것이다 저장소를 사용하는 동안, 데이터 모델 ( Api/Data/Product제품 모델은 이그제큐티브 소프트웨어의 디스 키퍼 다운 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);
} 캐치 (\ 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 만 저장해야합니다.
Sushivam

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.