Magento 2 बाकी Api थंबनेल छवि url मिलता है


12

हम रेस्ट एपीआई के माध्यम से किसी उत्पाद की छवि को url कैसे प्राप्त करते हैं।

/V1/products/{sku}/media हमें इस तरह के रिश्तेदार यूआरएल मिल जाएगा "/m/b/mb01-blue-0.jpg"

और छवि url होगी baseurl/catalog/product/m/b/mb01-blue-0.jpg

यह ठीक काम करता है। लेकिन हम कैसे थंबनेल प्राप्त करते हैं जो आमतौर पर कैश फ़ोल्डर में रहता है।


बॉक्स से बाहर ऐसी कोई कार्यक्षमता नहीं है। आपको कस्टम एपीआई लिखना होगा।
सिनिसा नेडेलजकोविक

जवाबों:


10

यदि आपको एपीआई के माध्यम से Magento 2 कैश सिस्टम के साथ थंबनेल छवि के पूर्ण पथ की आवश्यकता है, तो आप अपने कस्टम API को मूल ProductRepository वर्ग के आधार पर बना सकते हैं।

एक नया मॉड्यूल बनाएँ। (अन्य पोस्ट में बताया गया है)

एक आदि / 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>

अपना इंटरफ़ेस बनाएं Api \ ProductRepositoryInterface.php :

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);
}

अपना मॉडल बनाएं Model \ 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}

आपको थंबनेल सीमांकित URL के साथ थंबनेल छवि को पुनः प्राप्त करना चाहिए:

<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>

टिप्पणियाँ :

फ़ंक्शन startEnvironmentEmulation का तीसरा पैरामीटर फ्रंटएंड क्षेत्र के उपयोग को बाध्य करने के लिए उपयोग किया जाता है यदि आप पहले से ही एक ही स्टोर पर हैं। (एपीआई क्षेत्र के लिए उपयोगी)

मैं इस कस्टम एपीआई का परीक्षण नहीं करता हूं, आप कोड को अनुकूलित कर सकते हैं लेकिन तर्क सही है लेकिन मैंने पहले से ही अन्य कस्टम एपीआई में छवि URL को पुनः प्राप्त करने के लिए परीक्षण किया है।

इस प्रकार की त्रुटियां होने पर इस समाधान से बचें:

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कर सकता है, क्योंकि आप सीधे SKU के साथ ऑब्जेक्ट get()पर कॉल कर सकते productRepositryहैं। कम से कम, कि मैं अब क्या उपयोग कर रहा हूँ।
thaddeusmt

हम खुद को ProductRepositoryInterface प्रदान करने के लिए प्रोत्साहित नहीं करते हैं, क्योंकि कैटलॉग मॉड्यूल द्वारा प्रदान किया गया एक है। और हमें लगता है कि आप मौजूदा एक को अनुकूलित करेंगे यदि आवश्यक हो। क्योंकि आदर्श रूप से कैटलॉग के ProductRepositoryInterface पर निर्भर सभी ग्राहक आपके परिवर्तन से प्रभावित नहीं होने चाहिए। सही मुद्दे के लिए दो संभावित समाधान हैं: 1. एक्सटेंशन विशेषता के रूप में ProductInterface के भाग के रूप में URL जोड़ें 2. समर्पित URL रिज़ॉल्वर सेवा। पहला समाधान सेवा अनुबंध की वर्तमान वास्तुकला के लायक नहीं है, क्योंकि यह विशेषता केवल-पढ़ने के लिए होनी चाहिए।
इगोर मिनायलो

वास्तव में, यह उत्तर इस मुद्दे के संभावित समाधान का प्रमाण देना है। सबसे अच्छा समाधान एक समर्पित URL रिज़ॉल्वर सेवा को जोड़ना और देशी कैटलॉग एपीआई पर आधारित है।
फ्रेंक गार्नियर

hi @franck Garnier मुझे एक त्रुटि मिल रही है जैसा कि इस स्क्रीनशॉट में दिखाया गया है prntscr.com/g5q4ak कृपया कैसे हल करें मुझे सुझाव दें धन्यवाद?
नागराजू के

