ম্যাজেন্টো 2 রেস্ট এপি থাম্বনেল চিত্র url পান


12

আমরা কীভাবে বিশ্রাম এপিআইয়ের মাধ্যমে কোনও পণ্যের চিত্র থাম্বনেইল পেতে পারি।

/V1/products/{sku}/media আমাদের যেমন আপেক্ষিক url পেতে হবে "/m/b/mb01-blue-0.jpg"

এবং চিত্র url হবে baseurl/catalog/product/m/b/mb01-blue-0.jpg

এটি কাজ করে। তবে আমরা কীভাবে থাম্বনেইল পাই যা সাধারণত ক্যাশে ফোল্ডারে থাকে।


বাক্সের বাইরে এমন কোনও কার্যকারিতা নেই। আপনাকে কাস্টম এপিআই লিখতে হবে।
সিনিসা নেদেলজকোভিক

উত্তর:


10

আপনার যদি 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/placeh‌​older/.jpg'

আমি মনে করি এর \Magento\Catalog\Api\ProductRepositoryInterfaceFactoryপরিবর্তে এটি আরও ভালভাবে কাজ \Magento\Catalog\Model\ProductFactoryকরতে পারে, যেহেতু আপনি সরাসরি এসকিউ-এর get()সাহায্যে productRepositryঅবজেক্টটিতে কল করতে পারেন । কমপক্ষে, আমি এখন এটি ব্যবহার করছি।
thaddeusmt

আমরা নিজস্ব প্রোডাক্টের রিপোসিটোরি ইন্টারফেস সরবরাহ করতে উত্সাহিত করি না, কারণ ক্যাটালগ মডিউলটি সরবরাহ করে। এবং আমরা অনুমান করি যে প্রয়োজন হলে আপনি বিদ্যমানটিকে কাস্টমাইজ করবেন। কারণ আদর্শভাবে সমস্ত ক্লায়েন্ট যা ক্যাটালগের প্রোডাক্ট রিপোসিটোরি ইন্টারফেসের উপর নির্ভর করে তা আপনার পরিবর্তনের সাথে প্রভাবিত হবে না। কারেন্ট ইস্যুটির জন্য দুটি সম্ভাব্য সমাধান রয়েছে: 1. প্রোডাক্ট ইন্টেরফেসের অংশ হিসাবে ইউআরএলকে এক্সটেনশান অ্যাট্রিবিউট হিসাবে যুক্ত করুন 2. উত্সর্গীকৃত ইউআরএল রিসলভার পরিষেবাটি প্রবেশ করুন। প্রথম সমাধানটি পরিষেবার চুক্তির বর্তমান আর্কিটেকচারের সাথে খাপ খায় না কারণ এই বৈশিষ্ট্যটি কেবল পঠনযোগ্য হওয়া উচিত।
ইগোর মিনায়ায়লো

প্রকৃতপক্ষে, এই উত্তরটি এই ইস্যুটির সম্ভাব্য কাজের প্রমাণকে প্রমাণ করা। সর্বোত্তম সমাধানটি হ'ল একটি ডেডিকেটেড ইউআরএল রিসলভার পরিষেবা যুক্ত করা এবং দেশীয় ক্যাটালগ এপিআইয়ের ভিত্তিতে।
ফ্রাঙ্ক গার্নিয়ার

হাই @ ফ্রাঙ্ক গারনিয়ার আমি এই স্ক্রিনশটটিতে দেখানো হয়েছে তেমন একটি ত্রুটি পাচ্ছি prntscr.com/g5q4ak কীভাবে সমাধান করবেন দয়া করে আমাকে ধন্যবাদ প্রস্তাব করবেন?
নাগারাজু কে

আপনার ত্রুটি সুস্পষ্ট, ফাংশনটি বিদ্যমান নেই। আমি কেবল একটি কোড উদাহরণ দিচ্ছি, তবে আপনার এটির প্রয়োজনের সাথে খাপ খাইয়ে নেওয়া দরকার। উদাহরণস্বরূপ getCacheKey ফাংশন বাস্তবায়ন যেমন এখানে যেমন:vendor/magento/module-catalog/Model/ProductRepository.php:258
ফ্রাঙ্ক গার্নিয়ার

2

