Tampilkan gambar di admin grid di magento 2

24

Saya ingin menampilkan gambar di kisi admin salah satu modul saya.
Saya menggunakan sistem grid baru, yang dengan komponen ui.
Saya melihat bagaimana thumbnail ditambahkan di grid untuk produk, tapi itu agak berlebihan.
Entitas saya bukan EAV, adalah entitas tabel datar sederhana.
Saya mencoba menambahkan ini di file xml komponen ui saya

<column name="image">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/image</item>
            <item name="sortable" xsi:type="boolean">false</item>
            <item name="altField" xsi:type="string">name</item>
            <item name="has_preview" xsi:type="string">1</item>
            <item name="label" xsi:type="string" translate="true">Image</item>
        </item>
    </argument>
</column>

tetapi tampaknya tidak berpengaruh pada grid saya. tidak ada gambar (kolom db saya disebut gambar), tidak ada kesalahan, tidak ada apa-apa.
Dapatkah seseorang memandu saya menambahkan gambar ke grid menggunakan komponen ui?

Marius
sumber

Jawaban:

30

Xui komponen ui Anda harus ditambahkan ini:

<column name="image" class="Your\Modulename\Ui\Component\Listing\Column\Thumbnail">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/thumbnail</item>
            <item name="sortable" xsi:type="boolean">false</item>
            <item name="altField" xsi:type="string">title</item>
            <item name="has_preview" xsi:type="string">1</item>
            <item name="label" xsi:type="string" translate="true">Thumbnail</item>
        </item>
    </argument>
</column>

..dan kemudian di \ Modulename \ Ui \ Component \ Listing \ Column \ Thumbnail.php Anda sesuatu yang mirip dengan ini:

<?php
namespace Your\Modulename\Ui\Component\Listing\Column;

use Magento\Catalog\Helper\Image;
use Magento\Framework\UrlInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Ui\Component\Listing\Columns\Column;

class Thumbnail extends Column
{
    const ALT_FIELD = 'title';

    /**
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $storeManager;

    /**
     * @param ContextInterface $context
     * @param UiComponentFactory $uiComponentFactory
     * @param Image $imageHelper
     * @param UrlInterface $urlBuilder
     * @param StoreManagerInterface $storeManager
     * @param array $components
     * @param array $data
     */
    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,
        Image $imageHelper,
        UrlInterface $urlBuilder,
        StoreManagerInterface $storeManager,
        array $components = [],
        array $data = []
    ) {
        $this->storeManager = $storeManager;
        $this->imageHelper = $imageHelper;
        $this->urlBuilder = $urlBuilder;
        parent::__construct($context, $uiComponentFactory, $components, $data);
    }

    /**
     * Prepare Data Source
     *
     * @param array $dataSource
     * @return array
     */
    public function prepareDataSource(array $dataSource)
    {
        if(isset($dataSource['data']['items'])) {
            $fieldName = $this->getData('name');
            foreach($dataSource['data']['items'] as & $item) {
                $url = '';
                if($item[$fieldName] != '') {
                    $url = $this->storeManager->getStore()->getBaseUrl(
                        \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
                    ).'pathtoyourimage/'.$item[$fieldName];
                }
                $item[$fieldName . '_src'] = $url;
                $item[$fieldName . '_alt'] = $this->getAlt($item) ?: '';
                $item[$fieldName . '_link'] = $this->urlBuilder->getUrl(
                    'your_module/yourentity/edit',
                    ['yourentity_id' => $item['yourentity_id']]
                );
                $item[$fieldName . '_orig_src'] = $url;
            }
        }

        return $dataSource;
    }

    /**
     * @param array $row
     *
     * @return null|string
     */
    protected function getAlt($row)
    {
        $altField = $this->getData('config/altField') ?: self::ALT_FIELD;
        return isset($row[$altField]) ? $row[$altField] : null;
    }
}

Saya harap itu membantu!

MageDevNL
sumber
Ini membantu saya! Saya harus mengubah beberapa baris. Saya mengubah if($item[$fieldName] != '')ke if($item['url'] != '')dan 'pathtoyourimage/'.$item[$fieldName]ke 'pathtoyourimage/'.$item['url']. Saya $fieldName'mengembalikan' gambar namun bidang db saya disebut 'url'. Sisanya $item[$fieldName . '***']ditinggalkan di tempat.
Shawn Northrop
Terima kasih, @MageDevNL. bagaimana jika saya ingin menampilkan banyak gambar ketika kita mengklik gambar thumbnail.
Yogesh Agarwal
menyempurnakan pekerjaannya dengan baik. Gambar ditampilkan! Tapi sekarang saya tidak ingin menambahkan beberapa teks dengan Gambar. Saya mencoba tetapi tidak berguna. Bisakah Anda ceritakan bagaimana teks ditambahkan dengan gambar? saya hanya ingin menampilkan gambar produk dan dalam sku produk baru dan nama
HaFiz Umer
Sempurna! itu bekerja dengan baik! bagaimana kita bisa menambahkan beberapa teks dengan Gambar. Saya telah menampilkan gambar produk dan sekarang ingin menambahkan sku dan nama pada baris gambar baru dengan kolom yang sama. dapatkah Anda memberi tahu saya cara menambahkan beberapa teks dengan Gambar?
HaFiz Umer
5

Dalam mendefinisikan grid.php Anda seperti di bawah ini

$this->addColumn(
    'image',
    array(
        'header' => __('Image'),
        'index' => 'image',
        'renderer'  => '\Vendorname\Modulename\Block\Adminhtml\Modulename\Grid\Renderer\Image',
    )
);

Buat di Image.phpbawah

\ Vendorname \ Modulename \ Block \ Adminhtml \ Modulename \ Grid \ Renderer \

