Magento 2에서 제품 이미지와 URL을 얻는 방법은 무엇입니까?


16

이것은 내 관찰자입니다.

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $orderIds = $observer->getEvent()->getOrderIds();
    $order = $this->_orderRepositoryInterface->get($orderIds[0]);
    $items =$order->getAllVisibleItems();
    $productQuantity = array();
    $productPrice = array();
    $productName = array();
    $productIds = array();
    foreach($items as $item) {
        $productIds[]= $item->getProductId();
        $productName[]= $item->getSku(); 
        $productPrice[] = $item->getPrice();
        $productQuantity[]= floor($item->getQtyOrdered());
    }
}

상품에서 상품 이미지와 상품 URL을 얻으려면 어떻게해야하나요?


어떤 이벤트를 잡았습니까?
코아 TruongDinh

checkout_onepage_controller_success_action
Ramkishan Suthar

답변:


23

이 방법은 제품 이미지를 얻는 가장 좋은 방법은 아닙니다.

\Magento\Catalog\Api\ProductRepositoryInterfaceFactory생성자에 주입하십시오 .

protected $_productRepositoryFactory;

public function __construct(
        \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory
) {

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

이미지를 얻을 수 있습니다 :

$product = $this->_productRepositoryFactory->create()->getById($item->getProductId());
$product->getData('image');
$product->getData('thumbnail');
$product->getData('small_image');

당신의 대답은 옳다고하지만 내가 장바구니에 하나 개 이상의 제품이있는 경우 내가 개 이상의 제품 이미지를 보여줄 수있는 방법을 할 shoild
Ramkishan Suthar

알았어. @khoa. 하나 이상의 제작 이미지가있는 경우 고마워요
Ramkishan Suthar

작동하지 않습니다. 반환 된 값은 "/w/s/wsh10-orange_main.jpg"와 같은 문자열입니다.
Hoang Trinh

2
@piavgh는 이미지의 경로는 다음과 같습니다pub/media/catalog/product
코아 TruongDinh

1
실제 이미지를로드 할 수 있도록 <img src = ""/> 속성에서 /w/s/wsh10-orange_main.jpg를 사용하는 방법
Lachezar Raychev

18

특정 상점보기 (내가했던 것처럼)에 대한 이미지의 게시 / 캐시 프론트 엔드 URL을 원한다면 이것이 효과가 있습니다.

/**
 * @var \Magento\Store\Model\App\Emulation
 */
protected $appEmulation;

/**
 * @var \Magento\Store\Model\StoreManagerInterface
 */
protected $storeManager;

/**
 * @var \Magento\Catalog\Api\ProductRepositoryInterfaceFactory
 */
protected $productRepositoryFactory;

/**
 * @var \Magento\Catalog\Helper\ImageFactory
 */
protected $imageHelperFactory;

/**
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 * @param \Magento\Store\Model\App\Emulation $appEmulation
 * @param \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory
 * @param \Magento\Catalog\Helper\ImageFactory $helperFactory
 */
public function __construct(
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Store\Model\App\Emulation $appEmulation,
    \Magento\Catalog\Api\ProductRepositoryInterfaceFactory $productRepositoryFactory,
    \Magento\Catalog\Helper\ImageFactory $imageHelperFactory
)
{
    $this->storeManager = $storeManager;
    $this->appEmulation = $appEmulation;
    $this->productRepositoryFactory = $productRepositoryFactory;
    $this->imageHelperFactory = $imageHelperFactory;
}

그런 다음 이미지 프론트 엔드 URL을 가져와야하는 경우 :

$sku = "my-sku";
// get the store ID from somewhere (maybe a specific store?)
$storeId = $this->storeManager->getStore()->getId();
// emulate the frontend environment
$this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
// load the product however you want
$product = $this->productRepositoryFactory->create()->get($sku);
// now the image helper will get the correct URL with the frontend environment emulated
$imageUrl = $this->imageHelperFactory->create()
  ->init($product, 'product_thumbnail_image')->getUrl();
// end emulation
$this->appEmulation->stopEnvironmentEmulation();

당신은 다른 이미지 유형 외에를 선택할 수 있습니다 product_thumbnail_image: 참조 magento/theme-frontend-luma/etc/view.xml사용 가능한 제품 이미지 목록을 위해, 또는 당신의 자신을 만들 view.xml파일.


1
WTF? 그것은 단지 아프다 : D
Lachezar Raychev

방금이 솔루션을 시도했지만 반환 된 URL이 존재하지 않고 문자열이 비어 있지만 오류가 발생하지 않습니다. 'product_base_image', 'product_small_image'및 'product_thumbnail_image'로 시도했지만 아무것도 작동하지 않습니다. 조언 좀 해줄 래? 아니면 제품 리포지토리를 사용하여이 작업을 효율적으로 수행 할 수 있습니까? 이미 내 블록의 다른 곳에로드하고 있습니다.
Joshua 홍수

11

제품 URL을 반환해야하는 경우 다음과 같아야합니다.

//todo get product object $product 

$objectManager =\Magento\Framework\App\ObjectManager::getInstance();
$helperImport = $objectManager->get('\Magento\Catalog\Helper\Image');

$imageUrl = $helperImport->init($product, 'product_page_image_small')
                ->setImageFile($product->getSmallImage()) // image,small_image,thumbnail
                ->resize(380)
                ->getUrl();
echo $imageUrl;

6

그것이 내가 한 방식입니다. 매우 효율적이고 깨끗합니다.

1) 먼저 다음 클래스를 주입해야합니다.

