Hiển thị hình ảnh trong lưới quản trị trong magento 2


24

Tôi muốn hiển thị một hình ảnh trong lưới quản trị của một trong các mô-đun của tôi.
Tôi đang sử dụng hệ thống lưới mới, hệ thống có các thành phần ui.
Tôi đã xem cách hình thu nhỏ được thêm vào lưới cho các sản phẩm, nhưng nó thuộc loại trên đầu tôi.
Thực thể của tôi không phải là EAV, là một thực thể bảng phẳng đơn giản.
Tôi đã thử thêm nó vào tập tin xml thành phần ui của tôi

<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>

nhưng nó không có hiệu lực trên lưới của tôi. không có cột hình ảnh (trường db của tôi được gọi là hình ảnh), không có lỗi, không có gì.
Ai đó có thể dẫn tôi qua việc thêm một hình ảnh vào lưới bằng các thành phần ui không?

Câu trả lời:


30

Thành phần ui xml của bạn nên có thêm điều này:

<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>

..và trong \ Modulename \ Ui \ Thành phần \ Liệt kê \ Cột \ Thumbnail.php của bạn tương tự như thế này:

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

Tôi hy vọng điều đó sẽ giúp!


Điều này đã giúp tôi ra ngoài! Tôi đã phải thay đổi một vài dòng mặc dù. Tôi đã thay đổi if($item[$fieldName] != '')đến if($item['url'] != '')'pathtoyourimage/'.$item[$fieldName]đến 'pathtoyourimage/'.$item['url']. Tôi $fieldNameđã trả lại 'hình ảnh' tuy nhiên trường db của tôi được gọi là 'url'. Phần còn lại của $item[$fieldName . '***']đã được để lại tại chỗ.
Shawn Northrop

Cảm ơn, @MageDevNL. Điều gì xảy ra nếu tôi muốn hiển thị nhiều hình ảnh khi chúng tôi nhấp vào hình ảnh thu nhỏ.
Yogesh Agarwal

hoàn thiện công việc của nó tốt Hình ảnh hiển thị! Nhưng bây giờ tôi sẽ thêm một số văn bản với hình ảnh. Tôi cố gắng nhưng không hữu ích. Bạn có thể cho tôi biết làm thế nào văn bản nối với hình ảnh. tôi chỉ muốn hiển thị hình ảnh sản phẩm và trong tên và sản phẩm dòng sản phẩm mới
HaFiz Umer

Hoàn hảo ! nó hoạt động tốt làm thế nào chúng ta có thể nối thêm một số văn bản với hình ảnh. Tôi đã hiển thị hình ảnh sản phẩm và bây giờ muốn thêm sku và tên trên dòng hình ảnh mới với cùng một cột. bạn có thể cho tôi biết làm thế nào để nối một số văn bản với hình ảnh?
HaFiz Umer

5

Trong Grid.php của bạn xác định như dưới đây

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

Tạo Image.phpdưới

\ Vendorname \ Modulename \ Block \ adminhtml \ Modulename \ Grid \ Renderer \

và dán mã bên dưới

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

Tôi nghĩ bạn đã không hiểu đúng câu hỏi. Lưới của tôi được xây dựng bằng các thành phần UI. Điều này không hoạt động với các thành phần UI.
Marius

1
câu trả lời này đã giúp tôi làm việc mà không cần sử dụng UI - các thành phần
Mujahidh

3

Chỉ cần thêm thẻ này trong ui_componenttập tin bố trí của bạn

<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>

và tạo tệp mới này mà chúng tôi đã gán trong ui_componentcột của chúng tôi

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

Trong prepareDataSource hàm bạn sẽ nhận được từng đối tượng cột.

Hy vọng điều này sẽ giúp bạn.


Có thể đưa chiều cao và chiều rộng cho hình thu nhỏ không ..
Sanjay Gohil

2

Cuối cùng, tôi có giải pháp cho câu hỏi của mình. Tôi đã thêm một cột lưới với tên khối kết xuất làm tham số.

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

Sau đó, tôi đã thêm một khối kết xuất như dưới đây:

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"/>';
    }
}

Tôi hy vọng điều này sẽ giúp bạn.


5
cảm ơn vì đã cố gắng, nhưng bạn đã không chú ý trong khi đọc câu hỏi. Tôi đang cố gắng sử dụng lưới được tạo thông qua các thành phần ui không phải với khối lưới như trong magento 1.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.