Mendapatkan URL gambar lengkap produk di templat

23

Saya mencoba membuat blok statis untuk menampilkan produk dinamis. Ini adalah kode yang seharusnya mendapatkan setiap kategori anak dan mencetak gambar untuk setiap produk di setiap kategori.

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
    ?><ol><?php
    foreach ($category->getChildrenCategories() as $child_category) {
        ?><li>
            <ul><?php
                foreach ($child_category->getProductCollection() as $product) {
                    ?><li><img src="<?php echo $product->getImage();?>"/><li><?php
                }
            ?></ul>
        </li><?php
    }
    ?></ol>

Ini hampir berfungsi kecuali untuk img srcs hanya "/a/b/ab001.jpg" sebagai contoh dan bukan path lengkap misalnya "/ pub / media / katalog / produk / cache / 1 / small_image / 240x300 / abc123def456 / a / b / 001.jpg "sehingga gambar tidak dapat ditemukan. Apa cara yang benar untuk mendapatkan gambar produk?

Alex
sumber
1
Jangan mencoba menggunakan Object Manager secara langsung pada template Anda. Kita harus membuat blok baru atau menggunakan kembali fungsi yang ada.
Khoa TruongDinh

Jawaban:

28

Jika blok Anda meluas Magento\Catalog\Block\Product\AbstractProduct, Anda dapat menggunakan:

$imageType = 'category_page_list'; // choose which image
$image = $block->getImage($product, $imageType);

Kemudian dapatkan URL gambar dengan

$image->getImageUrl();

atau jika Anda ingin menampilkannya sebagai <img>elemen:

echo $image->toHtml();

Jika blok Anda tidak / tidak dapat memperpanjang blok produk abstrak, Anda dapat membuat getImage()metode sendiri:

public function getImage($product, $imageId)
{
    return $this->imageBuilder->setProduct($product)
        ->setImageId($imageId)
        ->create();
}

$this->imageBuilder harus disuntikkan sebagai Magento\Catalog\Block\Product\ImageBuilder


The $imageTypeatau $imageIdvariabel harus menjadi salah satu jenis citra didefinisikan dalam tema, misalnya category_page_list.

Lihat app/design/frontend/Magento/luma/etc/view.xmluntuk semua jenis gambar dalam tema Luma, misalnya.

Di Magento 2 jenis gambar ini digunakan alih-alih menentukan lebar dan tinggi secara langsung dalam templat.

Fabian Schmengler
sumber
Saya mencoba kode Anda tetapi saya mendapatkan kesalahan iniUncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg'
ND17
@ ND17 dua pertanyaan: 1) apakah Anda menggunakan blok di area admin? Kode ini hanya ditujukan untuk frontend 2) apakah Anda telah mengonfigurasi gambar placeholder? Jika tidak dan suatu produk tidak memiliki gambar, Anda akan selalu mendapatkan kesalahan
Fabian Schmengler
1
@davideghz salah satu jenis gambar yang ditentukan dalam tema, misalnya category_page_list. Lihat: github.com/magento/magento2/blob/… di Magento 2 Anda menggunakan ini alih-alih menentukan lebar dan tinggi secara langsung dalam templat
Fabian Schmengler
3
Tahu mengapa itu akan mengembalikan placeholder alih-alih gambar yang ditugaskan?
Laura
2
Saya mengalami masalah yang sama dengan @Laura. Itu selalu mengembalikan gambar placeholder alih-alih gambar yang ditugaskan (gambar yang ditugaskan sangat terlihat di daftar produk atau halaman detail produk umum sebaliknya).
fritzmg
9

Jika Anda perlu mengubah ukuran gambar produk dan menggunakan sistem cache gambar Magento default dan Anda tidak berada di area frontend, Anda dapat menggunakan solusi ini.

Use case: Ini mungkin berguna jika Anda membutuhkan URL gambar yang diubah ukurannya pada API khusus Anda untuk aplikasi eksternal.

Kode fungsi:

/**
 * @var \Magento\Catalog\Model\ProductFactory
 */
protected $productFactory;

/**
 * @var \Magento\Catalog\Helper\ImageFactory
 */
protected $helperFactory;

/**
 * @var \Magento\Store\Model\App\Emulation
 */
protected $appEmulation;

