วิธีโหลดผลิตภัณฑ์ตาม 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

ดังนั้นหากคุณต้องการจัดการอย่างใดอย่างหนึ่งห่อในลอง / จับบล็อก


9
วิธีนี้ให้ข้อผิดพลาดเมื่อไม่พบผลิตภัณฑ์ ดังนั้นสำหรับการตรวจสอบว่ามีผลิตภัณฑ์อยู่หรือไม่ดูเหมือนว่าโซลูชันของ @ fschmengler อาจเป็นวิธีที่ดีกว่า
Dennis van Schaik

1
คุณช่วยกรุณาเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับUse Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? ฉันควรทำไง? ขอบคุณมาก
davideghz

ดูโพสต์ที่อัปเดตของฉัน
Phoenix128_RiccardoT

วีโอไอพีที่เหมาะสมจริงวิธีการใช้สัญญาบริการมีความซับซ้อนมากขึ้น Repository-> get () ยังคงเรียกใช้โมเดลซึ่งไม่ควรใช้ วิธีที่ถูกต้องคือใช้ repository-> getList () กับ SearchCriteriaBuilder ดูคำตอบของฉันเกี่ยวกับคำสั่งซื้อ (วิธีเดียวกัน): magento.stackexchange.com/questions/140374/…
Jacques

1
@ JaccoAmersfoort ฉันยืนยันว่า "get" เป็นวิธีที่ถูกต้อง ในตัวอย่างของคุณจะได้รับการแนะนำเพราะ "รับ" ในที่เก็บคำสั่งซื้อต้องการ "รหัสการสั่งซื้อ" และผู้ใช้นั้นกำลังมองหา "การเพิ่มรหัส" ในกรณีนั้น getList เป็นตัวเลือกที่ดีที่สุด แต่ถ้าคุณสามารถใช้ "รับ" คุณควรใช้มัน
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
Fabian Schmengler

1
นอกจากนี้วิธีการของคุณจะส่งคืนรูปแบบผลิตภัณฑ์ในขณะที่ใช้พื้นที่เก็บข้อมูลจะให้แบบจำลองข้อมูลผลิตภัณฑ์( Api/Data/Product) ซึ่งเป็นรูปแบบผลิตภัณฑ์ที่ถูกแปลงเป็น DTO ที่ล้าสมัย สิ่งที่ควรพิจารณาเนื่องจากมันค่อนข้างแตกต่างกัน
nevvermind

@FabianSchmengler: พยายามใช้$product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()เพื่อแสดงภาพขนาดย่อของผลิตภัณฑ์ แต่ไม่สามารถใช้งานได้
Slimshadddyyy

@FabianSchmengler ใช่การแนะนำของ Repository ดีเท่ากับ @RiccardoT คำตอบ แต่ถ้าฉันป้อนผิด sku แล้วมันจะทำลายการดำเนินการทั้งหมด & โยนข้อยกเว้นดังนั้นในกรณีนี้เราต้องขึ้นอยู่กับมันproductFactory
Himanshu

@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 .. จะทำอย่างไร
Sushivam

0

ใช้การฉีดพึ่งพา (DI)

นี่คือตัวอย่างรหัสเพื่อรับข้อมูลผลิตภัณฑ์ตามรหัสผลิตภัณฑ์และ SKU ใน Magento 2 โดยใช้การฉีดพึ่งพา

ในนี้เราอาจต้องฉีดวัตถุของคลาส \ Magento \ Catalog \ Model \ 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>';

การใช้ Object Manager

นี่คือตัวอย่างรหัสเพื่อรับข้อมูลผลิตภัณฑ์ตามรหัสผลิตภัณฑ์และ 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();

?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.