Magento 2-カスタマーグリッドにカスタム列を追加する方法


7

以下のコードを使用して、adminのカスタマーグリッドに列を追加しています。

/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は、以下のコードを使用して作成された顧客属性です。

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. Magecoder \ Magcustomer \ Ui \ Component \ Listing \ Column \ Showisapprovedを使用しない場合、カスタム列は空白になります。

ここに画像の説明を入力してください

しかし、使用する場合、変数$ dataSourceにカスタム列の値が含まれていないため、関数prepareDataSourceで顧客モデルを使用してフェッチする必要があります。データを再度フェッチせずに値を表示することはできますか?

  1. また、フィルターを使用すると、SQLエラーが生成されます。
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')

ここをご覧くださいmagento.stackexchange.com/questions/126534/… これが役立つかもしれません
Ekta Puri

回答:


5

Magento 2.1のソリューション

  • 属性を顧客グリッドインデックスに追加します。

    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>

    「indexer」要素と「fieldset」要素には、それぞれ「id」属性と「name」属性のみがあることに注意してください。構造は既存のインデクサーにマージされます。

  • 属性を「グリッドで使用」としてマークします

    インストーラーで:

            'is_used_in_grid' => true,

    そうしないと、インデクサーがcustomer_entityメインテーブルで列を検索するため、インデックス付け中に別のSQLエラーが発生します。

    SQLSTATE [42S22]:列が見つかりません:1054不明な列 'e.magcustomer_customer_approve' in 'field list'


magento 2.2のソリューションは何ですか?同じ?
アミットベラ

顧客フィールドにvarchar属性があります。この方法ではエラーは発生しませんが、並べ替えに問題があります。
Naveenbos

5

最後に解決策を得た:我々は、作成する必要がありindexer.xmlファイルの/ etc /ディフォルダを。

主なことは、グリッドに表示する必要がある「coloumn_name」を渡す必要があるview_idのview_idです。

たとえば、ここではニックネームを表示する必要があるため、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>

Magento 2.1.4で動作します


ソリューションは正常に機能しますが、エクスポート中にエラーが発生します。
Chirag Patel 2018

@ChiragPatel-はい、それは正しいです。エクスポート機能を修正または回避していないため、このカスタムモジュールで注文のエクスポート機能をオーバーライドし、同じように回避する必要があります
Manthan Dave

ありがとう、エクスポート機能をオーバーライドする方法や例がある場合は、共有してください。
Chirag Patel

1

以下の方法を使用して、顧客グリッドにカスタム列を追加します。

==>最初のモジュールを作成し、以下の手順に従ってください==>これでプラグインに慣れました。以下の場所にファイルを作成してください。

ベンダー/モジュール/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>

==>今、あなたのコレクションとテーブルを結合し、コレクションを返し、以下の場所にファイルを作成するプラグインを作成します

ベンダー/モジュール/プラグイン/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;
 }
}

==>次に、以下のフォルダとファイルを作成し、Vendor / 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="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>

===> それでは、チェックして確認してください


0

はい、次のコードを追加する必要があります。ステップ1: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>

次のコマンドを実行する必要があります:

コマンドを実行する:php bin / magentoインデクサー:reindex

幸運を


0

上記の解決策を試しましたが機能しません

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

しかし、機能していません最初に私の質問は、どのようにオーバーライドできるのindexer.xmlですか?

私があなたに提供Magento\Customer\Model\ResourceModel\Customer\Collectionし、Magento_Customer/etc/indexer.xml使用しているソリューションを確認した後Magento\Customer\Model\Indexer\Source、インデックス作成中にエラーが表示されました。

したがって、顧客属性のみを適用する必要はないと思います

$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,
        ]);

したがって、 'is_used_in_grid' => trueが必要であり、di.xmlに追加

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

または

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

そしてそれは働いています


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.