Magento 2 - Cách thêm một cột tùy chỉnh trong lưới khách hàng


7

Tôi đang sử dụng mã dưới đây để thêm một cột trong lưới khách hàng trong quản trị viên.

/app/code/Namespace/Module/view/adminhtml/ui_component/customer_listing.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="customer_columns" class="Magento\Customer\Ui\Component\Listing\Columns">
        <column name="magcustomer_customer_approve" class="Namespace\Module\Ui\Component\Listing\Column\Showisapproved">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">select</item>
                    <item name="editor" xsi:type="string">select</item>
                    <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item>
                    <item name="dataType" xsi:type="string">select</item>
                    <item name="label" xsi:type="string" translate="true">Is Approved</item>
                    <item name="sortOrder" xsi:type="number">51</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

/app/code/Namespace/Module/Ui/Component/Listing/Column/Showisapproved.php

<?php
namespace Namespace\Module\Ui\Component\Listing\Column;

use Magento\Framework\View\Element\UiComponent\ContextInterface;
use Magento\Framework\View\Element\UiComponentFactory;
use Magento\Ui\Component\Listing\Columns\Column;

class Showisapproved extends Column
{
    /**
     * 
     * @param ContextInterface   $context           
     * @param UiComponentFactory $uiComponentFactory   
     * @param array              $components        
     * @param array              $data              
     */
    public function __construct(
        ContextInterface $context,
        UiComponentFactory $uiComponentFactory,
        array $components = [],
        array $data = []
    ) {
        parent::__construct($context, $uiComponentFactory, $components, $data);
    }

    /**
     * Prepare Data Source
     *
     * @param array $dataSource
     * @return array
     */
    public function prepareDataSource(array $dataSource)
    {
        if (isset($dataSource['data']['items'])) {
            foreach ($dataSource['data']['items'] as & $item) {
                $item[$this->getData('name')] = 0;//Value which you want to display
            }
        }
        return $dataSource;
    }
}

magcustomer_customer_approve là thuộc tính khách hàng được tạo bằng mã bên dưới.

public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {

        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $customerEntity = $customerSetup->getEavConfig()->getEntityType('customer');
        $attributeSetId = $customerEntity->getDefaultAttributeSetId();

        /** @var $attributeSet AttributeSet */
        $attributeSet = $this->attributeSetFactory->create();
        $attributeGroupId = $attributeSet->getDefaultGroupId($attributeSetId);

        $customerSetup->addAttribute(Customer::ENTITY, 'magcustomer_customer_approve', [
            'type' => 'int',
            'label' => 'Is Approved',
            'input' => 'select',
            'required' => false,
            'visible' => true,
            'user_defined' => true,
            'sort_order' => 1001,
            'position' => 1001,
            'system' => 0,
            'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',
            'adminhtml_only'=>1,
            'default'=>0
        ]);

        $attribute = $customerSetup->getEavConfig()->getAttribute(Customer::ENTITY, 'magcustomer_customer_approve')
        ->addData([
            'attribute_set_id' => $attributeSetId,
            'attribute_group_id' => $attributeGroupId,
            'used_in_forms' => ['adminhtml_customer'],
        ]);

        $attribute->save();


    }
  1. Nếu tôi không sử dụng Magecoder \ Magcustomer \ Ui \ Thành phần \ Liệt kê \ Cột \ Showisapproved , cột tùy chỉnh sẽ trống.

nhập mô tả hình ảnh ở đây

Nhưng nếu tôi sử dụng thì tôi cần tìm nạp bằng mô hình khách hàng trong hàm ChuẩnDataSource vì biến $ dataSource không chứa giá trị của cột tùy chỉnh. Có thể hiển thị các giá trị mà không cần tìm nạp lại dữ liệu?

  1. Ngoài ra khi bộ lọc được sử dụng, một lỗi SQL được tạo ra.
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'magcustomer_customer_approve' in 'where clause'
, query was: SELECT COUNT(*) FROM `customer_grid_flat` AS `main_table` WHERE (`magcustomer_customer_approve
` = '1') AND (`magcustomer_customer_approve` = '1') AND (`magcustomer_customer_approve` = '1') AND (
`magcustomer_customer_approve` = '1') AND (`magcustomer_customer_approve` = '1')

