Cách tải sản phẩm bằng SKU trong magento 2


29

Nó khá cơ bản, nhưng tôi không thể tìm thấy một ví dụ hoạt động trên Stackexchange hoặc google. Tôi muốn tải một sản phẩm từ một người trợ giúp hoặc khối. Tôi đã thử một số thứ như:

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

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

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

$product->getName();

Điều này trả về không có gì. Tôi cũng đã thử tải bất kỳ mô hình và API có sẵn nào, nhưng dường như không có gì hoạt động với SKU.

Câu trả lời:


56

Cách chính xác, theo hợp đồng dịch vụ Magento 2, là sử dụng kho:

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

Sử dụng Magento\Catalog\Api\ProductRepositoryInterfaceđể có được nó trong nhà xây dựng của bạn.

Ví dụ đầy đủ:

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

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

Chú thích:

Nếu sản phẩm không tồn tại, phương pháp này sẽ gây ra NoSuchEntityExceptionlỗi vì đây là cách thực hành Magento2 tốt nhất.

Vì vậy, nếu bạn cần xử lý bằng cách nào đó, hãy bọc nó trong một khối thử / bắt.


9
Phương pháp này đưa ra lỗi khi không tìm thấy sản phẩm. Vì vậy, để kiểm tra xem một sản phẩm có tồn tại hay không, có vẻ như giải pháp của @ fschmengler có thể là cách tốt hơn để đi.
Dennis van Schaik

1
bạn có thể xin thêm chi tiết về Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? Tôi nên làm gì? Cảm ơn rất nhiều
davideghz

Xem bài đăng cập nhật của tôi
Phoenix128_RiccardoT

Magento 2 cách sử dụng hợp đồng dịch vụ hợp lý thực tế phức tạp hơn. Kho lưu trữ-> get () vẫn là một cuộc gọi mô hình không nên sử dụng. Cách chính xác là sử dụng kho lưu trữ-> getList () với SearchCriteriaBuilder. Xem câu trả lời của tôi trên Đơn hàng (khá nhiều phương pháp tương tự): magento.stackexchange.com/questions/140374/ mẹo
Jacques

1
@JaccoAmersfoort, tôi xác nhận "nhận" là đúng cách. Trong ví dụ của bạn, nó đã được đề xuất vì "get" trong kho lưu trữ yêu cầu "id thứ tự" và người dùng đó đang tìm kiếm "id gia tăng". Trong trường hợp đó, getList là tùy chọn tốt nhất, nhưng nếu bạn có thể sử dụng "get", bạn nên sử dụng nó.
Phoenix128_RiccardoT

27

Thay vì sử dụng trực tiếp trình quản lý đối tượng, hãy tiêm ProductFactory:

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

Sau đó sử dụng nó như thế này:

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

hoặc để thực hiện tải đầy đủ (các tải ở trên sử dụng bộ sưu tập):

$product = $this->productFactory->create();
$product->load($product->getIdBySku($sku));

7
Trên thực tế, trong khi điều này vẫn hoạt động, sử dụng load()và các bộ sưu tập là cách "Magento 1", sử dụng tốt hơn kho lưu trữ theo đề xuất của @RiccardoT.
Fabian Schmengler

1
Ngoài ra, phương thức của bạn sẽ trả về một mô hình Sản phẩm , trong khi sử dụng Kho lưu trữ sẽ cung cấp cho bạn một mô hình dữ liệu Sản phẩm ( Api/Data/Product), đó là một mô hình Sản phẩm được chuyển đổi thành DTO bị câm. Một cái gì đó để xem xét, vì chúng khá khác nhau.
nevvermind

@FabianSchmengler: Đã thử sử dụng $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()để hiển thị hình ảnh thu nhỏ của sản phẩm, nhưng nó không hoạt động.
Slimshadddyyy

@FabianSchmengler có đề xuất của Kho lưu trữ là tốt như câu trả lời @RiccardoT. Nhưng nếu tôi nhập sai sku thì nó sẽ phá vỡ toàn bộ hoạt động và ném ngoại lệ, vì vậy trong trường hợp này chúng ta phải phụ thuộc vàoproductFactory
Himanshu

@Himanshu bắt ngoại lệ. Và nếu bạn cần một sản phẩm mới trong trường hợp đó, bạn vẫn có thể tạo nó bằng cách sử dụng nhà máy
Fabian Schmengler

7

Tôi thích câu trả lời của @ phoenix128-riccardot, nhưng sẽ thêm một ngoại lệ, chỉ trong trường hợp sản phẩm không tồn tại:

thử {
    $ sản phẩm = $ this-> sản phẩmRep repositoryInterface-> get ($ sku);
} bắt (\ Magento \ Framework \ Exception \ NoSuchEntityException $ e) {
    // chèn xử lý lỗi của bạn ở đây
}

Tôi đã không thể thêm nó dưới dạng một nhận xét (danh tiếng quá thấp), xin lỗi.


4

Bạn có thể thử nó

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

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

echo $productObj->getId();

3

Thử đi:

/** @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

Tôi cần lấy sản phẩm_id từ sku (cột của csv) trong quá trình nhập csv và chỉ lưu sản phẩm_id..Làm thế nào để đạt được?
Sushivam

0

Sử dụng tiêm phụ thuộc (DI)

Dưới đây là mã ví dụ để lấy thông tin sản phẩm theo Id sản phẩm và SKU trong Magento 2 bằng cách sử dụng phép nội xạ phụ thuộc.

Trong trường hợp này, chúng ta có thể cần phải chèn đối tượng của lớp \ Magento \ Catalog \ Model \ ProductRep repository trong hàm tạo của lớp khối mô-đun của chúng ta và truy cập nó từ tệp view (.phtml).

Đường dẫn tệp mẫu: 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);
    }
}

Bây giờ, chúng ta có thể sử dụng các hàm trong tệp view (.phtml) như sau.

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

Sử dụng Trình quản lý đối tượng

Dưới đây là mã ví dụ để lấy thông tin sản phẩm theo id sản phẩm và SKU trong Magento 2 bằng trình quản lý đối tượng.

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

?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.