dan rekatkan kode di bawah ini

namespace Vendorname\Modulename\Block\Adminhtml\Modulename\Grid\Renderer;

class Image extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
{
    protected $_storeManager;


    public function __construct(
        \Magento\Backend\Block\Context $context,
        \Magento\Store\Model\StoreManagerInterface $storeManager,      
        array $data = []
    ) {
        parent::__construct($context, $data);
        $this->_storeManager = $storeManager;        
    }


    public function render(\Magento\Framework\DataObject $row)
    {
        $img;
        $mediaDirectory = $this->_storeManager->getStore()->getBaseUrl(
           \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
       );
        if($this->_getValue($row)!=''):
            $imageUrl = $mediaDirectory.$this->_getValue($row);
            $img='<img src="'.$imageUrl.'" width="100" height="100"/>';
        else:
            $img='<img src="'.$mediaDirectory.'Modulename/no-img.jpg'.'" width="100" height="100"/>';
        endif;
        return $img;
    }
}
zuber bandi
sumber
Saya pikir Anda tidak mengerti pertanyaannya dengan benar. Grid saya dibuat menggunakan komponen UI. Ini tidak berfungsi dengan komponen UI.
Marius
1
jawaban ini membantu saya untuk pekerjaan saya tanpa menggunakan UI - komponen
Mujahidh
3

Cukup tambahkan tag ini di ui_componentfile tata letak Anda

<column name="logo" class="NAMESPACE\MODULENAME\Ui\Component\Listing\Columns\Logo">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/thumbnail</item>
            <!--<item name="add_field" xsi:type="boolean">true</item>-->
            <item name="sortable" xsi:type="boolean">false</item>
            <item name="altField" xsi:type="string">name</item>
            <item name="has_preview" xsi:type="string">1</item>
            <item name="label" xsi:type="string" translate="true">Brand Logo</item>
        </item>
    </argument>
</column>

dan buat file baru ini yang telah kami tetapkan di ui_componentkolom kami

<?php
namespace NAMESPACE\MODULENAME\Ui\Component\Listing\Columns;

use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Framework\View\Element\UiComponent\ContextInterface;

class Logo extends \Magento\Ui\Component\Listing\Columns\Column
{
    const NAME = 'logo';

    const ALT_FIELD = 'name';

    protected $_storeManager;

    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,        
        \Magento\Framework\UrlInterface $urlBuilder,
        array $components = [],
        array $data = [],
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ) {        
        parent::__construct($context, $uiComponentFactory, $components, $data);
        $this->_storeManager = $storeManager;
        $this->urlBuilder = $urlBuilder;
    }

    /**
    * Prepare Data Source
    *
    * @param array $dataSource
    * @return array
    */
    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            $fieldName = $this->getData('name');
            foreach ($dataSource['data']['items'] as & $item) {
                $mediaRelativePath=$this->_storeManager->getStore()->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);
                $logoPath=$mediaRelativePath.$item['logo'];
                $item[$fieldName . '_src'] = $logoPath;
                $item[$fieldName . '_alt'] = $this->getAlt($item);
                $item[$fieldName . '_link'] = $this->urlBuilder->getUrl(
                    'brand/manage/edit',
                    ['brand_id' => $item['brand_id'], 'store' => $this->context->getRequestParam('store')]
                );
                $item[$fieldName . '_orig_src'] = $logoPath;

            }
        }

        return $dataSource;
    }

    /**
    * @param array $row
    *
    * @return null|string
    */
    protected function getAlt($row)
    {
        $altField = self::ALT_FIELD;
        return isset($row[$altField]) ? $row[$altField] : null;
    }
}

Dalam prepareDataSourcefungsinya Anda akan mendapatkan setiap objek kolom.

Semoga ini bisa membantu Anda.

Keyur Shah
sumber
Apakah mungkin untuk memberikan tinggi dan lebar ke gambar kecil ..
Sanjay Gohil
2

Akhirnya, saya punya solusi untuk pertanyaan saya. Saya telah menambahkan kolom kotak dengan nama blok penyaji sebagai parameter.

$this->addColumn(
    'image',
    array(
        'header' => __('Image'),
        'index' => 'image',
        'renderer'  => '\YourVendor\YourModule\Block\Adminhtml\Inquiry\Grid\Renderer\Image',
    )
);

Kemudian saya telah menambahkan membuat blok renderer seperti di bawah ini:

namespace YourVendor\YourModule\Block\Adminhtml\Inquiry\Grid\Renderer;

use Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer;
use Magento\Framework\Object;
use Magento\Store\Model\StoreManagerInterface;

class Image extends AbstractRenderer
{
    private $_storeManager;
    /**
     * @param \Magento\Backend\Block\Context $context
     * @param array $data
     */
    public function __construct(\Magento\Backend\Block\Context $context, StoreManagerInterface $storemanager, array $data = [])
    {
        $this->_storeManager = $storemanager;
        parent::__construct($context, $data);
        $this->_authorization = $context->getAuthorization();
    }
    /**
     * Renders grid column
     *
     * @param Object $row
     * @return  string
     */
    public function render(Object $row)
    {
        $mediaDirectory = $this->_storeManager->getStore()->getBaseUrl(
            \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
        );
        $imageUrl = $mediaDirectory.'/inquiry/images'.$this->_getValue($row);
        return '<img src="'.$imageUrl.'" width="50"/>';
    }
}

Saya harap ini akan membantu Anda.

bantah vachhani
sumber
5
terima kasih sudah mencoba, tetapi Anda tidak memperhatikan saat membaca pertanyaan. Saya mencoba menggunakan kisi yang dibuat melalui komponen ui bukan dengan kisi kotak seperti pada magento 1.
Marius