Magento – Magento 2 – Displaying Data on backend customer grid

customer-gridmagento2notice

I need help with this line of code.

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

XML is,

<?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">
        <column name="updated_at" class="Mvn\Cam\Ui\Component\Listing\Column\ReferralColumn">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="filter" xsi:type="string">text</item>
                    <item name="label" translate="true" xsi:type="string">Updated At</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Error on Magento admin,

Notice: Undefined index: updated_at in C:\xampp\htdocs\Buyani\app\code\Mvn\Cam\Ui\Component\Listing\Column\ReferralColumn.php on line 31

I just want to display the updated_at column from the database to the customer grid at Magento admin.

Best Answer

You can follow these steps to display updated_at column in your customer's grid.

Create customer_listing.xml file here in your custom module

app/code/Vendor/Module/view/adminhtml/ui_component/customer_listing.xml

Content for this file is

<?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="updated_at" class="Magento\Ui\Component\Listing\Columns\Date" component="Magento_Ui/js/grid/columns/date" sortOrder="100">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="label" xsi:type="string" translate="true">Updated At</item>
                    <item name="filter" xsi:type="string">dateRange</item>
                    <item name="sortOrder" xsi:type="number">100</item>
                </item>
            </argument>
        </column>
    </columns>
</listing>

Create di.xml file here in your custom module

app/code/Vendor/Module/etc/di.xml

Content for this file is...

<?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\Customer\Model\ResourceModel\Grid\Collection" type="Vendor\Module\Ui\Component\Listing\CustomerDataProvider">
        <arguments>
            <argument name="mainTable" xsi:type="string">customer_grid_flat</argument>
            <argument name="resourceModel" xsi:type="string">Magento\Customer\Model\ResourceModel\Customer</argument>
        </arguments>
    </virtualType>
</config>

Now you need to create one CustomerDataProvider UI component file here

app/code/Vendor/Module/Ui/Component/Listing/CustomerDataProvider.php

Content for this file is...

<?php

namespace Vendor\Module\Ui\Component\Listing;

class CustomerDataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult
{
   protected function _initSelect()
   {
      parent::_initSelect();
      $this->getSelect()->joinLeft(
        ['ce' => $this->getTable('customer_entity')],
        'main_table.entity_id = ce.entity_id',
        ['updated_at']
      );
      return $this;
  }
}

That's it.

Hope this will work for you!