protected $_storeManager;
protected $_appEmulation;
protected $_blockFactory;

public function __construct(
    ...
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\View\Element\BlockFactory $blockFactory,
    \Magento\Store\Model\App\Emulation $appEmulation)
{
    $this->_storeManager = $storeManager;
    $this->_blockFactory = $blockFactory;
    $this->_appEmulation = $appEmulation;
}

2) 그런 다음 아래 코드를 사용하여 getImageUrl 메소드를 작성하십시오.

protected function getImageUrl($product, string $imageType = '')
{
    $storeId = $this->_storeManager->getStore()->getId();

    $this->_appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);

    $imageBlock =  $this->_blockFactory->createBlock('Magento\Catalog\Block\Product\ListProduct');
    $productImage = $imageBlock->getImage($product, $imageType);
    $imageUrl = $productImage->getImageUrl();

    $this->_appEmulation->stopEnvironmentEmulation();

    return $imageUrl;
}

참고 : "appEmulation"코드는 관리자 또는 API 에서이 호출을 수행 할 때만 필요 합니다 . 그렇지 않으면 아래 (또는 유사한) 오류가 발생합니다.

Unable to resolve the source file for 'webapi_rest/_view/en_AU/Magento_Catalog/images/product/placeholder/.jpg'

3) 제품 객체와 원하는 이미지 유형을 전달하는 getImageUrl을 호출하십시오 ( view.xml 파일을 기반으로 함 )

...
$smallImage = $this->getImageUrl($productObject, 'product_page_image_small');
...

1

맞춤 이미지 URL을 얻기 위해이 코드를 사용했습니다. 따라서 이미지가 종료되지 않으면 기본 테마 이미지가로드됩니다.

$product = $block->getProduct();

$productImageAttr = $product->getCustomAttribute('product_banner_image');

if ($productImageAttr && $productImageAttr->getValue() != 'no_selection') {

    $productImage = $this->helper('Magento\Catalog\Helper\Image')
    ->init($product, 'product_banner_image')
    ->setImageFile($productImageAttr->getValue());

    $imageUrl = $productImage->getUrl();

} else {

    $imageUrl = $this->getViewFileUrl('images/cat-img1.jpg'); // Theme/web/images

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.