แสดงภาพในตารางผู้ดูแลระบบในวีโอไอพี 2


24

ฉันต้องการที่จะแสดงภาพในตารางผู้ดูแลระบบของหนึ่งในโมดูลของฉัน
ฉันกำลังใช้ระบบกริดใหม่ระบบที่มีองค์ประกอบ UI
ฉันดูที่การเพิ่มรูปขนาดย่อในตารางสำหรับผลิตภัณฑ์ แต่มันเป็นเรื่องที่น่าสนใจ
เอนทิตีของฉันไม่ใช่ EAV เป็นเอนทิตีแบบตารางธรรมดา
ฉันลองเพิ่มในไฟล์ ui component xml ของฉัน

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

แต่มันไม่มีตะเข็บบนตะแกรงของฉัน ไม่มีภาพ (คอลัมน์ฐานข้อมูลของฉันเรียกว่าภาพ) ไม่มีข้อผิดพลาดไม่มีอะไร
ใครช่วยแนะนำให้ฉันเพิ่มภาพลงในกริดโดยใช้ส่วนประกอบ UI ได้ไหม

คำตอบ:


30

ui component xml ของคุณควรเพิ่มสิ่งนี้:

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

.. และจากนั้นใน \ Modulename \ Ui \ Component \ Listing \ Column \ Thumbnail.php สิ่งที่คล้ายกับสิ่งนี้:

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

ฉันหวังว่าจะช่วย!


สิ่งนี้ช่วยฉันออกไป! ฉันต้องเปลี่ยนสองบรรทัดแม้ว่า ผมเปลี่ยนif($item[$fieldName] != '')ไปif($item['url'] != '')และจะ'pathtoyourimage/'.$item[$fieldName] 'pathtoyourimage/'.$item['url']ฉัน$fieldNameกลับมา 'รูปภาพ' แต่ฟิลด์ db ของฉันถูกเรียกว่า 'url' ส่วนที่เหลือ$item[$fieldName . '***']ถูกทิ้งไว้ในสถานที่
Shawn Northrop

ขอบคุณ @MageDevNL จะเป็นอย่างไรถ้าฉันต้องการแสดงหลายภาพเมื่อเราคลิกที่ภาพย่อ
Yogesh Agarwal

สมบูรณ์แบบมันทำงานได้ดี ภาพที่แสดง! แต่ตอนนี้ฉันไม่ต้องการต่อท้ายข้อความด้วย Image ฉันพยายาม แต่ไม่ใช้เต็ม คุณช่วยบอกฉันทีว่าข้อความต่อท้ายด้วยภาพเป็นอย่างไร ฉันแค่ต้องการแสดงภาพผลิตภัณฑ์และในผลิตภัณฑ์ใหม่ sku และชื่อ
HaFiz Umer

สมบูรณ์แบบ! มันใช้งานได้ดี! เราจะต่อท้ายข้อความด้วยภาพได้อย่างไร ฉันแสดงภาพผลิตภัณฑ์และตอนนี้ต้องการผนวก sku และชื่อในบรรทัดใหม่ของภาพด้วยคอลัมน์เดียวกัน คุณช่วยบอกฉันทีว่าต่อท้ายข้อความด้วยรูปภาพได้อย่างไร
HaFiz Umer

5

ใน grid.php ของคุณกำหนดดังนี้

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

สร้างImage.phpภายใต้

\ Vendorname \ modulename \ บล็อก \ Adminhtml \ modulename \ กริด \ Renderer \

และวางรหัสด้านล่าง

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

ฉันคิดว่าคุณไม่เข้าใจคำถามที่ถูกต้อง กริดของฉันกำลังสร้างโดยใช้ส่วนประกอบ UI สิ่งนี้ไม่ทำงานกับองค์ประกอบ UI
Marius

1
คำตอบนี้ช่วยให้ฉันทำงานโดยไม่ใช้ UI - ส่วนประกอบ
Mujahidh

3

เพียงเพิ่มแท็กนี้ในui_componentไฟล์เลย์เอาต์ของคุณ

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

และสร้างไฟล์ใหม่นี้ซึ่งเราได้กำหนดไว้ในui_componentคอลัมน์ของเรา

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

ในprepareDataSourceฟังก์ชั่นคุณจะได้รับวัตถุแต่ละคอลัมน์

หวังว่านี่จะช่วยคุณได้


เป็นไปได้หรือไม่ที่จะให้ความสูงและความกว้างกับภาพขนาดย่อ ..
Sanjay Gohil

2

ในที่สุดฉันมีทางออกสำหรับคำถามของฉัน ฉันได้เพิ่มคอลัมน์กริดที่มีชื่อบล็อกการแสดงผลเป็นพารามิเตอร์

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

จากนั้นฉันได้เพิ่มสร้างบล็อก renderer ดังนี้:

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

ฉันหวังว่านี่จะช่วยคุณได้


5
ขอบคุณที่ทดลองใช้ แต่คุณไม่ได้สนใจในขณะที่อ่านคำถาม ฉันกำลังพยายามใช้กริดที่สร้างขึ้นโดยใช้ส่วนประกอบของ UI ที่ไม่ใช่บล็อกกริดเหมือนในวีโอไอพี 1
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.