có một cái nhìn ở đây magento.stackexchange.com/questions/126534/... có thể này có thể giúp
Ekta Puri

Câu trả lời:


5

Giải pháp cho Magento 2.1

  • Thêm thuộc tính vào chỉ mục lưới khách hàng:

    etc/indexer.xml

    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
        <indexer id="customer_grid">
            <fieldset name="customer">
                <field name="magcustomer_customer_approve" xsi:type="filterable" dataType="int"/>
            </fieldset>
        </indexer>
    </config>
    

    Lưu ý rằng các phần tử "bộ chỉ mục" và "bộ trường" chỉ có các thuộc tính "id" và "name" tương ứng. Cấu trúc được hợp nhất vào bộ chỉ mục hiện có.

  • Đánh dấu thuộc tính là "được sử dụng trong lưới"

    Trong trình cài đặt:

            'is_used_in_grid' => true,

    nếu không, bạn sẽ gặp một lỗi SQL khác trong khi lập chỉ mục, bởi vì trình chỉ mục tìm kiếm cột trong customer_entitybảng chính:

    SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định 'e.magcustomer_customer_approve' trong 'danh sách trường'


giải pháp cho magento 2.2 là gì? tương tự?
Amit Bera

Tôi có một thuộc tính varchar trong trường khách hàng, trong phương thức này không có lỗi nào xảy ra, nhưng việc sắp xếp có một số vấn đề.
Naveenbos

5

Cuối cùng cũng có giải pháp: Chúng ta cần tạo tệp indexer.xml trong thư mục / etc / di .

Điều chính là view_id trong view_id chúng ta cần vượt qua " coloumn_name " mà chúng ta cần hiển thị trong lưới.

Ví dụ ở đây tôi cần hiển thị tên hiệu vì vậy tôi đã vượt qua " biệt danh " trong view_id .

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
    <indexer id="customer_grid" view_id="nickname" class="Magento\Framework\Indexer\Action\Entity" primary="customer">
        <fieldset name="customer" source="Magento\Customer\Model\ResourceModel\Customer\Collection"
                  provider="Magento\Customer\Model\Indexer\AttributeProvider">
            <field name="nickname" xsi:type="filterable" dataType="varchar"/>
        </fieldset>
    </indexer>
</config>

Nó hoạt động trên Magento 2.1.4


Giải pháp hoạt động tốt nhưng trong khi xuất bị lỗi.
Chirag Patel

@ChiragPatel - Vâng, đúng vậy, vì tôi chưa sửa đổi / xử lý bất kỳ chức năng xuất nào, do đó, bạn cần ghi đè chức năng xuất đơn hàng trong mô-đun tùy chỉnh này và cần xử lý tương tự
Manthan Dave

Cảm ơn, nếu bạn có bất kỳ ý tưởng hoặc ví dụ nào về cách ghi đè chức năng xuất thì hãy chia sẻ.
Chirag Patel

1

Thêm một cột tùy chỉnh trong lưới khách hàng Sử dụng cách bên dưới.

==> vui lòng tạo mô-đun đầu tiên và làm theo bước bên dưới ==> Bây giờ chúng tôi đã sử dụng plugin, vui lòng tạo tệp tại vị trí bên dưới.

Nhà cung cấp / Mô-đun / 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">
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <plugin name="grid_customs_column" type="Vendor\Module\Plugin\GridCustomerJoinCollection" sortOrder="5" />
    </type>
</config>

==> Bây giờ tạo plugin để tham gia bảng với bộ sưu tập của bạn và trả lại bộ sưu tập và tạo tệp ở vị trí bên dưới

Nhà cung cấp / Mô-đun / Plugin / GridCustomerJoinCollection.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Vendor\Module\Plugin;

use Magento\Framework\Data\Collection;
use Magento\Framework\ObjectManagerInterface;

/**
 * Class CollectionPool
 */
class GridCustomerJoinCollection
{

