Magento2: Bildpfad des Produkts abrufen

8

Ich habe eine benutzerdefinierte Seite zum Abrufen von Produkten erstellt. Ich habe alle Informationen erhalten, aber wie man den vollständigen Bildpfad erhält. Ich benutze getImage (), es zeigt nur das Bild, wie man den vollständigen Pfad erhält.

      <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
quelle
Bitte teilen Sie Ihren Code.
Rakesh Jesadiya
Benötigen Sie ein Bild in welcher Größe? Voll, Originalgröße, Miniaturbild oder mittelgroß?
Bartosz Kubicki

Antworten:

3

Bitte verwenden Sie den folgenden Code in Ihrer Vorlagendatei:

$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
quelle
Woher wissen wir, wofür die verfügbaren Optionen sind $ImageType: $imageBlock->getImage($product, $ImageType)?
Shawn Northrop
1
Sie können alle $ ImageType in Themes etc / view.xml
Sneha Panchal
Dies hat meine Seiten erheblich verlangsamt, ist aber genau das, was ich will.
Harris
@SnehaPanchal, können wir $ productImage = $ this-> getBaseUrl (\ Magento \ Framework \ UrlInterface :: URL_TYPE_MEDIA) verwenden. 'Katalog / Produkt'. $ _product-> getImage (); wie unten
Jafar Pinjar
2

Holen Sie sich die Bild-URL mit

$image->getImageUrl();

oder wenn Sie es als Element ausgeben möchten:

echo $image->toHtml();

ODER Versuchen Sie Folgendes:

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

Hinweis: Sie müssen einen Objektmanager erstellen, wenn Sie die letzte Lösung verwenden.

Ronak Chauhan
quelle
Was ist $ Bild hier @ Ronak
User0434
Wie bekomme ich $ Produkt
User0434
Wenn Sie eine Produktseite als das von Ihnen verwendete Produktobjekt verwenden, übergeben Sie hier ein einzelnes Produkt
Ronak Chauhan,
Teilen Sie Ihren Blockcode mit, damit Sie die richtige Lösung finden
Ronak Chauhan,
2

Eine Sache, die Sie beachten müssen, wenn Sie eine benutzerdefinierte Sammlung von Produkten erhalten, ist, wie Sie die Sammlung filtern, um Werte zu erhalten, die Sie im Front-End aufrufen müssen. Sie sagen, Sie haben eine benutzerdefinierte Seite, daher gehe ich davon aus, dass Sie auch eine benutzerdefinierte Sammlung erstellen.

Wenn Sie dies tun, müssen Sie herausfiltern, was Sie benötigen. In Ihrer Blockklasse benötigen Sie ungefähr Folgendes:

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

Beachten Sie, dass wir $collection->addFieldToSelect('small_image');als Feld zur Auswahl haben. Wenn Sie dies nicht tun, wird beim Weiterleiten des Aufrufs an getImage()das Produktobjekt die Bild-URL nicht angezeigt (und dies ist schwer zu erkennen, da die m2-Objekte riesig und schwer zu erkennen sind var_dump). Sie würden also den Wert haben NULL, zurück zu kommen, wenn Sie die Bild-URL aufrufen.

Dann können Sie in Ihrer Vorlage Folgendes verwenden:

<?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; ?>
Kreismix
quelle
1

Schauen Sie sich auf der Produkt- / Ansichtsseite an, wie es in Magento erreicht wurde

Magento \ Katalog \ Block \ Produkt \ Ansicht \ Galerie

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

wo $_imageHelperist:

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

Wenn Sie nur die Bild-URL abrufen möchten, ohne den vollständigen Bild-HTML-Code rendern zu müssen und ohne mehrere Blöcke aufzurufen, haben Sie folgende Möglichkeiten:

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