Magento 2 Cara Menambahkan Kolom Baru ke Kotak Pesanan

20

Saya telah menambahkan kolom baru ke tabel sales_orderbernama export_status, sekarang saya ingin menambahkan kolom kisi pesanan baru dengan data dari sales_orderkolom baru .

Saya sudah berhasil menambahkan kolom ke the sales_order_gridtabel.

$installer->getConnection()->addColumn($installer->getTable("sales_order_grid"), "xml_exported", [
     'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
     'comment' => 'XML Exported'
]);

Bagaimana saya bisa membuatnya benar-benar tampil di kisi pesanan dengan nilai dari sales_order export_statuskolom?

André Ferraz
sumber
Anda dapat menemukan jawabannya magento.stackexchange.com/questions/87012/...
Krishna ijjada
Saya pikir ada cara yang lebih baik untuk melakukan ini tanpa harus menerapkan pengamat dan menggunakan acara.
André Ferraz
Artikel ini menjelaskan penambahan kolom ke kotak pesanan penjualan langkah-demi-langkah: sivaschenko.com/magento2/2016/03/05/…
Sergii Ivashchenko
Coba solusinya di sini Metode ini menggunakan plugin untuk menambahkan kolom.
Asrar
Saya pikir Anda harus memeriksa ini: Tutorial yang bagus sivaschenko.com/magento2-sales-order-grid-column
Abid Malik

Jawaban:

42

Setelah banyak menggali dalam kode inti magento saya menemukan solusi untuk pertanyaan saya. Alih-alih menambahkan kolom ke grid melalui database, saya membuat komponen UI di sales_order_grid.xmlbawah[COMPANY]/[MODULE]/view/adminhtml/ui_component/sales_order_grid.xml

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="export_status" class="[COMPANY]\[MODULE]\Ui\Component\Listing\Column\Status">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="visible" xsi:type="boolean">true</item>
                    <item name="label" xsi:type="string" translate="true">XML Exported</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Kemudian buat kelas UI di bawah [COMPANY]/[MODULE]/Ui/Component/Listing/Column/Status.php

namespace [COMPANY]\[MODULE]\Ui\Component\Listing\Column;

use \Magento\Sales\Api\OrderRepositoryInterface;
use \Magento\Framework\View\Element\UiComponent\ContextInterface;
use \Magento\Framework\View\Element\UiComponentFactory;
use \Magento\Ui\Component\Listing\Columns\Column;
use \Magento\Framework\Api\SearchCriteriaBuilder;

class Status extends Column
{
    protected $_orderRepository;
    protected $_searchCriteria;

    public function __construct(ContextInterface $context, UiComponentFactory $uiComponentFactory, OrderRepositoryInterface $orderRepository, SearchCriteriaBuilder $criteria, array $components = [], array $data = [])
    {
        $this->_orderRepository = $orderRepository;
        $this->_searchCriteria  = $criteria;
        parent::__construct($context, $uiComponentFactory, $components, $data);
    }

    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as & $item) {

                $order  = $this->_orderRepository->get($item["entity_id"]);
                $status = $order->getData("export_status");

                switch ($status) {
                    case "0":
                        $export_status = "No";
                        break;
                    case "1";
                        $export_status = "Yes";
                        break;
                    default:
                        $export_status = "Failed";
                        break;

                }

                // $this->getData('name') returns the name of the column so in this case it would return export_status
                $item[$this->getData('name')] = $export_status;
            }
        }

        return $dataSource;
    }
}
André Ferraz
sumber
Ini bekerja dengan baik. Saya menghadapi masalah di mana penyesuaian ini menyebabkan bilah alat kisi pesanan dirender setelah kisi. Apakah Anda mengalami masalah ini?
Ian
@Ian saya tidak punya masalah itu. Versi Magento 2 mana yang Anda gunakan?
André Ferraz
2
CE 2.1.1. Saya menentukan masalahnya. Modul saya datang sebelum Magento_Sales berdasarkan abjad. Saya menambahkan <berikutnya> dengan ketergantungan pada Magento_Sales, menonaktifkan modul saya dan kemudian mengaktifkannya kembali. Ini memperbaiki masalah.
Ian
1
Apakah ini juga berfungsi untuk opsi ekspor? Dalam kasus saya, data yang diekspor memiliki nilai kosong.
MagePsycho
1
Demikian juga Magento 1 filter_condition_callbacktempat Anda dapat menambahkan filter khusus sendiri sesuai bidang. Tolong jangan katakan "Apa maksudmu?" kali ini;)
MagePsycho
33

