Magento 2 Rest Apiサムネイル画像のURLを取得


12

REST APIを使用して、製品のサムネイル画像へのURLを取得する方法を教えてください。

/V1/products/{sku}/media 次のような相対URLを取得します "/m/b/mb01-blue-0.jpg"

画像のURLは baseurl/catalog/product/m/b/mb01-blue-0.jpg

これは正常に機能します。しかし、通常はキャッシュフォルダーにあるサムネイルをどのように取得しますか。


すぐに使える機能はありません。カスタムAPIを作成する必要があります。
シニサ

回答:


10

APIを介したMagento 2キャッシュシステムでサムネイル画像の完全なパスが必要な場合は、ネイティブのProductRepositoryクラスに基づいてカスタムAPIを作成できます。

新しいモジュールを作成します。(他の投稿で説明)

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>

etc / 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の3番目のパラメーターは、同じstoreIdをすでに使用している場合にフロントエンドエリアの使用を強制するために使用されます。(APIエリアに便利)

私はこのカスタムAPIをテストしません。コードを調整することはできますが、ロジックは正しいですが、他のカスタムAPIで画像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'

SKUを使用してオブジェクトを直接呼び出すことができるため、これはの\Magento\Catalog\Api\ProductRepositoryInterfaceFactory代わりに使用した方がうまくいくと思います。少なくとも、それは私が今使用しているものです。\Magento\Catalog\Model\ProductFactoryget()productRepositry
-thaddeusmt

Catalogモジュールによって提供されるものがあるため、独自のProductRepositoryInterfaceを提供することはお勧めしません。そして、必要に応じて既存のものをカスタマイズするとします。理想的には、CatalogのProductRepositoryInterfaceに依存するすべてのクライアントが変更の影響を受けないようにするためです。現在の問題を解決する方法は2つあります。1. ProductInterfaceの一部としてURLを拡張属性として追加します。2.専用のURLリゾルバーサービスを導入します。この属性は読み取り専用である必要があるため、最初のソリューションはサービスコントラクトの現在のアーキテクチャに適合しません。
イゴールミニャイロ

実際、この答えは、この問題の可能な回避策を証拠に示すことです。最適な解決策は、専用のURLリゾルバーサービスを追加し、ネイティブカタログAPIに基づくことです。
フランクガルニエ

このスクリーンショットに示すように@franckハイテクガルニエ私はエラーを取得していますprntscr.com/g5q4ak 私に感謝を提案してください解決する方法?
ナガラジュK

エラーは明示的であり、関数は存在しません。コード例を示しますが、ニーズに合わせて調整する必要があります。例えば、このようなここなどgetCacheKey機能を実装:vendor/magento/module-catalog/Model/ProductRepository.php:258
フランク・ガルニエ

2

Magentoがすぐにこの機能を提供しない理由は次のとおりです。

  • 属性または拡張子属性を持つ製品の一部として画像サムネイルURLを返すこと。これは、データオブジェクトで読み取り専用(変更不可)属性のサポートを導入することを意味します。URLは一部のデータの表現であるためです。ドメイン名はシステム構成に属しますが、パスはカタログモジュールに属するため、異なるソースから取得したデータ。
  • 現在のところ、MagentoはクエリAPIの読み取り専用属性またはサービスをサポートしていません。

長期的なソリューションとして–クエリAPIは、読み取り専用フィールドと計算フィールドの機能を提供するため、この質問に対処する必要があります。コミュニティに最も近い時間を提供できるソリューションとして、特定のエンティティタイプ(製品、カテゴリ、画像など)のURLを返す専用のURLリゾルバサービスを実装/導入できます。

同じ理由で、ProductInterfaceの一部として製品URLを提供しません

この問題(製品URL)に捧げられた私の応答はここにあります:https : //community.magento.com/t5/Programming-Questions/Retrieving-the-product-URL-for-the-current-store-from-a/mp / 55387 / highlight / true#M1400


1
そのようなURLリゾルバサービスは、いつから利用可能になりますか?
フランクガルニエ

答えは2017年です。それ以降、Magenta 2.1.x 2.2.xまたは2.3.xに追加されましたか?
マーカスウォルション

1

次のURLで可能になるはずです。 /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>

cache / 1 / thumbnail / 88x110 / beff4985b56e3afdbeabfc89641a4582 / m / b / mb02-blue-0.jpgこれはサムネイルの場所です。これを取得する方法はありますか?
モハメッドシャミーム

/ V1 / products / {sku} / mediaと/ rest / V1 / products / {sku}は、前者がメディアのみを提供し、後者が他のすべての情報も提供するのと同じ結果をもたらします。
モハメッドシャミーム16

@MohammedShameem実用的なソリューションを見つけましたか?
-torayeff

@torayeffはまだありません。私は1つを書かなければならないと思います。何か提案はありますか?
モハメッドシャミーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.