Como carregar o produto por SKU no magento 2

29

É bem básico, mas não consigo encontrar um exemplo de trabalho no Stackexchange ou no google. Quero carregar um produto de um auxiliar ou bloco. Eu já tentei algumas coisas como:

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

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

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

$product->getName();

Isso não retorna nada. Também tentei carregar todos os modelos e APIs disponíveis, mas nada parece funcionar com os SKUs.

Dennis van Schaik
fonte

Respostas:

56

A maneira correta, de acordo com os contratos de serviço do Magento 2, é usar repositórios:

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

Use Magento\Catalog\Api\ProductRepositoryInterfacepara obtê-lo em seu construtor.

Exemplo completo:

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

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

Nota:

Se o produto não existir, esse método acionará um NoSuchEntityExceptionerro, como seria na melhor prática do Magento2.

Portanto, se você precisar manipular de alguma forma, envolva-o em um bloco try / catch.

Phoenix128_RiccardoT
fonte
9
Este método apresenta um erro quando nenhum produto é encontrado. Portanto, para verificar se existe um produto, parece que a solução do @ fschmengler pode ser o melhor caminho a percorrer.
Dennis van Schaik
11
você pode adicionar mais detalhes sobre Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? O que devo fazer? Muito obrigado
davideghz
Veja meu post atualizado
Phoenix128_RiccardoT
A maneira correta de usar os contratos de serviço do Magento 2 é mais complicada. O repositório-> get () ainda é uma chamada de modelo que não deve ser usada. A maneira correta é usar repository-> getList () com SearchCriteriaBuilder. Veja minha resposta em Pedidos (praticamente o mesmo método): magento.stackexchange.com/questions/140374/…
Jacques
11
@JaccoAmersfoort, confirmo que "get" é o caminho certo. No seu exemplo, foi sugerido porque "get" no repositório de pedidos requer "ID do pedido" e esse usuário estava procurando "ID de incremento". Nesse caso, uma getList é a melhor opção, mas se você puder usar "get", deverá usá-la.
Phoenix128_RiccardoT
27

Em vez de usar o gerenciador de objetos diretamente, injete o ProductFactory:

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

Em seguida, use-o assim:

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

ou para fazer um carregamento completo (o acima é carregado usando uma coleção):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));
Fabian Schmengler
fonte
7
Na verdade, enquanto isso ainda está funcionando, o uso de load()e coleções é a maneira "Magento 1", use melhor o repositório como sugerido por @RiccardoT.
Fabian Schmengler
11
Além disso, seu método retornará um modelo de Produto , enquanto o uso do Repositório fornecerá um modelo de dados do Produto ( Api/Data/Product), que é um modelo de Produto convertido em um DTO simplificado. Algo a considerar, pois são bem diferentes.
precisa saber é o seguinte
@FabianSchmengler: tentei usar $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()para exibir a imagem em miniatura do produto, mas não está funcionando.
Slimshadddyyy 31/01
@FabianSchmengler sim, a recomendação do Repositório é boa como a resposta @RiccardoT. Mas e se eu entrou errado sku, em seguida, ele vai quebrar toda a operação & exceção lance, portanto, neste caso, temos de ter que depender deproductFactory
Himanshu
@Himanshu captura a exceção. E se você precisar de uma instância de produto novo nesse caso, ainda poderá criá-la usando a fábrica
Fabian Schmengler 5/11
7

Eu gosto da resposta da @ phoenix128-riccardot, mas adicionaria uma exceção, caso o produto não exista:

experimentar {
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} catch (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // insira aqui o tratamento de erros
}

Não foi possível adicioná-lo como um comentário (reputação muito baixa), desculpe.

Onde
fonte
4

Você pode tentar isso

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

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

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

Tente o seguinte:

/** @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
obscurecer
fonte
Preciso obter o product_id do sku (coluna csv) durante a importação do csv e salvar apenas o product_id .. Como conseguir?
Sushivam
0

Usando Injeção de Dependência (DI)

Aqui está o código de exemplo para obter as informações do produto por ID do produto e SKU no Magento 2 usando injeção de dependência.

Nisso, podemos precisar injetar o objeto da classe \ Magento \ Catalog \ Model \ ProductRepository no construtor da classe de bloco do nosso módulo e acessá-lo no arquivo view (.phtml).

Caminho do arquivo de amostra: 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);
    }
}

Agora, podemos usar as funções em nosso arquivo view (.phtml) da seguinte maneira.

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

Usando o Gerenciador de Objetos

Aqui está o código de exemplo para obter as informações do produto por ID do produto e SKU no Magento 2 usando o gerenciador de objetos.

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