Solusi saya mungkin sedikit lebih efisien karena mengikuti cara asli menambahkan kolom ke kisi, dan Anda tidak perlu memuat setiap pesanan yang ditampilkan pada halaman untuk mendapatkan data kolom (sebagai gantinya menggunakan tabel sales_order_grid sebagai gantinya). Di atas adalah contoh yang bagus tentang cara membuat penyaji yang disesuaikan.

vendor / [vendor] / [paket] /view/adminhtml/ui_component/sales_order_grid.xml

<!-- Add the column "my_column" (My Column) to the sales order grid. -->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<columns name="sales_order_columns">
    <column name="my_column">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="filter" xsi:type="string">text</item>
                <item name="label" xsi:type="string" translate="true">My Column</item>
            </item>
        </argument>
    </column>
</columns>

Harap dicatat bahwa Anda harus mengaktifkan kolom menggunakan widget tarik-turun di atas kisi pesanan sebelum muncul.

vendor / [vendor] / [package] /etc/di.xml

<!-- Sync the column "my_column" between the sales_order and sales_order_grid tables -->
<virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
    <arguments>
        <argument name="columns">
            <item name="my_column" xsi:type="string">sales_order.my_column</item>
        </argument>
    </arguments>
</virtualType>

Contoh kode pengaturan untuk menambahkan kolom ke tabel sales_order_grid (gunakan ini di skrip instal / perbarui). Kode yang sama berfungsi untuk tabel sales_order.

$setup->getConnection()->addColumn(
        $setup->getTable('sales_order_grid'),
        'my_column',
        [
            'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            'length' => 255,
            'nullable' => true,
            'comment' => 'My Column'
        ]
    );

Semoga ini bisa membantu! :-)

MageParts
sumber
Jawaban ini mengharuskan kolom tabel adalah sales_order_grid, benar?
Tero Lahtinen
@MageParts, kapan skrip ini akan berfungsi?
SagarPPanchal
1
berhasil untuk saya, terima kasih: 3 btw, karena sales_order_grid.xmlAnda harus menutup tag <listing> </listing> Anda atau itu akan mengembalikan kesalahan xml
fudu
<argumen name = "kolom"> harus diganti dengan <argumen nama = "kolom" xsi: type = "array"> dalam file di: xml. Kalau tidak, itu akan mengembalikan kesalahan berikut. 'Argumen' Elemen Dokumen Tidak Valid: Definisi jenisnya abstrak.
Saiai
1

Untuk membuat kolom baru di kisi pesanan, saya telah merujuk Magento Default Module vendor / magento / module-customer-balance

Dalam kasus saya, kolom 'custom_column' sudah ada di tabel sales_order.

Saya harus memperlihatkan kolom 'custom_column' dalam kisi pesanan

Langkah 1: Tambahkan Kolom baru di tabel sales_order_grid

        $connection = $installer->getConnection();
        if ($connection->isTableExists('sales_order_grid')) {
            $connection->addColumn(
                $connection->getTableName('sales_order_grid'),
                'custom_column',
                [
                    "type"      =>  Table::TYPE_TEXT,
                    'default'   =>  null,
                    "comment"   =>  'Custom Column'
                ]
            );
    }

Langkah 2: file di.xml di app \ code [Vendor] [NameSpace] \ etc \ di.xml

 <!-- Adding Columns in sales_order_grid-->
    <virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="custom_column" xsi:type="string">sales_order.custom_column</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="Magento\SalesArchive\Model\ResourceModel\Order\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="custom_column" xsi:type="string">sales_order.custom_column</item>
            </argument>
        </arguments>
    </virtualType>

Langkah 3: Buat file layout sales_order_grid.xml di bawah app \ code [Vendor] [NameSpace] \ view \ adminhtml \ ui_component

<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="custom_column">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">Custom Column</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Catatan: Ini telah diuji dalam versi Magento 2.2.6