/**
 * Constructor.
 *
 * @param \Magento\Catalog\Model\ProductFactory $productFactory
 * @param \Magento\Store\Model\App\Emulation $appEmulation
 * @param \Magento\Catalog\Helper\ImageFactory $helperFactory
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 */
public function __construct(
    \Magento\Catalog\Model\ProductFactory $productFactory,
    \Magento\Store\Model\App\Emulation $appEmulation,
    \Magento\Catalog\Helper\ImageFactory $helperFactory,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
) {
    $this->productFactory                   = $productFactory;
    $this->imageBuilder                     = $imageBuilder;
    $this->helperFactory                    = $helperFactory;
    $this->appEmulation                     = $appEmulation;
    $this->storeManager                     = $storeManager;
}

/**
 * Retrieve product image
 *
 * @param \Magento\Catalog\Model\Product $product
 * @param string $imageId
 * @param array $attributes
 * @return \Magento\Catalog\Block\Product\Image
 */
public function getImage($product, $imageId, $attributes = [])
{
    $image = $this->helperFactory->create()->init($product, $imageId)
        ->constrainOnly(true)
        ->keepAspectRatio(true)
        ->keepTransparency(true)
        ->keepFrame(false)
        ->resize(200, 300);

    return $image;
}

public function customFunction()
{
    // some stuff here

    $storeId = $this->storeManager->getStore()->getId();

    $this->appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);

    $product = $this->productFactory->create()->loadByAttribute('sku', 'productSKU');
    $imageUrl = $this->getImage($product, 'product_base_image')->getUrl();

    echo $imageUrl;

    $this->appEmulation->stopEnvironmentEmulation();

    // some stuff here
}

Contoh output:

http://{domain}/media/catalog/product/cache/1/image/200x300/e9c3970ab036de70892d86c6d221abfe/s/r/{imageName}.jpg

Komentar:

Parameter ketiga dari fungsi startEnvironmentEmulation digunakan untuk memaksa penggunaan area frontend jika Anda sudah menggunakan storeId yang sama. (berguna untuk area API)

Solusi ini menghindarkan Anda dari kesalahan seperti ini:

http://XXXX.com/pub/static/webapi_rest/_view/en_US/Magento_Catalog/images/product/placeholder/.jpg

Uncaught Magento\Framework\View\Asset\File\NotFoundException: Unable to resolve the source file for 'adminhtml/_view/en_US/Magento_Catalog/images/product/placeh‌​older/.jpg'
Franck Garnier
sumber
1
Terima kasih atas tip emulasi lingkungan, hanya apa yang saya butuhkan.
thaddeusmt
2
Persaingan lingkungan menyelamatkan hari saya. Terimakasih banyak!
medina
+1 untuk kegunaan API
tony
8

Cobalah

$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
$imageUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();
Hếng Thế Hiển
sumber
1
Yang ini bagus karena secara otomatis akan memberikan URL yang aman / tidak aman sesuai dengan permintaan saat ini
Milan Simek
3

Coba kode ini ..

$ProductImageUrl = $block->getUrl('pub/media/catalog').'product'.$_product->getImage();
Shihas Suliaman
sumber
Selamat datang di Magento SE. Jawaban yang hanya berisi satu baris kode seringkali tidak terlalu membantu. Dalam hal ini relatif jelas bagaimana garis ini seharusnya digunakan, tetapi menggunakan getUrl()bukanlah cara yang tepat bahkan jika itu dapat bekerja secara tidak sengaja. Dibutuhkan $routeparameter dalam bentuk "module / controller / action". "pub / media / katalog" terlihat seperti rute, tetapi tidak.
Fabian Schmengler
Tidak menggunakan manajer objek, jawaban yang bagus. Kalaupun hanya satu baris.
LM_Fielding
@LM_Fielding Tidak setiap jawaban yang tidak menggunakan manajer objek secara otomatis baik.
Fabian Schmengler
Coba kode ini dan
kirimkan
1

Mungkin Magento\Catalog\Helper\Product::getImageUrl()bisa membantu. Saya tidak mengerti mengapa pengembang Magento tidak mengimplementasikannya di Magento\Catalog\Helper\Imagekelas karena getUrlmetode dalam image helper tidak mengembalikan apa yang bisa diharapkan ...

tassleoff
sumber
1

Silakan coba kode ini:

$prdId = 35;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$hotPrd = $objectManager->get('Magento\Catalog\Model\Product')->load($prdId);
$store = $objectManager->get('Magento\Store\Model\StoreManagerInterface')->getStore();
echo $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $hotPrd->getThumbnail();
Abhinav Singh
sumber
1

Anda bisa menggunakan ObjectManager atau Block.

Objectmanager:

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

