If you have a requirement as load an admin grid with pre-defined multiple filter values like below:
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="update_url" xsi:type="url" path="mui/index/render"/>
<item name="filter_url_params" xsi:type="array">
<item name="status" xsi:type="string">1,2</item>
</item>
</item>
</argument>
Then you can go in the dataprovider
class of the uicomponent grid and make below changes(add below prepareUpdateUrl
function code):
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
);
if ($paramName == 'status') {
$paramValue = explode(',', $paramValue);
$this->addFilter(
$this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('in')->create()
);
} else {
$this->addFilter(
$this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
);
}
}
}
}
In above code,
I am checking paramName as if ($paramName == 'status')
then explode this paramValue as $paramValue = explode(',', $paramValue);
and adding a new filter as below:
$this->addFilter($this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('in')->create());
And changing the filter condition from eq
to in
.
This solution is very well tested and working live in one of my module, so let me know if you face any issue.
Thanks :)
If this scenario didn't work for you. Try this:
Use preference to override Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
Now add this function in your file:
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
);
if ($this->getName() == 'your_data_source_name') {
$paramValue = explode(',', $paramValue);
$this->addFilter(
$this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('in')->create()
);
} else {
$this->addFilter(
$this->filterBuilder->setField($paramName)->setValue($paramValue)->setConditionType('eq')->create()
);
}
}
}
}
I think this will be effective and we can add multiple conditions in it based on the requirement! Thanks!