Renu Mishra
sumber
0

Demo / ExtendedGrid / view / adminhtml / ui_component / sales_order_grid.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="new_column_name" class="Demo\ExtendedGrid\Ui\Component\Listing\Column\NewColumnStatus">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="sortable" xsi:type="boolean">false</item>
                    <item name="has_preview" xsi:type="string">1</item>
                    <item name="label" xsi:type="string" translate="true">New Column Name</item>
              </item>
            </argument>
        </column>
    </columns>
</listing>

Kemudian Buat Kelas UI untuk merendernya.

Demo / ExtendedGrid / Ui / Komponen / Listing / Kolom / NewColumnStatus.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Demo\ExtendedGrid\Ui\Component\Listing\Column;

/**
 * Class  NewColumnStatus
 */
class NewColumnStatus extends \Magento\Ui\Component\Listing\Columns\Column
{

    /**
     * @var string[]
     */
    protected $statuses;

   /**
     * Constructor
     *
     * @param ContextInterface $context
     * @param UiComponentFactory $uiComponentFactory
     * @param CollectionFactory $collectionFactory
     * @param array $components
     * @param array $data
     */
       public function __construct(
        \Magento\Framework\View\Element\UiComponent\ContextInterface $context,
        \Magento\Framework\View\Element\UiComponentFactory $uiComponentFactory,
        \Magento\Framework\UrlInterface $urlBuilder,
        array $components = [],
        array $data = []
    ) {
        $this->urlBuilder = $urlBuilder;
         parent::__construct($context, $uiComponentFactory, $components, $data);
    }


    /**
     * Prepare Data Source
     *
     * @param array $dataSource
     * @return void
     */
    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as &$item) {

           //put  the logic here


            }
        }

        return $dataSource;
   }
}

Jangan lupa menghapus cache.

Divya
sumber
-1

Saya telah membuat modul khusus yang akan menambahkan atribut khusus di entitas Sales Order dan kemudian ditampilkan di admin Sales Order grid.

file module.xml untuk mendefinisikan modul. app \ code \ COMPANY \ MODULE \ etc \ module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="COMPANY_MODULE" setup_version="1.0.0">
        <sequence>
            <module name="Magento_Sales"/>
            <module name="Magento_Quote"/>
            <module name="Magento_Checkout"/>
        </sequence>
    </module>
</config>

file di.xml di app \ code \ COMPANY \ MODULE \ etc \ di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <virtualType name="Magento\Sales\Model\ResourceModel\Order\Grid" type="Magento\Sales\Model\ResourceModel\Grid">
        <arguments>
            <argument name="columns" xsi:type="array">
                <item name="export_status" xsi:type="string">sales_order.export_status</item>
            </argument>
        </arguments>
    </virtualType>
</config>

InstallData.php untuk menambahkan atribut kustom export_status dalam tabel database

app \ code \ COMPANY \ MODULE \ Setup \ InstallData.php

<?php

namespace COMPANY\MODULE\Setup;

use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * EAV setup factory
     *
     * @var EavSetupFactory
     */
    private $eavSetupFactory;

    /**
     * Init
     *
     * @param EavSetupFactory $eavSetupFactory
     */
    public function __construct(EavSetupFactory $eavSetupFactory)
    {
        $this->eavSetupFactory = $eavSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var EavSetup $eavSetup */
        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
        if (version_compare($context->getVersion(), '1.0.0') < 0){      
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $salesSetup = $objectManager->create('Magento\Sales\Setup\SalesSetup');
            $salesSetup->addAttribute('order', 'export_status', ['type' =>'varchar']);
            $quoteSetup = $objectManager->create('Magento\Quote\Setup\QuoteSetup'); 
        }
    }
}

sales_order_grid.xml untuk menambahkan kolom khusus di kisi admin Pesanan Penjualan.

<?xml version="1.0" encoding="UTF-8"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <columns name="sales_order_columns">
        <column name="export_status">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" xsi:type="string" translate="true">XML Exported</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Anda dapat mengunduh modul lengkap dengan mengklik tautan di bawah ini http://vdcstaging.co.in/download/add-custom-culumn-to-admin-grid.zip

magentoguys
sumber