    public static $table = 'customer_grid_flat';
    public static $leftJoinTable = 'sales_order'; // My custom table
    /**
     * Get report collection
     *
     * @param string $requestName
     * @return Collection
     * @throws \Exception
     */
    public function afterGetReport(
     \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject,
     $collection,
     $requestName
 ) {
     if($requestName == 'customer_listing_data_source')
     {
         if ($collection->getMainTable() === $collection->getConnection()->getTableName(self::$table)) {

            $leftJoinTableName = $collection->getConnection()->getTableName(self::$leftJoinTable);

            $collection
                ->getSelect()
                ->joinLeft(
                    ['co'=>$leftJoinTableName],
                    "co.customer_id = main_table.entity_id",
                    [
                        'customer_id' => 'co.customer_id',
                        'custom_filed'=> 'co.custom_filed'
                    ]
                );
                /* return data with left join customer_id from sales_order and custom_filed*/

            $where = $collection->getSelect()->getPart(\Magento\Framework\DB\Select::WHERE);

            $collection->getSelect()->setPart(\Magento\Framework\DB\Select::WHERE, $where)->group('main_table.entity_id');;

            /*echo $collection->getSelect()->__toString();die;*/

        }

     }
     return $collection;
 }
}

==> Bây giờ tạo thư mục và tệp bên dưới và thêm các cột tại Nhà cung cấp / Mô-đun / view / adminhtml / ui_component / customer_listing.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="customer_columns" class="Magento\Customer\Ui\Component\Listing\Columns">
       <column name="custom_filed">
           <argument name="data" xsi:type="array">
               <item name="config" xsi:type="array">
                   <item name="sortOrder" xsi:type="number">999</item>
                   <item name="filter" xsi:type="string">text</item>
                   <item name="label" translate="true" xsi:type="string">Customer Custom Column</item>
               </item>
           </argument>
       </column>
   </columns>
</listing>

===> Bây giờ xin vui lòng chek và xác nhận .


0

Có, bạn cần thêm mã sau đây .. Bước 1: Tạo tệp your_module / etc / indexer.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
<indexer id="customer_grid" view_id="dummy" class="Magento\Framework\Indexer\Action\Entity" primary="customer">
    <fieldset name="customer" source="Magento\Customer\Model\ResourceModel\Customer\Collection" provider="Magento\Customer\Model\Indexer\AttributeProvider">
        <field name="<your_attribute>" xsi:type="filterable" dataType="int"/>
    </fieldset>
</indexer>

Bây giờ bạn cần phải ra lệnh dưới đây:

chạy lệnh: php bin / magento indexer: reindex

chúc may mắn


0

Tôi đã thử giải pháp trên nhưng không hiệu quả

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
<indexer id="customer_grid" view_id="dummy" class="Magento\Framework\Indexer\Action\Entity" primary="customer">
    <fieldset name="customer" source="Magento\Customer\Model\ResourceModel\Customer\Collection" provider="Magento\Customer\Model\Indexer\AttributeProvider">
        <field name="is_approved" xsi:type="filterable" dataType="int"/>
    </fieldset>
</indexer>

Nhưng không hoạt động Vì vậy, đầu tiên câu hỏi của tôi là làm thế nào chúng ta có thể ghi đè indexer.xml?

Sau khi tôi kiểm tra cho bạn giải pháp bạn cung cấp Magento\Customer\Model\ResourceModel\Customer\CollectionMagento_Customer/etc/indexer.xmlsử dụng Magento\Customer\Model\Indexer\Sourcevà điều này hiển thị lỗi trong khi lập chỉ mục.

Vì vậy, tôi nghĩ rằng chúng tôi không cần bất kỳ suy nghĩ chỉ áp dụng thuộc tính khách hàng

$customerSetup->addAttribute(Customer::ENTITY, 'is_approved', [
            'type' => 'int',
            'label' => 'Approved',
            'input' => 'select',
            'source' => 'Magento\Eav\Model\Entity\Attribute\Source\Boolean',
            'value' => 0,
            'default' => 0,
            'required' => false,
            'visible' => false,
            'user_defined' => true,
            'sort_order' => 90,
            'position' => 90,
            'system' => false,
            'is_used_in_grid' => true,
            'is_visible_in_grid' => true,
            'is_filterable_in_grid' => true,
            'is_searchable_in_grid' => true,
        ]);

Vì vậy, cần 'is_use_in_grid' => true và trong di.xml thêm

<preference for="Magento\Customer\Model\Indexer\Source" type="Magento\Customer\Model\ResourceModel\Customer\Collection" />

Hoặc là

<virtualType name="Magento\Customer\Model\Indexer\Source" type="Magento\Customer\Model\ResourceModel\Customer\Collection" />

Và nó đang hoạt động


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.