Si vous devez redimensionner l'image du produit et utiliser le système de cache d'image Magento par défaut et que vous n'êtes pas dans la zone frontend, vous pouvez utiliser cette solution de contournement.
Cas d'utilisation: il peut être utile si vous avez besoin de redimensionner les URL des images sur votre API personnalisée pour une application externe.
Code de fonction:
/**
* @var \Magento\Catalog\Model\ProductFactory
*/
protected $productFactory;
/**
* @var \Magento\Catalog\Helper\ImageFactory
*/
protected $helperFactory;
/**
* @var \Magento\Store\Model\App\Emulation
*/
protected $appEmulation;
/**
* Constructor.
*
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Store\Model\App\Emulation $appEmulation
* @param \Magento\Catalog\Helper\ImageFactory $helperFactory
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
*/
public function __construct(
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Store\Model\App\Emulation $appEmulation,
\Magento\Catalog\Helper\ImageFactory $helperFactory,
\Magento\Store\Model\StoreManagerInterface $storeManager,
) {
$this->productFactory = $productFactory;
$this->imageBuilder = $imageBuilder;
$this->helperFactory = $helperFactory;
$this->appEmulation = $appEmulation;
$this->storeManager = $storeManager;
}
/**
* 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(200, 300);
return $image;
}
public function customFunction()
{
// some stuff here
$storeId = $this->storeManager->getStore()->getId();
$this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
$product = $this->productFactory->create()->loadByAttribute('sku', 'productSKU');
$imageUrl = $this->getImage($product, 'product_base_image')->getUrl();
echo $imageUrl;
$this->appEmulation->stopEnvironmentEmulation();
// some stuff here
}
L'exemple de sortie:
http://{domain}/media/catalog/product/cache/1/image/200x300/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg
Commentaires :
Le troisième paramètre de la fonction startEnvironmentEmulation est utilisé pour forcer l'utilisation de la zone frontend si vous êtes déjà sur le même storeId. (utile pour la zone API)
Cette solution de contournement vous évite d'avoir ce type d'erreurs:
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/placeholder/.jpg'