¿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?

Ramkishan Suthar
fuente
¿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');
Khoa TruongDinh
fuente
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.

thaddeusmt
fuente
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;
Shaoqing Ma
fuente
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');
...
medina
fuente
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

}
Amit Singh
fuente