Yes, I have did this functionality in one of my project.
To overwrite customer grid you need to overwrite UI component.
First of all create etc/di.xml in your module with below code.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Customer\Ui\Component\DataProvider" type="Your\Module\Ui\DataProvider\Customer\DataProvider" />
</config>
I have tried to extend Magento\Customer\Ui\Component\DataProvider in my Customer\DataProvider file but it was creating issue to get customer collection filter with "website_id". So, I have implement main interface file. And used all functions of interface file.
Create Your\Module\Ui\DataProvider\Customer\DataProvider.php file with below code.
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Your\Module\Ui\DataProvider\Customer;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\ReportingInterface;
use Magento\Framework\Api\Search\SearchCriteria;
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
use Magento\Framework\Api\Search\SearchResultInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Customer\Api\Data\AttributeMetadataInterface;
class DataProvider implements \Magento\Framework\View\Element\UiComponent\DataProvider\DataProviderInterface
{
/**
* @var AttributeRepository
*/
private $attributeRepository;
protected $_authSession;
/**
* Data Provider name
*
* @var string
*/
protected $name;
/**
* Data Provider Primary Identifier name
*
* @var string
*/
protected $primaryFieldName;
/**
* Data Provider Request Parameter Identifier name
*
* @var string
*/
protected $requestFieldName;
/**
* @var array
*/
protected $meta = [];
/**
* Provider configuration data
*
* @var array
*/
protected $data = [];
/**
* @var ReportingInterface
*/
protected $reporting;
/**
* @var FilterBuilder
*/
protected $filterBuilder;
/**
* @var SearchCriteriaBuilder
*/
protected $searchCriteriaBuilder;
/**
* @var RequestInterface
*/
protected $request;
/**
* @var SearchCriteria
*/
protected $searchCriteria;
/**
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param Reporting $reporting
* @param SearchCriteriaBuilder $searchCriteriaBuilder
* @param RequestInterface $request
* @param FilterBuilder $filterBuilder
* @param AttributeRepository $attributeRepository
* @param array $meta
* @param array $data
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
ReportingInterface $reporting,
SearchCriteriaBuilder $searchCriteriaBuilder,
RequestInterface $request,
FilterBuilder $filterBuilder,
\Magento\Customer\Ui\Component\Listing\AttributeRepository $attributeRepository,
\Magento\Backend\Model\Auth\Session $authSession,
array $meta = [],
array $data = []
) {
$this->request = $request;
$this->filterBuilder = $filterBuilder;
$this->name = $name;
$this->primaryFieldName = $primaryFieldName;
$this->requestFieldName = $requestFieldName;
$this->reporting = $reporting;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->meta = $meta;
$this->data = $data;
$this->attributeRepository = $attributeRepository;
$this->_authSession = $authSession;
$this->prepareUpdateUrl();
}
/**
* @return void
*/
protected function prepareUpdateUrl()
{
if (!isset($this->data['config']['filter_url_params'])) {
return;
}
foreach ($this->data['config']['filter_url_params'] as $paramName => $paramValue) {
if ('*' == $paramValue) {
$paramValue = $this->request->getParam($paramName);
}
if ($paramValue) {
$this->data['config']['update_url'] = sprintf(
'%s%s/%s/',
$this->data['config']['update_url'],
$paramName,
$paramValue
);
$this->addFilter(
$this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
);
}
}
}
/**
* Get Data Provider name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Get primary field name
*
* @return string
*/
public function getPrimaryFieldName()
{
return $this->primaryFieldName;
}
/**
* Get field name in request
*
* @return string
*/
public function getRequestFieldName()
{
return $this->requestFieldName;
}
/**
* @return array
*/
public function getMeta()
{
return $this->meta;
}
/**
* Get field Set meta info
*
* @param string $fieldSetName
* @return array
*/
public function getFieldSetMetaInfo($fieldSetName)
{
return isset($this->meta[$fieldSetName]) ? $this->meta[$fieldSetName] : [];
}
/**
* @param string $fieldSetName
* @return array
*/
public function getFieldsMetaInfo($fieldSetName)
{
return isset($this->meta[$fieldSetName]['children']) ? $this->meta[$fieldSetName]['children'] : [];
}
/**
* @param string $fieldSetName
* @param string $fieldName
* @return array
*/
public function getFieldMetaInfo($fieldSetName, $fieldName)
{
return isset($this->meta[$fieldSetName]['children'][$fieldName])
? $this->meta[$fieldSetName]['children'][$fieldName]
: [];
}
/**
* @inheritdoc
*/
public function addFilter(\Magento\Framework\Api\Filter $filter)
{
$this->searchCriteriaBuilder->addFilter($filter);
}
/**
* self::setOrder() alias
*
* @param string $field
* @param string $direction
* @return void
*/
public function addOrder($field, $direction)
{
$this->searchCriteriaBuilder->addSortOrder($field, $direction);
}
/**
* Set Query limit
*
* @param int $offset
* @param int $size
* @return void
*/
public function setLimit($offset, $size)
{
$this->searchCriteriaBuilder->setPageSize($size);
$this->searchCriteriaBuilder->setCurrentPage($offset);
}
/**
* @param SearchResultInterface $searchResult
* @return array
*/
protected function searchResultToOutput(SearchResultInterface $searchResult)
{
$arrItems = [];
$arrItems['items'] = [];
foreach ($searchResult->getItems() as $item) {
$itemData = [];
foreach ($item->getCustomAttributes() as $attribute) {
$itemData[$attribute->getAttributeCode()] = $attribute->getValue();
}
$arrItems['items'][] = $itemData;
}
$arrItems['totalRecords'] = $searchResult->getTotalCount();
return $arrItems;
}
/**
* Returns search criteria
*
* @return \Magento\Framework\Api\Search\SearchCriteria
*/
public function getSearchCriteria()
{
if (!$this->searchCriteria) {
$this->searchCriteria = $this->searchCriteriaBuilder->create();
$this->searchCriteria->setRequestName($this->name);
}
return $this->searchCriteria;
}
/**
* Get config data
*
* @return array
*/
public function getConfigData()
{
return isset($this->data['config']) ? $this->data['config'] : [];
}
/**
* Set data
*
* @param mixed $config
* @return void
*/
public function setConfigData($config)
{
$this->data['config'] = $config;
}
/**
* Returns Search result
*
* @return SearchResultInterface
*/
public function getSearchResult()
{
return $this->reporting->search($this->getSearchCriteria());
}
/**
* {@inheritdoc}
*/
public function getData()
{
$user = $this->_authSession->getUser();
/// I have get "website_id" from user custom attribute $user->getWebsiteRestrictions() you can get current website id
if($user->getWebsiteRestrictions() != 0){
/// Called "website_id" filter functionality.
$this->addFilter(
$this->filterBuilder->setField('website_id')->setValue($user->getWebsiteRestrictions())->setConditionType('eq')->create()
);
}
$data = $this->searchResultToOutput($this->getSearchResult());
foreach ($this->attributeRepository->getList() as $attributeCode => $attributeData) {
foreach ($data['items'] as &$item) {
if (isset($item[$attributeCode]) && !empty($attributeData[AttributeMetadataInterface::OPTIONS])) {
if(is_array($item[$attributeCode])){
$item[$attributeCode] = $item[$attributeCode];
}else{
$item[$attributeCode] = explode(',', $item[$attributeCode]);
}
}
}
}
return $data;
}
}
When customer grid call at that time getData() function call. In that function I have added custom code to filter collection "website_id" wise.please check getData() function and make changes as per your requirement. Above code will filer customer website_id wise.
Thanks.