Blokir:

protected $_storeManagerInterface;

public function __construct(
  ...
  \Magento\Store\Model\StoreManagerInterface $storeManagerInterface,
  ...
)
{
  ...
  $this->_storeManagerInterface = $storeManagerInterface;
  ...
}

...

public function getStoreInterface($imgUrl){
   $store = $this->_storeManagerInterface->getStore();
   $storeMedia = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $imgUrl;
   return $storeMedia;
}
...

Panggil fungsi:

<img src="<?php echo $block->getStoreInterface($imgUrl) ?>"/>
Jack Rose
sumber
0

Coba kode ini

<img class="test-image" alt="image" src="<?php echo $block->getUrl('pub/media/catalog/product', ['_secure' => $block->getRequest()->isSecure()]).$product->getImage();?>" />

Semoga ini bisa membantu Anda

mrtuvn
sumber
Ini menambahkan src dari " domain.com/pub/media/catalog//a/b/ab001.jpg " yang juga tidak dapat ditemukan
Alex
Direktori produk tidak ada.
LM_Fielding
0

Dalam modul Anda:

public function getProducts()
{
    //... create collection code goes here...

    $result = [ ];

    foreach ( $collection as $product ) {
        $result[] = [
            'id'        => $product->getId(),
            '_sku'      => $product->getSku(),
            'permalink' => $product->getProductUrl($product),
            'title'     => $product->getName(),
            'raw_price' => $product->getPrice(),
            'image_url' => $this->getUrl().'pub/media/catalog/product'.$product->getImage()
        ];
    }

    return $result;
}

Kemudian di blok Anda, Anda akan mendapatkan hasil ini:

print_r($block->getProducts());

Yah, itu tidak sempurna, tetapi itu bekerja untuk saya.

Lihatlah hasilnya: masukkan deskripsi gambar di sini

WebArtisan
sumber
0

Di kelas Anda menyuntikkan dependensi StoreManagerInterface seperti:

use \Magento\Framework\View\Element\Template\Context;
use \Magento\Store\Model\StoreManagerInterface;

public function __construct(Context $context, StoreManagerInterfac $storeManager)
    {
        parent::__construct($context);
        $this->_storeManager = $storeManager;

    }

setelah dalam metode Anda, untuk mendapatkan thumbail misalnya

public function getProductThumbnail(){

        return $this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/product' . $product->getImage();
    }
Miguel
sumber
0

Anda dapat mencoba kode di bawah ini.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');
$childcategories = $category->getChildrenCategories();

foreach($childcategories as $child)
    {
echo '<li class="sub-cat">';
        $cat = $objectManager->create('Magento\Catalog\Model\Category')->load($child->getId()); 
        ?>
        <a href="<?php echo $cat->getUrl(); ?>">
        <div class="sub-title">
            <h3><?php echo $cat->getName();?></h3>
        </div> 
    <?php
        if ($_imgUrl = $cat->getImageUrl())
        {
            $_imgHtml = '<div class="category-image"><img src="' . $_imgUrl . '" alt="' . $block->escapeHtml($cat->getName()) . '" title="' . $block->escapeHtml($cat->getName()) . '" class="image" /></div>';
            $_imgHtml = $_helper->categoryAttribute($cat, $_imgHtml, 'image');
            /* @escapeNotVerified */ echo $_imgHtml;
        }  

    ?>      
    <?php echo '</a></li>'; }
    echo '</ul>';
}
Dhaval
sumber
0

Ini adalah metode kerja lain:

/** @var \Magento\Framework\UrlInterface $urlManager */
$url = $urlManager->getDirectUrl('pub/media/catalog/product' . $product->getImage());

Atau menghormati URL aman / tidak aman berdasarkan permintaan saat ini:

/** @var \Magento\Framework\UrlInterface $urlManager */
/** @var \Magento\Framework\App\RequestInterface $request */
$url = $urlManager->getDirectUrl(
    'pub/media/catalog/product' . $product->getImage(),
    ['_secure' => $request->isSecure()]
);

Saya akan menyerahkan objek objek ke imajinasi Anda sendiri.

Milan Simek
sumber
0

Kita bisa mendapatkan url Gambar Dasar dalam file phtml

$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$imageHelper  = $_objectManager->get('\Magento\Catalog\Helper\Image');
<?php $image_url = $imageHelper->init($product, 'product_base_image')->setImageFile($product->getFile())->resize($imagewidth, $imageheight)->getUrl(); ?>
Baharuni Asif
sumber