Magento 2 Rest Api lấy hình ảnh thu nhỏ url


12

Làm cách nào để chúng tôi có được url để thu nhỏ hình ảnh của sản phẩm thông qua API còn lại.

/V1/products/{sku}/media sẽ cho chúng tôi các url tương đối như "/m/b/mb01-blue-0.jpg"

và url hình ảnh sẽ là baseurl/catalog/product/m/b/mb01-blue-0.jpg

Điều này hoạt động tốt. Nhưng làm thế nào để chúng ta có được hình thu nhỏ thường nằm trong thư mục bộ đệm.


Không có chức năng như vậy ra khỏi hộp. Bạn sẽ phải viết API tùy chỉnh.
Sinisa Nedeljkovic

Câu trả lời:


10

Nếu bạn cần đường dẫn đầy đủ của hình ảnh thu nhỏ với hệ thống bộ đệm Magento 2 thông qua API, bạn có thể tạo API tùy chỉnh của mình dựa trên lớp ProductRep repository gốc.

Tạo một mô-đun mới. (giải thích trong các bài viết khác)

Tạo tệp 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>

Tạo một tệp 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>

Tạo giao diện của bạn Api \ ProductRep repositoryInterface.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);
}

Tạo mô hình của bạn Model \ ProductRep repository.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;
    }

}

Truy cập

Đi đến /rest/V1/custom/products/{sku}

Bạn nên truy xuất hình ảnh thu nhỏ với URL lối vào hình ảnh được lưu trong bộ nhớ cache:

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

Bình luận :

Tham số thứ ba của hàm startEn Môi trường mô phỏng được sử dụng để buộc sử dụng vùng giao diện nếu bạn đã ở trên cùng một storeId. (hữu ích cho khu vực API)

Tôi không kiểm tra API tùy chỉnh này, bạn có thể điều chỉnh mã nhưng logic là đúng nhưng tôi đã kiểm tra phần để truy xuất URL hình ảnh trong API tùy chỉnh khác.

Cách giải quyết này tránh cho bạn có loại lỗi này:

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'

Tôi nghĩ rằng việc sức mạnh này tốt hơn với các \Magento\Catalog\Api\ProductRepositoryInterfaceFactorythay vì \Magento\Catalog\Model\ProductFactory, kể từ khi bạn có thể gọi get()trên productRepositryđối tượng với các SKU trực tiếp. Ít nhất, đó là những gì tôi đang sử dụng.
thaddeusmt

Chúng tôi không khuyến khích cung cấp ProductRep repositoryInterface của riêng mình, vì có một mô-đun được cung cấp bởi mô-đun Danh mục. Và chúng tôi cho rằng bạn sẽ tùy chỉnh một cái hiện có nếu cần. Bởi vì lý tưởng là tất cả các khách hàng phụ thuộc vào ProductRep repositoryInterface của Catalog sẽ không bị ảnh hưởng với thay đổi của bạn. Có hai giải pháp khả thi cho vấn đề hiện tại: 1. Thêm URL như một phần của ProductInterface làm thuộc tính mở rộng 2. Tích hợp dịch vụ trình phân giải URL chuyên dụng. Giải pháp đầu tiên không phù hợp với kiến ​​trúc hiện tại của hợp đồng dịch vụ, vì thuộc tính này chỉ ở chế độ đọc.
Igor Minyaylo

Thật vậy, câu trả lời này là đưa ra bằng chứng một cách giải quyết có thể có của vấn đề này. Giải pháp tốt nhất là thêm dịch vụ phân giải URL chuyên dụng và dựa trên API danh mục gốc.
Franck Garnier

hi @franck Garnier tôi đang gặp lỗi như trong ảnh chụp màn hình này prntscr.com/g5q4ak làm thế nào để giải quyết xin vui lòng đề nghị tôi cảm ơn?
Nagaraju K

Bạn lỗi là rõ ràng, chức năng không tồn tại. Tôi chỉ cung cấp cho bạn một ví dụ mã, nhưng bạn cần điều chỉnh nó với nhu cầu của bạn. Ví dụ: triển khai hàm getCacheKey như ở đây:vendor/magento/module-catalog/Model/ProductRepository.php:258
Franck Garnier

2

Những lý do tại sao Magento không cung cấp chức năng này ra khỏi hộp là tiếp theo:

  • Để trả về URL hình thu nhỏ hình ảnh như một phần của Sản phẩm có thuộc tính hoặc thuộc tính mở rộng có nghĩa là giới thiệu hỗ trợ các thuộc tính Chỉ đọc (không thể sửa đổi) trong Đối tượng Dữ liệu. Bởi vì URL là một đại diện của một số dữ liệu. Dữ liệu được lấy từ các nguồn khác nhau, vì tên miền thuộc về cấu hình hệ thống, nhưng đường dẫn thuộc về mô-đun Danh mục.
  • Hiện tại Magento không hỗ trợ các thuộc tính hoặc dịch vụ chỉ đọc cho API truy vấn.

Là một giải pháp dài hạn - API truy vấn sẽ giải quyết câu hỏi này, vì chúng sẽ cung cấp khả năng cho các trường chỉ đọc và tính toán. Là một giải pháp chúng tôi có thể cung cấp cho cộng đồng trong thời gian gần nhất - chúng tôi có thể triển khai / giới thiệu dịch vụ trình phân giải URL chuyên dụng sẽ trả lại URL cho các loại thực thể cụ thể (như Sản phẩm, Danh mục, Hình ảnh, v.v.)

Vì lý do tương tự, chúng tôi không cung cấp URL sản phẩm như một phần của ProductInterface

Đây là câu trả lời của tôi dành cho vấn đề này (URL sản phẩm): https://community.magento.com/t5/Programming-Questions/Retrieving-the-product-URL-for-the-cản-store-from-a/mp / 55387 / tô sáng / đúng # M1400


1
Khi nào một dịch vụ phân giải URL như vậy sẽ có sẵn ngoài hộp?
Franck Garnier

Câu trả lời là từ năm 2017. Điều này đã được thêm vào trong Magenta 2.1.x 2.2.x hay 2.3.x kể từ đó?
Marcus Wolschon

1

Nó có thể với url sau: /rest/V1/products/{sku}

Điều này sẽ trả về sản phẩm và cần có một nút cho custom_attribut chứa liên kết hình thu nhỏ

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

bộ nhớ cache / 1 / hình thu nhỏ / 88x110 / beff4985b56e3afdbablesfc89641a4582 / m / b / mb02-blue-0.jpg đây là vị trí hình thu nhỏ. Có cách nào để có được điều này?
Mohammed Shameem

/ V1 / sản phẩm / {sku} / media và / rest / V1 / sản phẩm / {sku} cho kết quả tương tự trước đây chỉ cung cấp cho phương tiện truyền thông và sau này cũng cung cấp tất cả các thông tin khác.
Mohammed Shameem

@MohammedShameem bạn có tìm được giải pháp làm việc nào không?
torayeff

@torayeff chưa. Tôi đoán sẽ phải viết một. Bạn có bất kỳ suggments?
Mohammed Shameem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.