आप त्रुटि स्पष्ट है, फ़ंक्शन मौजूद नहीं है। मैं आपको केवल एक कोड उदाहरण देता हूं, लेकिन आपको इसे अपनी आवश्यकताओं के साथ अनुकूलित करने की आवश्यकता है। उदाहरण के लिए getCacheKey फ़ंक्शन को यहां लागू करें:vendor/magento/module-catalog/Model/ProductRepository.php:258
फ्रेंक गार्नियर

2

Magento बॉक्स से बाहर इस कार्यक्षमता प्रदान नहीं करता है कारण हैं:

  • विशेषता या एक्सटेंशन विशेषता वाले उत्पाद के एक भाग के रूप में छवि थंबनेल URL को वापस करने के लिए जिसका अर्थ डेटा ऑब्जेक्ट में रीड-ओनली (गैर-परिवर्तनीय) विशेषताओं के समर्थन को प्रस्तुत करना होगा। क्योंकि URL कुछ डेटा का प्रतिनिधित्व है। डोमेन नाम के रूप में अलग-अलग स्रोतों से लिया गया डेटा सिस्टम कॉन्फ़िगरेशन से संबंधित है, लेकिन पथ कैटलॉग मॉड्यूल से संबंधित है।
  • अभी के लिए Magento, Query API के लिए केवल-पढ़ने के लिए विशेषता या सेवा का समर्थन नहीं करता है।

एक दीर्घकालिक समाधान के रूप में - क्वेरी एपीआई को इस सवाल का समाधान करना चाहिए, क्योंकि वे केवल-पढ़ने और गणना वाले क्षेत्रों के लिए एक क्षमता प्रदान करेंगे। एक समाधान के रूप में हम समुदाय को निकटतम समय प्रदान कर सकते हैं - हम समर्पित URL रिज़ॉल्वर सेवा को लागू / शुरू कर सकते हैं जो विशिष्ट इकाई प्रकारों (जैसे उत्पाद, श्रेणी, छवि आदि) के लिए URL लौटाएगा।

उसी कारण से हम Product URL को ProductInterface के एक भाग के रूप में प्रदान नहीं करते हैं

यहाँ इस मुद्दे (उत्पाद URL) के लिए मेरी प्रतिक्रिया समर्पित है: https://community.magento.com/t5/Programming-Questions/Retrieving-the-product-URL-for-the-current-store-from-a/mp / 55387 / हाइलाइट / सच # M1400


1
ऐसी URL रिसॉल्वर सेवा बॉक्स से कब उपलब्ध होगी?
फ्रेंक गार्नियर

इसका उत्तर 2017 से है। क्या इसे तब से मजेंटा 2.1.x 2.2.x या 2.3.x में जोड़ा गया है?
मार्कस वोल्सचॉन

1

यह निम्नलिखित यूआरएल के साथ संभव होना चाहिए: /rest/V1/products/{sku}

यह उत्पाद लौटाएगा और इसमें custom_attributes के लिए एक नोड होना चाहिए जिसमें एक थंबनेल लिंक है

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

कैश / 1 / थंबनेल / 88x110 / beff4985b56e3afdbeabfc89641a4582 / m / b / mb02-blue-0.jpg यह थंबनेल स्थान है। क्या इसे पाने का कोई तरीका है?
मोहम्मद शमीम

/ V1 / उत्पादों / {sku} / मीडिया और / बाकी / V1 / उत्पादों / {sku} वही परिणाम देता है जो पूर्व अकेले मीडिया को देता है और बाद में अन्य सभी जानकारी भी देता है।
मोहम्मद शमीम

@MohammedShameem क्या आपको कोई काम करने वाला समाधान मिल गया है?
Torayeff

@torayeff अभी तक नहीं। मुझे लगता है कि एक लिखना होगा। क्या आपके पास कोई शर्करा है?
मोहम्मद शमीम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.