Как загрузить товар по артикулу в 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.

Phoenix128_RiccardoT
источник
9
Этот метод выдает ошибку, когда продукт не найден. Так что для проверки, существует ли продукт, кажется, решение @ fschmengler могло бы быть лучшим способом.
Деннис ван Шайк,
1
Можете ли вы, пожалуйста, добавить более подробную информацию о Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Что мне делать? Большое спасибо
Давидегз
Смотрите мой обновленный пост
Phoenix128_RiccardoT
Собственно правильный Magento 2 способ использования сервисных контрактов более сложен. Repository-> get () по-прежнему является вызовом модели, который не должен использоваться. Правильный путь - использовать repository-> getList () с SearchCriteriaBuilder. Смотрите мой ответ на Заказы (в основном тот же метод): magento.stackexchange.com/questions/140374/…
Жак
1
@JaccoAmersfoort, я подтверждаю, что «получить» это правильный путь. В вашем примере это было предложено, потому что для «get» в репозитории заявок требуется «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.
Фабиан Шменглер
1
Кроме того, ваш метод вернет модель продукта , а использование репозитория даст вам модель данных продукта ( Api/Data/Product), которая представляет собой модель продукта, преобразованную в неработающий DTO. Что-то, чтобы рассмотреть, поскольку они весьма различны.
nevvermind
@FabianSchmengler: пробовал использовать $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()для отображения миниатюры товара, но это не работает.
Slimshadddyyy
@FabianSchmengler да рекомендация репозитория хороша как ответ @RiccardoT. но что, если я введу неправильный sku, тогда он прервет всю операцию и выдаст исключение, поэтому в этом случае мы должны зависеть отproductFactory
Himanshu
@Himanshu поймать исключение. И если вам нужен свежий экземпляр продукта в этом случае, вы все равно можете создать его, используя фабрику
Фабиан Шменглер
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();
Nadeem0035
источник
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..Как достичь?
Sushivam
0

Использование Dependency Injection (DI)

Вот пример кода для получения информации о продукте по идентификатору продукта и SKU в Magento 2 с использованием внедрения зависимостей.

В этом случае нам может понадобиться внедрить объект класса \ 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>';

Использование диспетчера объектов

Вот пример кода для получения информации о продукте по идентификатору продукта и 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();

?>
Нагараджу К
источник