আপনার যদি API এর মাধ্যমে ম্যাজেন্টো 2 ক্যাশে সিস্টেমের সাহায্যে থাম্বনেইল চিত্রের সম্পূর্ণ পথের প্রয়োজন হয়, তবে আপনি দেশীয় ProductRepository শ্রেণীর উপর ভিত্তি করে আপনার কাস্টম এপিআই তৈরি করতে পারেন।
একটি নতুন মডিউল তৈরি করুন। (অন্যান্য পোস্টে ব্যাখ্যা করা হয়েছে)
একটি etc / webapi.xML ফাইল তৈরি করুন:
<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/custom/products/{sku}" method="GET">
<service class="Vendor\ModuleName\Api\ProductRepositoryInterface" method="get"/>
<resources>
<resource ref="Magento_Catalog::products"/>
</resources>
</route>
</routes>
একটি ইত্যাদি / di.xML ফাইল তৈরি করুন:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Vendor\ModuleName\Api\ProductRepositoryInterface" type="Vendor\ModuleName\Model\ProductRepository" />
</config>
আপনার ইন্টারফেসটি এপিআই-প্রোডাক্টরপোজিটরিআইন্টারফেস.এফপি তৈরি করুন :
namespace Vendor\ModuleName\Api;
/**
* @api
*/
interface ProductRepositoryInterface
{
/**
* Get info about product by product SKU
*
* @param string $sku
* @param bool $editMode
* @param int|null $storeId
* @param bool $forceReload
* @return \Magento\Catalog\Api\Data\ProductInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($sku, $editMode = false, $storeId = null, $forceReload = false);
}
আপনার মডেল মডেল তৈরি করুন \ ProductRepository.php :
namespace Vendor\ModuleName\Model;
class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterface
{
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $productFactory;
/**
* @var Product[]
*/
protected $instances = [];
/**
* @var \Magento\Catalog\Model\ResourceModel\Product
*/
protected $resourceModel;
/**
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $storeManager;
/**
* @var \Magento\Catalog\Helper\ImageFactory
*/
protected $helperFactory;
/**
* @var \Magento\Store\Model\App\Emulation
*/
protected $appEmulation;
/**
* ProductRepository constructor.
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Catalog\Model\ResourceModel\Product $resourceModel
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
*/
public function __construct(
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Catalog\Model\ResourceModel\Product $resourceModel,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Store\Model\App\Emulation $appEmulation,
\Magento\Catalog\Helper\ImageFactory $helperFactory
) {
$this->productFactory = $productFactory;
$this->storeManager = $storeManager;
$this->resourceModel = $resourceModel;
$this->helperFactory = $helperFactory;
$this->appEmulation = $appEmulation;
}
/**
* {@inheritdoc}
*/
public function get($sku, $editMode = false, $storeId = null, $forceReload = false)
{
$cacheKey = $this->getCacheKey([$editMode, $storeId]);
if (!isset($this->instances[$sku][$cacheKey]) || $forceReload) {
$product = $this->productFactory->create();
$productId = $this->resourceModel->getIdBySku($sku);
if (!$productId) {
throw new NoSuchEntityException(__('Requested product doesn\'t exist'));
}
if ($editMode) {
$product->setData('_edit_mode', true);
}
if ($storeId !== null) {
$product->setData('store_id', $storeId);
} else {
// Start Custom code here
$storeId = $this->storeManager->getStore()->getId();
}
$product->load($productId);
$this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
$imageUrl = $this->getImage($product, 'product_thumbnail_image')->getUrl();
$customAttribute = $product->setCustomAttribute('thumbnail', $imageUrl);
$this->appEmulation->stopEnvironmentEmulation();
// End Custom code here
$this->instances[$sku][$cacheKey] = $product;
$this->instancesById[$product->getId()][$cacheKey] = $product;
}
return $this->instances[$sku][$cacheKey];
}
/**
* Retrieve product image
*
* @param \Magento\Catalog\Model\Product $product
* @param string $imageId
* @param array $attributes
* @return \Magento\Catalog\Block\Product\Image
*/
public function getImage($product, $imageId, $attributes = [])
{
$image = $this->helperFactory->create()->init($product, $imageId)
->constrainOnly(true)
->keepAspectRatio(true)
->keepTransparency(true)
->keepFrame(false)
->resize(75, 75);
return $image;
}
}
প্রবেশ
যাও /rest/V1/custom/products/{sku}
আপনার পূর্ববর্তী ইউআরএল ক্যাশে হওয়া চিত্রের সাহায্যে থাম্বনেইল চিত্রটি উদ্ধার করা উচিত:
<custom_attributes>
<item>
<attribute_code>thumbnail</attribute_code>
<value>http://{domain}/media/catalog/product/cache/1/thumbnail/75x75/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg</value>
</item>
</custom_attributes>
মন্তব্যসমূহ:
যদি আপনি ইতিমধ্যে একই স্টোর আইডিতে থাকেন তবে ফাংশন স্টার্টইনচারমেন্টমুলেশনটির তৃতীয় প্যারামিটারটি ফ্রন্টএন্ড এরিয়া ব্যবহার করার জন্য জোর করা হয়। (এপিআই অঞ্চলের জন্য দরকারী)
আমি এই কাস্টম এপিআইটি পরীক্ষা করি না, আপনি কোডটি মানিয়ে নিতে পারেন তবে যুক্তিটি সঠিক তবে আমি অন্য কাস্টম এপিআইতে ইমেজ URL টি পুনরুদ্ধার করতে ইতিমধ্যে অংশটি পরীক্ষা করেছি tested
এই ধরণের ত্রুটিগুলি এড়াতে আপনাকে এড়াতে হবে:
http://XXXX.com/pub/static/webapi_rest/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg
Uncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg'