Magento2: получить образ пути продукта

8

Я создал пользовательскую страницу для получения продуктов. Я получил всю информацию, но как получить полный путь к изображению. Я использую getImage (), он показывает изображение только как получить полный путь.

      <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
источник
Пожалуйста, поделитесь своим кодом.
Ракеш Джесадия
Вам нужно изображение в каком размере? полный, оригинальный размер, миниатюра или это может быть какой-то средний размер?
Бартош Кубицкий

Ответы:

2

Пожалуйста, используйте код ниже в вашем файле шаблона:

$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>
Снеха Панчал
источник
Как мы знаем , что доступные параметры для $ImageTypeв: $imageBlock->getImage($product, $ImageType)?
Шон Нортроп,
1
Вы можете проверить все $ ImageType в теме / etc / view.xml
Sneha
Это значительно замедлило мои страницы, однако это именно то, что я хочу.
Харри
@SnehaPanchal, можем ли мы использовать $ productImage = $ this-> getBaseUrl (\ Magento \ Framework \ UrlInterface :: URL_TYPE_MEDIA). «каталог / продукт». $ _product-> GetImage (); как
показано
2

Получить URL изображения с

$image->getImageUrl();

или если вы хотите вывести его как элемент:

echo $image->toHtml();

ИЛИ Попробуйте это:

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

Примечание: вам нужно создать объектный менеджер, если вы используете последнее решение.

Ронак Чаухан
источник
что такое $ image здесь @ Ronak
User0434
как получить $ продукт
User0434
если вы используете страницу продукта, то какой бы продукт вы ни использовали, передайте здесь один продукт
Ронак Чаухан
Поделитесь своим блочным кодом, чтобы получить правильное решение
Ронак Чаухан
2

При получении настраиваемой коллекции продуктов следует помнить одну вещь: как фильтровать коллекцию, чтобы получить значения, которые необходимо вызывать в интерфейсе. Вы говорите, что у вас есть пользовательская страница, поэтому я предполагаю, что вы также создаете пользовательскую коллекцию.

Когда вы делаете, вы должны отфильтровать то, что вам нужно. Внутри вашего блочного класса вам понадобится что-то вроде этого:

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

Обратите внимание, что у нас $collection->addFieldToSelect('small_image');есть поле для выбора. Если вы не сделаете этого, при передаче вызова getImage()объекту продукта не будет URL-адреса изображения (и это трудно увидеть, поскольку объекты m2 огромны и трудны для понимания var_dump). Таким образом, вы получите значение NULLвозврата, когда будете вызывать URL-адрес изображения.

Тогда в вашем шаблоне вы можете использовать:

<?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; ?>
circlesix
источник
1

Посмотрите, как это достигается в magento на странице продукта / просмотра

Magento \ Каталог \ Block \ продукт \ 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;
}

где $_imageHelperнаходится:

/**
 * @var \Magento\Catalog\Helper\Image
 */
protected $_imageHelper;
zhartaunik
источник
0

Если вы хотите получить только URL-адрес изображения без необходимости отображать полный HTML-код изображения и без вызова нескольких блоков, вы можете сделать это следующим образом:

$imageUrl = $product->getMediaConfig()->getMediaUrl($product->getImage());
// Returns "https://www.example.com/media/catalog/product/y/o/your_image.jpg"
Cladiuss
источник