제품 이미지의 크기를 조정하고 기본 Magento 이미지 캐시 시스템을 사용해야하고 프런트 엔드 영역에 있지 않은 경우이 해결 방법을 사용할 수 있습니다.
사용 사례 : 외부 애플리케이션의 사용자 정의 API에서 이미지 URL 크기를 조정해야하는 경우 유용 할 수 있습니다.
기능 코드 :
/**
* @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
}
출력 예 :
http://{domain}/media/catalog/product/cache/1/image/200x300/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg
코멘트 :
startEnvironmentEmulation 함수의 세 번째 매개 변수 는 이미 동일한 storeId에있는 경우 프론트 엔드 영역을 강제로 사용하는 데 사용됩니다. (API 영역에 유용)
이 해결 방법은 이러한 종류의 오류가 발생하지 않도록합니다.
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'