Magento2: obtenga la ruta de la imagen del producto

8

Creé una página personalizada para obtener productos. Obtuve toda la información, pero cómo obtener la ruta completa de la imagen. Estoy usando getImage (), muestra imágenes solo para obtener la ruta completa.

      <a href="<?php echo $this->getBaseUrl().$_item->getUrlKey();?>" title="<?php echo $_item->getName() ?>" class="product-image"><img src="<?php echo $this->getImage();?>" alt="<?php echo $_item->getName() ?>" />
Usuario0434
fuente
Por favor comparte tu código.
Rakesh Jesadiya
¿Necesitas una imagen de qué tamaño? tamaño completo, original, miniatura o puede ser de tamaño mediano?
Bartosz Kubicki

Respuestas:

2

Utilice el siguiente código en su archivo de plantilla:

$imageBlock =  $block->getLayout()->createBlock('Magento\Catalog\Block\Product\ListProduct');
$productImage = $imageBlock->getImage($product, 'category_page_grid');  /* $product pass product object here */
<a href="<?php echo $product->getProductUrl(); ?>"><?php echo $productImage->toHtml()  ?></a>
Sneha Panchal
fuente
¿Cómo sabemos para qué son las opciones disponibles $ImageTypeen $imageBlock->getImage($product, $ImageType):?
Shawn Northrop
1
Puede consultar todos los $ ImageType en el tema etc / view.xml
Sneha Panchal
Esto ralentizó significativamente mis páginas, sin embargo, es exactamente lo que quiero.
harri
@SnehaPanchal, ¿podemos usar $ productImage = $ this-> getBaseUrl (\ Magento \ Framework \ UrlInterface :: URL_TYPE_MEDIA). 'catálogo / producto'. $ _producto-> getImage (); como a continuación
jafar pinjar
2

Obtenga la URL de la imagen con

$image->getImageUrl();

o si quieres mostrarlo como elemento:

echo $image->toHtml();

O intente esto:

$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();

Nota: debe crear objectmanager si usa la última solución.

Ronak Chauhan
fuente
¿Qué es $ imagen aquí @ Ronak
Usuario0434
cómo obtener $ producto
Usuario0434
si está utilizando una página de productos que cualquier producto que esté utilizando, pase un solo producto aquí
Ronak Chauhan
Comparta su código de bloqueo, así que obtenga la solución adecuada
Ronak Chauhan
2

Una cosa que debe tener en cuenta al obtener una colección personalizada de productos es cómo filtra la colección para tener los valores que necesita que se le llamen en el front-end. Dices que tienes una página personalizada, así que supondré que también estás creando una colección personalizada.

Cuando lo haga, debe filtrar lo que necesitará. Dentro de tu clase de bloques, necesitarás algo como esto:

<?php

namespace Vendor\Namespace\Block;

use Magento\Catalog\Model\Product;

class Custompage extends \Magento\Framework\View\Element\Template {

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
        array $data = []
    ){
        $this->_productCollectionFactory = $productCollectionFactory;
        $this->_catalogProductVisibility = $catalogProductVisibility;
        parent::__construct($context, $data);
    }

    public function getProductCollection() {       
        $attrId = $this->getAttrId();
        $collection = $this->_productCollectionFactory->create();
        $collection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());
        $collection->addFieldToSelect('name');
        $collection->addFieldToSelect('price');
        $collection->addFieldToSelect('small_image');

        return $collection;
    }
}

Tenga en cuenta que tenemos $collection->addFieldToSelect('small_image');como un campo para seleccionar. Si no hace esto, cuando pase la llamada al getImage()objeto del producto no tendrá la URL de la imagen (y esto es difícil de ver ya que los objetos m2 son enormes y difíciles de ver var_dump). Por lo tanto, terminaría con un valor de NULLregresar cuando solicite la URL de la imagen.

Luego, en su plantilla puede usar:

<?php $productCollection = $block->getProductCollection(); ?>
<?php $imageBlock =  $block->getLayout()->createBlock('Magento\Catalog\Block\Product\ListProduct'); ?>
<?php if (count($productCollection)): ?>
    <?php foreach ($productCollection as $product): ?>
        <?php $productImage = $imageBlock->getImage($product, 'category_page_grid'); ?>
        <a href="<?php /* @escapeNotVerified */ echo $product->getProductUrl() ?>" class="product photo product-item-photo" tabindex="-1"><?php echo $productImage->toHtml(); ?></a>   
    <?php endforeach; ?>
<?php endif; ?>
Círculosix
fuente
1

Eche un vistazo a cómo se logró en magento en la página de producto / vista

Magento \ Catálogo \ Bloque \ Producto \ Ver \ Galería

/**
 * Retrieve collection of gallery images
 *
 * @return Collection
 */
public function getGalleryImages()
{
    $product = $this->getProduct();
    $images = $product->getMediaGalleryImages();
    if ($images instanceof \Magento\Framework\Data\Collection) {
        foreach ($images as $image) {
            /* @var \Magento\Framework\DataObject $image */
            $image->setData(
                'small_image_url',
                $this->_imageHelper->init($product, 'product_page_image_small')
                    ->setImageFile($image->getFile())
                    ->getUrl()
            );
            $image->setData(
                'medium_image_url',
                $this->_imageHelper->init($product, 'product_page_image_medium_no_frame')
                    ->setImageFile($image->getFile())
                    ->getUrl()
            );
            $image->setData(
                'large_image_url',
                $this->_imageHelper->init($product, 'product_page_image_large_no_frame')
                    ->setImageFile($image->getFile())
                    ->getUrl()
            );
        }
    }

    return $images;
}

donde $_imageHelperes:

/**
 * @var \Magento\Catalog\Helper\Image
 */
protected $_imageHelper;
zhartaunik
fuente
0

Si solo desea obtener la URL de la imagen sin tener que representar el código HTML de la imagen completa y sin llamar a varios bloques, puede hacerlo de esta manera:

$imageUrl = $product->getMediaConfig()->getMediaUrl($product->getImage());
// Returns "https://www.example.com/media/catalog/product/y/o/your_image.jpg"
Cladiuss
fuente