Magento2: obtenir le chemin de l'image du produit

8

J'ai créé une page personnalisée pour obtenir des produits. J'ai obtenu toutes les informations mais comment obtenir le chemin de l'image complète. J'utilise getImage (), il montre uniquement à l'image comment obtenir le chemin complet.

      <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() ?>" />
User0434
la source
veuillez partager votre code.
Rakesh Jesadiya
avez-vous besoin d'une image dans quelle taille? pleine taille d'origine, miniature ou il peut être de taille moyenne?
Bartosz Kubicki

Réponses:

2

Veuillez utiliser le code ci-dessous dans votre fichier modèle:

$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
la source
Comment savoir quelles sont les options disponibles $ImageTypedans $imageBlock->getImage($product, $ImageType):?
Shawn Northrop
1
Vous pouvez vérifier tous les $ ImageType dans le thème etc / view.xml du thème
Sneha Panchal
Cela a considérablement ralenti mes pages, mais c'est exactement ce que je veux.
harri
@SnehaPanchal, pouvons-nous utiliser $ productImage = $ this-> getBaseUrl (\ Magento \ Framework \ UrlInterface :: URL_TYPE_MEDIA). «catalogue / produit». $ _product-> getImage (); comme ci
jafar pinjar
2

Obtenez l'URL de l'image avec

$image->getImageUrl();

ou si vous voulez le sortir comme élément:

echo $image->toHtml();

OU Essayez ceci:

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

Remarque: vous devez créer un gestionnaire d'objets si vous utilisez la dernière solution.

Ronak Chauhan
la source
Qu'est-ce que $ image ici @ Ronak
User0434
comment obtenir $ product
User0434
si vous utilisez la page du produit que n'importe quel produitObjet que vous utilisez passez un seul produit ici
Ronak Chauhan
Partagez votre code de blocage, alors obtenez la bonne solution
Ronak Chauhan
2

Une chose que vous devez garder à l'esprit lorsque vous obtenez une collection de produits personnalisée est la façon dont vous filtrez la collection pour avoir des valeurs que vous devez appeler en amont. Vous dites que vous avez une page personnalisée, je suppose donc que vous créez également une collection personnalisée.

Lorsque vous le faites, vous devez filtrer ce dont vous aurez besoin. À l'intérieur de votre classe de blocs, vous aurez besoin de quelque chose comme ceci:

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

Prenez note que nous avons $collection->addFieldToSelect('small_image');un champ à sélectionner. Si vous ne le faites pas, lorsque vous passez l'appel à getImage()l'objet produit, l'URL de l'image n'aura pas (et c'est difficile à voir car les objets m2 sont énormes et difficiles à atteindre var_dump). Vous vous retrouvez donc avec une valeur de NULLretour lorsque vous appelez l'URL de l'image.

Ensuite, dans votre modèle, vous pouvez utiliser:

<?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; ?>
cerclesix
la source
1

Découvrez comment cela a été réalisé dans Magento sur la page produit / vue

Magento \ Catalog \ Block \ Product \ View \ Gallery

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

$_imageHelperest:

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

Si vous souhaitez uniquement obtenir l'URL de l'image sans avoir à restituer le code HTML complet de l'image et sans appeler plusieurs blocs, vous pouvez procéder comme suit:

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