¿Cómo obtener la imagen del producto y la URL en Magento 2?


16

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

¿Cómo puedo obtener la imagen del producto y la URL del producto del artículo?


¿Qué evento atrapaste?
Khoa TruongDinh

checkout_onepage_controller_success_action
Ramkishan Suthar

Respuestas:


23

Es posible que esta no sea la mejor manera de obtener una imagen del producto.

Inyectar \Magento\Catalog\Api\ProductRepositoryInterfaceFactoryen nuestro constructor.

protected $_productRepositoryFactory;

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

    $this->_productRepositoryFactory = $productRepositoryFactory;
}

Podemos obtener la imagen:

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

su respuesta es correcta, pero lo shoild debo hacer si tengo más de un producto en el carrito de cómo puedo mostrar más de una imagen del producto i
Ramkishan Suthar

ok lo tengo @khoa. Si tengo más de una imagen de producción. muchas gracias
Ramkishan Suthar

Esto no está funcionando. El valor devuelto es una especie de cadena como esta "/w/s/wsh10-orange_main.jpg"
Hoang Trinh

2
@piavgh es el camino hacia la imagen:pub/media/catalog/product
Khoa TruongDinh

1
Entonces, ¿cómo uso /w/s/wsh10-orange_main.jpg en el atributo <img src = "" /> para poder cargar la imagen real
Lachezar Raychev

18

Si desea la URL de frontend publicada / caché de una imagen para una vista de tienda específica (como lo hice), esto está funcionando para mí:

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

Luego, donde sea que necesite obtener la URL de la interfaz de la imagen:

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

También puede seleccionar otros tipos de imágenes product_thumbnail_image: consulte la magento/theme-frontend-luma/etc/view.xmllista de imágenes de productos disponibles o cree las suyas propias en un view.xmlarchivo.


1
WTF? eso está enfermo: D
Lachezar Raychev

Acabo de probar esta solución y no obtengo ningún error, aunque la URL devuelta no existe y la cadena está vacía. He intentado con 'product_base_image', 'product_small_image' y 'product_thumbnail_image', ninguno de los cuales funciona. ¿Me puede aconsejar por favor? ¿O hay una manera eficiente de hacer esto usando el repositorio de productos? Como ya estoy cargando eso en otra parte de mi bloque.
Joshua Flood

11

Si necesita devolver la URL de un producto, debería verse así:

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

Así lo hice yo. Es bastante eficiente y limpio:

1) Primero, debe inyectar las siguientes clases:

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) Luego, crea un método getImageUrl con el siguiente código:

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: El código "appEmulation" solo es necesario cuando realiza esta llamada desde el administrador o para una API . De lo contrario, obtendrá el siguiente error (o similar):

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

3) Llame a getImageUrl pasando el objeto del producto y el tipo de imagen que desea (según su archivo view.xml )

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

1

Para obtener una URL de imagen personalizada, utilicé este código. Entonces, si la imagen no sale, cargará la imagen de tema predeterminada.

$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

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.