Magento 2 Rest Api Küçük Resim Gör url


12

Geri kalan API ile bir ürünün URL'sini küçük resim görüntüsüne nasıl alırız?

/V1/products/{sku}/media bize göreli url "/m/b/mb01-blue-0.jpg"

ve resim url'si baseurl/catalog/product/m/b/mb01-blue-0.jpg

Bu iyi çalışıyor. Ancak genellikle önbellek klasöründe bulunan küçük resmi nasıl alırız?


Kutudan çıkar çıkmaz böyle bir işlevsellik yoktur. Özel API yazmanız gerekir.
Sinisa Nedeljkovic

Yanıtlar:


10

API aracılığıyla Magento 2 önbellek sistemi ile küçük resim görüntüsünün tam yoluna ihtiyacınız varsa, yerel ProductRepository sınıfına dayalı olarak özel API'nizi oluşturabilirsiniz.

Yeni bir modül oluşturun. (diğer yayınlarda açıklanmıştır)

Bir oluşturma vb / webapi.xml dosyası:

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

Bir oluşturma vb / di.xml dosyası:

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

Arayüzünüzü oluşturun 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);
}

Modelinizi oluşturun 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;
    }

}

Giriş

Adresine git /rest/V1/custom/products/{sku}

Küçük resim görüntüsünü, resim ön uç URL'si önbelleğe alınmış olarak almalısınız:

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

Yorumlar:

StartEnvironmentEmulation işlevinin üçüncü parametresi , zaten aynı storeId üzerindeyseniz ön uç alanının kullanımını zorlamak için kullanılır. (API alanı için yararlıdır)

Bu özel API'yi test etmiyorum, kodu uyarlayabilirsiniz, ancak mantık doğrudur, ancak diğer URL'lerde resim URL'sini almak için bölümü zaten test ettim.

Bu geçici çözüm, bu tür hatalara sahip olmanızı önler:

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'

Ben bu kudreti işi daha iyi düşünmek \Magento\Catalog\Api\ProductRepositoryInterfaceFactoryyerine \Magento\Catalog\Model\ProductFactoryArayabileceğin beri get()üzerinde productRepositrydoğrudan SKU ile nesne. En azından şu an kullanıyorum.
thaddeusmt

Kendi ProductRepositoryInterface öğesini sağlamaya teşvik etmiyoruz, çünkü Katalog modülü tarafından sağlanan bir tane var. Ve gerekirse mevcut olanı özelleştireceğinizi varsayalım. Çünkü ideal olarak Katalog'un ProductRepositoryInterface ürününe bağımlı olan tüm istemciler değişikliğinizden etkilenmemelidir. Geçerli sorun için iki olası çözüm vardır: 1. URL'yi ProductInterface öğesinin bir parçası olarak uzantı özelliği olarak ekleyin 2. Özel URL çözümleyici hizmetini tanıtın. İlk çözüm, Hizmet sözleşmesinin mevcut mimarisine uymuyor, çünkü bu özellik salt okunur olmalıdır.
Igor Minyaylo

Gerçekten de bu cevap, bu sorunun olası bir çözümünü kanıtlamaktır. En iyi çözüm, özel bir URL çözümleyici hizmeti eklemek ve yerel katalog API'sini temel almaktır.
Franck Garnier

hi @franck Garnier Bu ekran görüntüsünde gösterildiği gibi bir hata alıyorum prntscr.com/g5q4ak nasıl çözüleceğini lütfen bana teşekkür ederiz?
Nagaraju K

Hata açık, işlev yok. Size sadece bir kod örneği verdim, ancak ihtiyaçlarınıza göre uyarlamanız gerekiyor. Örneğin, aşağıdaki gibi getCacheKey işlevini uygulayın:vendor/magento/module-catalog/Model/ProductRepository.php:258
Franck Garnier

2

Magento'nun bu işlevselliği kutudan çıkarmamasının nedenleri:

  • Veri Nesnelerinde Salt Okunur (değiştirilemez) özelliklerin desteklenmesini sağlayacak nitelik veya uzantı özelliğine sahip bir ürün parçası olarak resim küçük resim URL'sini döndürmek için. Çünkü URL bazı verilerin bir temsilidir. Etki alanı adı olarak farklı kaynaklardan alınan veriler sistem yapılandırmasına aittir, ancak yol Katalog modülüne aittir.
  • Şimdilik Magento, Sorgu API'sı için salt okunur öznitelikleri veya hizmeti desteklemiyor.

Uzun vadeli bir çözüm olarak - Sorgu API'ları, salt okunur ve hesaplanan alanlar için bir yetenek sağlayacağından bu soruyu ele almalıdır. Topluluğa en yakın zaman için sağlayabileceğimiz bir çözüm olarak, belirli varlık türleri (Ürün, Kategori, Resim vb.) İçin URL döndürecek özel URL çözümleyici hizmeti uygulayabilir / sunabiliriz.

Aynı nedenden dolayı ProductInterface'in bir parçası olarak Ürün URL'sini vermiyoruz

İşte bu konuya verdiğim yanıt (Ürün URL'si): https://community.magento.com/t5/Programming-Questions/Retrieving-the-product-URL-for-the-current-store-from-a/mp / 55387 / vurgulamak doğru / # M1400


1
Böyle bir URL çözümleyici hizmeti ne zaman kutudan çıkacak?
Franck Garnier

Bu sorunun cevabı 2017'den. O zamandan bu yana Magenta 2.1.x 2.2.x veya 2.3.x sürümlerine eklendi mi?
Marcus Wolschon

1

Aşağıdaki URL ile mümkün olmalıdır: /rest/V1/products/{sku}

Bu, ürünü döndürür ve küçük resim bağlantısı içeren custom_attributes için bir düğüm olmalıdır.

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

önbellek / 1 / küçük resim / 88x110 / beff4985b56e3afdbeabfc89641a4582 / m / b / mb02-blue-0.jpg bu küçük resim konumudur. Bunu almanın bir yolu var mı?
Mohammed Shameem

/ V1 / products / {sku} / media ve / rest / V1 / products / {sku} birincisinin medyaya tek başına vermesiyle aynı sonucu verir ve daha sonra diğer tüm bilgileri de verir.
Mohammed Shameem

@MohammedShameem herhangi bir çalışma çözümü buldunuz mu?
torayeff

@torayeff henüz değil. Sanırım bir tane yazmak zorunda kalacak. Herhangi bir öneriniz var mı?
Muhammed Shameem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.