কেন ম্যাগেন্টো বাক্সের বাইরে এই কার্যকারিতাটি সরবরাহ করে না তার কারণগুলি হ'ল:

  • বৈশিষ্ট্য বা এক্সটেনশান বৈশিষ্ট্যযুক্ত পণ্যের অংশ হিসাবে চিত্র থাম্বনেইল URL ফিরিয়ে আনার অর্থ ডেটা অবজেক্টে কেবল পঠনযোগ্য (অ-পরিবর্তনীয়) বৈশিষ্ট্যের সমর্থন প্রবর্তন করা হবে। কারণ URL হ'ল কিছু ডেটার উপস্থাপনা। বিভিন্ন উত্স থেকে নেওয়া ডেটা, যেমন ডোমেন নাম সিস্টেম কনফিগারেশনের অন্তর্গত তবে পথটি ক্যাটালগ মডিউলটির অন্তর্ভুক্ত।
  • আপাতত ম্যাজেন্টো কোয়েরি এপিআইয়ের জন্য কেবল পঠনযোগ্য বৈশিষ্ট্য বা পরিষেবা সমর্থন করে না।

দীর্ঘমেয়াদী সমাধান হিসাবে - ক্যোয়ারী এপিআইগুলিকে এই প্রশ্নটি সমাধান করা উচিত, কারণ তারা কেবল পঠনযোগ্য এবং গণনীয় ক্ষেত্রের জন্য দক্ষতা সরবরাহ করবে। সমাধান হিসাবে আমরা সম্প্রদায়ের নিকটতম সময়টি সরবরাহ করতে পারি - আমরা ডেডিকেটেড ইউআরএল রিসলভার পরিষেবাটি প্রয়োগ / পরিচয় করিয়ে দিতে পারি যা নির্দিষ্ট সত্তার ধরণের (যেমন পণ্য, বিভাগ, চিত্র ইত্যাদি) URL প্রদান করবে introduce

একই কারণে আমরা পণ্যের ইন্টারফেসের অংশ হিসাবে পণ্য URL সরবরাহ করি না

এই ইস্যুতে উত্সর্গ করা আমার প্রতিক্রিয়া এখানে রয়েছে (পণ্য ইউআরএল): https://commune.magento.com/t5/Programming-Questions/Retrieving-the-product- URL- for-turrent-store-from-a/ mp / 55387 / হাইলাইট / সত্য # M1400


1
এই জাতীয় URL রিসলভার পরিষেবা কখন বাক্সের বাইরে পাওয়া যাবে?
ফ্রাঙ্ক গার্নিয়ার

উত্তরটি ২০১ 2017 সাল থেকে this এখন থেকেই এটি কি ম্যাজেন্টা ২.১.x ২.২.x বা ২.৩.x এ যুক্ত হয়েছে?
মার্কাস ওলসচন

1

নিম্নলিখিত url এর মাধ্যমে এটি সম্ভব হওয়া উচিত: /rest/V1/products/{sku}

এটি পণ্যটি ফিরিয়ে দেবে এবং কাস্টম_ট্রিবিউটের জন্য একটি নোড থাকতে হবে যাতে একটি থাম্বনেইল লিঙ্ক রয়েছে

<custom_attributes>
    <item>
        <attribute_code>thumbnail</attribute_code>
        <value>/m/b/mb01-blue-0.jpg</value>
    </item>
</custom_attributes>

ক্যাশে / 1 / থাম্বনেল / 88x110 / beff4985b56e3afdbeabfc89641a4582 / এম / বি / এমবি02-নীল-0.jpg এটি থাম্বনেইল অবস্থান। এটি পেতে একটি উপায় আছে?
মোহাম্মদ শামীম

/ ভি 1 / পণ্য / {স্কু} / মিডিয়া এবং / বিশ্রাম / ভি 1 / পণ্য / {স্কু the একই ফলাফল দেয় যা প্রাক্তন মিডিয়াটিকে একা দেয় এবং পরবর্তীকালে সমস্ত অন্যান্য তথ্যও দেয়।
মোহাম্মদ শামীম

@ মোহাম্মদশামীম আপনার কি কোনও কাজের সমাধান খুঁজে পেয়েছেন?
torayeff

পছন্দ করেছেন আমার ধারণা একটি লিখতে হবে। আপনার কি কোনও সুগারেশন আছে?
মোহাম্মদ শামীম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.