菜鸟教程小白 发表于 2022-12-13 05:22:05

ios - 从 magento 2.0 REST Api 获取多个产品图像以用于购物车列表 - Swift 4


                                            <p><p>我们正在使用 <strong>Magento 2.0</strong>。我在购物车列表页面中苦苦挣扎以显示产品图片。 </p>

<p>有了这个:</p>

<p><code>V1/carts/mine/items</code>(购物车列表 api)我无法获取产品图片。 </p>

<p>所以我使用 <code>V1/products/(sku)/media</code> api 来获取产品图像,通过在产品 sku/s 的 for 循环中调用它来在列表中显示它从购物车列表 api 中获得。 </p>

<p>我认为这不公平。因为如果我在购物车中有 10 个产品,那么我需要调用 <code>V1/products/(sku)/media</code> api 10 次,这会使我的应用程序变慢,也让我的用户厌倦了等待。当然,我可以异步加载产品图像,但即使是 10 个产品图像 api 调用 + 1 个购物车列表 api + 1 个购物车总计 api (<code>carts/mine/totals</code>) = 每个列表 12 个 api。如果发生任何编辑或删除,这应该再次发生。</p>

<p>建议一种更好的方法,或者是否有任何 url 或过滤选项可以在一个 api 中获取所有购物车产品图像?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我特此粘贴此问题的模块。</p>

<p>为rest api创建一个模块</p>

<p>按照步骤通过 Rest API 获取购物车中的产品缩略图,无需 POST 任何值。它将采用产品的当前缩略图图像。休息网址:</p>

<p>方法:GET -> rest/V1/guest-carts/cartId/items
创建模块:code/Vendor_name/Module_name/</p>

<p>registration.php</p>

<pre><code> &lt;?php

\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    &#39;VendorName_ModuleName&#39;,
    __DIR__
);
</code></pre>

<p>创建模块.xml</p>

<pre><code> &lt;?xml version=&#34;1.0&#34;?&gt;
&lt;!--
/**
* Copyright © 2018-2019 Zyxware. All rights reserved.
*/
--&gt;

    &lt;config xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:noNamespaceSchemaLocation=&#34;../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd&#34;&gt;
      &lt;module name=&#34;VendorName_ModuleName&#34; setup_version=&#34;1.0.0&#34; /&gt;
    &lt;/config&gt;
</code></pre>

<p>创建 etc/extension_attributes.xml</p>

