Magento2: obtém o caminho da imagem do produto

8

Criei uma página personalizada para obter produtos. Eu tenho todas as informações, mas como obter o caminho completo da imagem. Eu estou usando getImage () está mostrando a imagem apenas como obter o caminho completo.

      <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() ?>" />
Usuário0434
fonte
compartilhe seu código.
Rakesh Jesadiya
você precisa de imagem em que tamanho? tamanho original original, miniatura ou pode ser de tamanho médio?
Bartosz Kubicki

Respostas:

2

Por favor, use o código abaixo no seu arquivo de modelo:

$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
fonte
Como sabemos para que servem as opções disponíveis $ImageTypeem $imageBlock->getImage($product, $ImageType):?
Shawn Northrop
11
Você pode verificar todos os $ ImageType no do tema etc / view.xml
Sneha Panchal
Isso desacelerou significativamente minhas páginas, porém, é exatamente o que eu quero.
harri
@SnehaPanchal, podemos usar $ productImage = $ this-> getBaseUrl (\ Magento \ Framework \ UrlInterface :: URL_TYPE_MEDIA). 'catálogo / produto'. $ _product-> getImage (); Como abaixo
jafar pinjar
2

Obtenha o URL da imagem com

$image->getImageUrl();

ou se você deseja produzi-lo como elemento:

echo $image->toHtml();

OU Tente o seguinte:

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

Nota: você precisa criar um gerenciador de objetos se usar a última solução.

Ronak Chauhan
fonte
o que é de R $ imagem aqui @ Ronak
User0434
Como obter $ product
User0434
se você estiver usando a página do produto do que qualquer coisa productObject você estiver usando passar um único produto aqui
Ronak Chauhan
Compartilhe seu código de bloco, de modo a obter solução adequada
Ronak Chauhan
2

Uma coisa que você precisa ter em mente ao obter uma coleção personalizada de produtos é como você filtra a coleção para ter valores que precisam ser chamados no front-end. Você diz que possui uma página personalizada, portanto, assumirei que você está criando uma coleção personalizada também.

Quando você tiver que filtrar o que precisará. Dentro da sua classe de bloco, você precisará de algo como isto:

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

Observe que temos $collection->addFieldToSelect('small_image');como um campo para seleção. Se você não fizer isso, quando passar a chamada para getImage()o objeto do produto não terá o URL da imagem (e isso é difícil de ver, pois os objetos m2 são enormes e difíceis de fazer var_dump). Então, você acabaria NULLvoltando ao chamar o URL da imagem.

Em seguida, no seu modelo, você pode 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írculos
fonte
1

Veja como foi alcançado no magento na página do produto / visualização

Magento \ Catálogo \ Bloco \ Produto \ Visualização \ Galeria

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

onde $_imageHelperé:

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

Se você deseja obter apenas o URL da imagem sem precisar renderizar o código HTML da imagem completa e sem chamar vários blocos, faça o seguinte:

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