Como obter imagem e URL do produto no Magento 2?

16

Este é o meu observador:

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());
    }
}

Como posso obter a imagem e o URL do produto no item?

Ramkishan Suthar
fonte
Qual evento você pegou?
precisa saber é o seguinte
checkout_onepage_controller_success_action
Ramkishan Suthar

Respostas:

23

Dessa forma, pode não ser a melhor maneira de obter uma imagem do produto.

Injete \Magento\Catalog\Api\ProductRepositoryInterfaceFactoryem nosso construtor.

protected $_productRepositoryFactory;

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

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

Podemos obter a imagem:

$product = $this->_productRepositoryFactory->create()->getById($item->getProductId());
$product->getData('image');
$product->getData('thumbnail');
$product->getData('small_image');
Khoa TruongDinh
fonte
sua resposta é certo, mas o que shoild eu faço se eu tiver mais de um produto no carrinho Como posso mostrar mais do que uma imagem do produto
Ramkishan Suthar
ok, entendi @khoa. se eu tiver mais de uma imagem de produção. muito obrigado
Ramkishan Suthar
Isto não está a funcionar. O valor retornado é algum tipo de string como este "/w/s/wsh10-orange_main.jpg"
Hoang Trinh
2
@piavgh é o caminho para a imagem:pub/media/catalog/product
Khoa TruongDinh
11
Então, como posso usar /w/s/wsh10-orange_main.jpg em <img src = "" /> atributo para que eu possa carregar a imagem real
Lachezar Raychev
17

Se você deseja o URL de front-end publicado / cache de uma imagem para uma visualização de loja específica (como eu fiz), isso está funcionando para mim:

/**
 * @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;
}

Então, sempre que você precisar obter o URL do front-end da imagem:

$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();

Você pode selecionar outros tipos de imagens além product_thumbnail_image: consulte magento/theme-frontend-luma/etc/view.xmluma lista de imagens de produtos disponíveis ou crie suas próprias em um view.xmlarquivo.

thaddeusmt
fonte
11
WTF? que está doente: D
Lachezar Raychev 2/17 /
Tentei esta solução e não estou recebendo nenhum erro, embora o URL retornado não exista e a string esteja vazia. Eu tentei com 'product_base_image', 'product_small_image' e 'product_thumbnail_image', nenhum dos quais funciona. Você pode aconselhar por favor? Ou existe uma maneira eficiente de fazer isso usando o repositório do produto? Como eu já estou carregando isso em outro lugar do meu bloco.
Joshua Flood
11

Se você precisar retornar um URL do produto, ele deve se parecer com o seguinte:

//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;
Shaoqing Ma
fonte
6

Foi assim que eu fiz. é bastante eficiente e limpo:

1) Primeiro, você precisa injetar as seguintes classes:

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) Crie um método getImageUrl com o código abaixo:

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

Nota: O código "appEmulation" é necessário apenas quando você faz essa chamada pelo administrador ou por uma API . Caso contrário, você receberá o erro abaixo (ou similar):

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

3) Chame o getImageUrl passando o objeto do produto e o tipo de imagem que você deseja (com base no seu arquivo view.xml )

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

Para obter o URL da imagem personalizada, usei esse código. Portanto, se a imagem não sair, ela carregará a imagem do tema padrão.

$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

}
Amit Singh
fonte