<pre><code>    &lt;?xml version=&#34;1.0&#34;?&gt;
&lt;!--
/**
* Copyright © 2018-2019 Zyxware, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
--&gt;
&lt;config xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:noNamespaceSchemaLocation=&#34;urn:magento:framework:Api/etc/extension_attributes.xsd&#34;&gt;

    &lt;extension_attributes for=&#34;Magento\Quote\Api\Data\CartItemInterface&#34;&gt;
      &lt;attribute code=&#34;image_url&#34; type=&#34;string&#34; /&gt;
    &lt;/extension_attributes&gt;

&lt;/config&gt;
</code></pre>

<p>创建 etc/events.xml</p>

<pre><code>    &lt;?xml version=&#34;1.0&#34;?&gt;
&lt;!--
/**
* Copyright © 2018-2019 Zyxware, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
--&gt;
&lt;config xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34; xsi:noNamespaceSchemaLocation=&#34;urn:magento:framework:Event/etc/events.xsd&#34;&gt;
    &lt;event name=&#34;sales_quote_load_after&#34;&gt;
      &lt;observer name=&#34;vendorname_modulename_sales_quote_load_after&#34; instance=&#34;VendorNmae\ModuleName\Observer\ProductInterface&#34; /&gt;
    &lt;/event&gt;
&lt;/config&gt;
</code></pre>

<p>创建观察者:Vendor_name/Mocule_name/Observer/</p>

<p>ProductInterface.php</p>

<pre><code> &lt;?php
/**
* Copyright © 2018-2019 Zyxware, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace VendorName\ModuleName\Observer;

use Magento\Framework\Event\ObserverInterface;
    use Magento\Catalog\Api\ProductRepositoryInterfaceFactory as ProductRepository;
    use Magento\Catalog\Helper\ImageFactory as ProductImageHelper;
    use Magento\Store\Model\StoreManagerInterface as StoreManager;
    use Magento\Store\Model\App\Emulation as AppEmulation;
    use Magento\Quote\Api\Data\CartItemExtensionFactory;

    class ProductInterface implements ObserverInterface
    {   
      /**
         * @var ObjectManagerInterface
         */
      protected $_objectManager;

      /**
         * @var ProductRepository
         */
      protected $productRepository;

      /**
         *@var \Magento\Catalog\Helper\ImageFactory
         */
      protected $productImageHelper;

      /**
         *@var \Magento\Store\Model\StoreManagerInterface
         */
      protected $storeManager;

      /**
         *@var \Magento\Store\Model\App\Emulation
         */
      protected $appEmulation;

      /**
         * @var CartItemExtensionFactory
         */
      protected $extensionFactory;

      /**
         * @param \Magento\Framework\ObjectManagerInterface $objectManager
         * @param ProductRepository $productRepository
         * @param \Magento\Catalog\Helper\ImageFactory
         * @param \Magento\Store\Model\StoreManagerInterface
         * @param \Magento\Store\Model\App\Emulation
         * @param CartItemExtensionFactory $extensionFactory
         */
      public function __construct(
            \Magento\Framework\ObjectManagerInterface $objectManager,
            ProductRepository $productRepository,
            ProductImageHelper $productImageHelper,
            StoreManager $storeManager,
            AppEmulation $appEmulation,
            CartItemExtensionFactory $extensionFactory
      ) {
            $this-&gt;_objectManager = $objectManager;
            $this-&gt;productRepository = $productRepository;
            $this-&gt;productImageHelper = $productImageHelper;
            $this-&gt;storeManager = $storeManager;
            $this-&gt;appEmulation = $appEmulation;
            $this-&gt;extensionFactory = $extensionFactory;
      }

    public function execute(\Magento\Framework\Event\Observer $observer, string $imageType = NULL)
      {
            $quote = $observer-&gt;getQuote();

         /**
             * Code to add the items attribute to extension_attributes
             */
            foreach ($quote-&gt;getAllItems() as $quoteItem) {
                $product = $this-&gt;productRepository-&gt;create()-&gt;getById($quoteItem-&gt;getProductId());
                $itemExtAttr = $quoteItem-&gt;getExtensionAttributes();
                if ($itemExtAttr === null) {
                  $itemExtAttr = $this-&gt;extensionFactory-&gt;create();
                }


                $imageurl =$this-&gt;productImageHelper-&gt;create()-&gt;init($product, &#39;product_thumbnail_image&#39;)-&gt;setImageFile($product-&gt;getThumbnail())-&gt;getUrl();



                $itemExtAttr-&gt;setImageUrl($imageurl);
                $quoteItem-&gt;setExtensionAttributes($itemExtAttr);
            }
            return;
      }

      /**
         * Helper function that provides full cache image url
         * @param \Magento\Catalog\Model\Product
         * @return string
         */
      protected function getImageUrl($product, string $imageType = NULL)
      {
            $storeId = $this-&gt;storeManager-&gt;getStore()-&gt;getId();

            $this-&gt;appEmulation-&gt;startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
            $imageUrl = $this-&gt;productImageHelper-&gt;create()-&gt;init($product, $imageType)-&gt;getUrl();

            $this-&gt;appEmulation-&gt;stopEnvironmentEmulation();

            return $imageUrl;
      }

    }
</code></pre>

<p>Json 输出:</p>

<pre><code>    [
    {
      &#34;item_id&#34;: 5,
      &#34;sku&#34;: &#34;samplepro&#34;,
      &#34;qty&#34;: 1,
      &#34;name&#34;: &#34;samplepro&#34;,
      &#34;price&#34;: 1500,
      &#34;product_type&#34;: &#34;simple&#34;,
      &#34;quote_id&#34;: &#34;3f260b6e818d2fe56894ed6222e433f8&#34;,
      &#34;extension_attributes&#34;: {
            &#34;image_url&#34;: &#34;http://localhost/dashboard/myapi/pub/media/catalog/product/cache//beff4985b56e3afdbeabfc89641a4582/n/u/nutro_crunchy_real_apple.jpg&#34;
      }
    }
]
</code></pre>

<p>在检查您的输出之前,如果您安装了正确的方法,您可以检查您的 var/generation/Magento/Quote/Api/Data/CartItemExtension.php 的值如下:</p>

<pre><code>&lt;?php
namespace Magento\Quote\Api\Data;

/**
* Extension class for @see \Magento\Quote\Api\Data\CartItemInterface
*/
class CartItemExtension extends \Magento\Framework\Api\AbstractSimpleObject implements \Magento\Quote\Api\Data\CartItemExtensionInterface
{
    /**
   * @return string|null
   */
    public function getImageUrl()
    {
      return $this-&gt;_get(&#39;image_url&#39;);
    }

    /**
   * @param string $imageUrl
   * @return $this
   */
    public function setImageUrl($imageUrl)
    {
      $this-&gt;setData(&#39;image_url&#39;, $imageUrl);
      return $this;
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从 magento 2.0 REST Api 获取多个产品图像以用于购物车列表 - Swift 4,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54512014/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54512014/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从 magento 2.0 REST Api 获取多个产品图像以用于购物车列表 - Swift 4