Як завантажити товар за SKU в magento 2


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 може бути кращим способом.
Денніс ван Шайк

1
Ви можете додати більше деталей про Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Що мені робити? Велике спасибі
davideghz

Дивіться мій оновлений пост
Phoenix128_RiccardoT

Дійсний власний спосіб використання контрактів на обслуговування Magento 2 є складнішим. Сховище-> get () все ще є викликом моделі, який не слід використовувати. Правильний спосіб - використовувати сховище-> getList () з SearchCriteriaBuilder. Дивіться мою відповідь на замовлення (майже такий самий метод): magento.stackexchange.com/questions/140374/…
Жак

1
@JaccoAmersfoort, я підтверджую, що "отримати" це правильний шлях. У вашому прикладі було запропоновано, тому що "отримати" в сховище замовлень вимагає "ідентифікатор замовлення", і цей користувач шукав "ідентифікаційний приріст". У цьому випадку 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.
Фабіан Шменглер

1
Крім того, ваш метод поверне модель продукту , тоді як використання сховища дасть вам модель даних про продукт ( Api/Data/Product), яка є моделлю продукту, перетвореною на скинутий DTO. Щось врахувати, оскільки вони зовсім інші.
nevvermind

@FabianSchmengler: Спробували використовувати $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()для відображення ескізів зображення, але його не працює.
Slimshadddyyy

@FabianSchmengler так рекомендація сховища хороша як відповідь @RiccardoT. але що, якщо я ввів неправильний ску, то це порушить всю операцію і викине виняток, тож у цьому випадку ми повинні залежати від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

Мені потрібно отримати product_id з sku (стовпець csv) під час імпорту CSV та зберегти лише product_id..Як досягти?
Сушівам

0

Використання ін'єкції залежності (DI)

Ось приклад коду для отримання інформації про продукт за ідентифікатором продукту та кодом товару в Magento 2, використовуючи введення залежності.

У цьому нам може знадобитися ввести об’єкт класу \ Magento \ Каталог \ Модель \ ProductRepository в конструктор блочного класу нашого модуля та отримати доступ до нього з файлу перегляду (.phtml).

Зразок шляху файлу: додаток / код / ​​YourCompanyName / YourModuleName / Блок / 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>';

Використання диспетчера об'єктів

Ось приклад коду для отримання інформації про продукт за ідентифікатором продукту та SKU в Magento 2 за допомогою диспетчера об'єктів.

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

?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.