মাজেন্টো 2-এ কীভাবে এসকিউ দ্বারা পণ্য লোড করা যায়


29

এটি বেশ বেসিক, তবে স্ট্যাকেক্সচেঞ্জ বা গুগলে আমি কোনও কাজের উদাহরণ খুঁজে পাচ্ছি না। আমি কোনও সহায়ক বা ব্লক থেকে একটি পণ্য লোড করতে চাই। আমি ইতিমধ্যে কিছু জিনিস চেষ্টা করেছি:

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

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

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

$product->getName();

এটি কিছুই দেয় না। আমি যে কোনও উপলভ্য মডেল এবং এপিআই'র লোড করার চেষ্টা করেছি, তবে এসকিউ'র সাথে কিছুই কাজ করছে বলে মনে হচ্ছে না।

উত্তর:


56

সঠিক উপায়, ম্যাগেন্টো 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 এর সমাধানটি আরও ভাল উপায় হতে পারে।
ডেনিস ভ্যান শাইইক

1
আপনি প্লিজ সম্পর্কে আরও বিশদ যুক্ত করতে পারেন Use Magento\Catalog\Api\ProductRepositoryInterface to get it in your constructor.? আমি এখন কি করব? অনেক অনেক ধন্যবাদ
ডেভিডেজেজ

আমার আপডেট হওয়া পোস্টটি দেখুন
ফিনিক্স 128_ রিকার্ডোটি

পরিষেবা চুক্তি ব্যবহারের আসল যথাযথ ম্যাজেন্টো 2 উপায় আরও জটিল। সংগ্রহস্থল-> পান () এখনও একটি মডেল কল যা ব্যবহার করা উচিত নয়। সঠিক উপায় হ'ল অনুসন্ধানক্রিটরিয়া বিল্ডারের সাহায্যে সংগ্রহস্থল-> getList () ব্যবহার করা। অর্ডারগুলিতে আমার উত্তর দেখুন (প্রায় একই পদ্ধতি): magento.stackexchange.com/questions/140374/…
জ্যাক

1
@ জ্যাকোআমার্সফুর্ট, আমি নিশ্চিত করি "get" সঠিক উপায়। আপনার উদাহরণে এটি প্রস্তাবিত হয়েছে কারণ অর্ডার সংগ্রহস্থানে "পেতে" "অর্ডার আইডি" প্রয়োজন এবং সেই ব্যবহারকারী "ইনক্রিমেন্ট আইডি" খুঁজছিলেন। সেক্ষেত্রে একটি getList সেরা বিকল্প, তবে আপনি যদি "get" ব্যবহার করতে পারেন তবে আপনার এটি ব্যবহার করা উচিত।
ফিনিক্স 128_ রিকার্ডোটি

27

সরাসরি অবজেক্ট ম্যানেজারটি ব্যবহার না করে প্রোডাক্ট ফ্যাক্টরি ইনজেকশন করুন:

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" উপায়, @ রিকার্ডোটি-র পরামর্শ অনুসারে ভাণ্ডারটি আরও ভালভাবে ব্যবহার করুন।
ফ্যাবিয়ান শেমংলার

1
এছাড়াও, আপনার পদ্ধতিটি পণ্য মডেলকে ফিরিয়ে দেবে , যখনই সংগ্রহশালা ব্যবহার করে আপনাকে একটি পণ্য ডেটা মডেল ( Api/Data/Product) দেবে, এটি একটি মডেল যা একটি বোবা-ডাউন ডিটিওতে রূপান্তরিত হয়। বিবেচনা করার মতো কিছু কারণ সেগুলি একেবারেই আলাদা।
নেভভারমাইন্ড

@ ফ্যাবিয়ানশ্মেঙ্গলার: $product = $this->productFactory->create(); $product->load($product->getIdBySku($sku)); $product->getThumbnailUrl()পণ্য থাম্বনেইল চিত্র প্রদর্শনের জন্য ব্যবহার করার চেষ্টা করা হয়েছে, তবে এটি কাজ করছে না।
স্লিমশাদ্দেদী

@ ফ্যাবিয়ানশ্মেনগলার হ্যাঁ রেপোসিটোরির সুপারিশটি @ রিকার্ডোটি উত্তর হিসাবে ভাল। তবে যদি আমি ভুল স্কুকে প্রবেশ করি তবে এটি পুরো ক্রিয়াকলাপটি ভেঙে ফেলবে এবং ব্যতিক্রম ছুঁড়ে ফেলবে, তাই এই ক্ষেত্রে আমাদের অবশ্যই নির্ভর করতে হবেproductFactory
হিমাংশু

@ হিমাংশু ব্যতিক্রমটি ধরেন। এবং সেই ক্ষেত্রে যদি আপনার একটি নতুন পণ্য উদাহরণ প্রয়োজন হয়, আপনি এখনও কারখানাটি ব্যবহার করে এটি তৈরি করতে পারেন
ফ্যাবিয়ান শেমংলার

7

আমি @ ফিনিক্স 128-রিচার্ডোটের উত্তরটি পছন্দ করি তবে কেবলমাত্র পণ্যটির অস্তিত্ব না থাকলে এমন ক্ষেত্রে একটি ব্যতিক্রম যুক্ত করব:

চেষ্টা করুন
    $ product = $ this-> productRepositoryInterface-> get ($ sku);
} ধরা (\ ম্যাজেন্টো me ফ্রেমওয়ার্ক \ ব্যতিক্রম \ 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

CSV আমদানির সময় আমার স্কু (csv এর কলাম) থেকে product_id পাওয়া দরকার এবং কেবলমাত্র product_id সংরক্ষণ করতে হবে .. কীভাবে অর্জন করবেন?
সুশীবম

0

নির্ভরতা ইনজেকশন (ডিআই) ব্যবহার করে

নির্ভরতা ইনজেকশন ব্যবহার করে ম্যাজেন্টো 2-এ পণ্যের আইডি এবং এসকিউর মাধ্যমে পণ্যের তথ্য পাওয়ার জন্য উদাহরণ কোড এখানে।

এটিতে আমাদের আমাদের মডিউলটির ব্লক শ্রেণীর নির্মাতায় \ ম্যাজেন্টো \ ক্যাটালগ \ মডেল \ প্রোডাক্ট রিপোসিটরি ক্লাসের অবজেক্টটি ইনজেক্ট করতে এবং ভিউ (.phtml) ফাইলটি থেকে অ্যাক্সেস করতে হবে।

নমুনা ফাইলের পাথ: অ্যাপ / কোড / আপনারকম্প্যানি নাম / আপনারমডুলনাম / ব্লক / আপনার কাস্টমব্লক.এফপি

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

অবজেক্ট ম্যানেজার ব্যবহার করে

অবজেক্ট ম্যানেজার ব্যবহার করে ম্যাজেন্টো 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.