Ui/Component using plugin in magento2
-
14-04-2021 - |
Question
I get QA review as below:
example/module-mymodule/UiC/DataProvider.php
is too similar to the Magento 2 file
magento/module-cms/magento-module-cms-103.0.0-beta32/Ui/Component/DataProvider.php
Since this file edits public function, you can avoid duplicating code using Magento 2's plugin structure: https://devdocs.magento.com/guides/v2.3/extension-dev-guide/plugins.html or use class preferences.
Can anyone explain, what it try to say? The file which they refer is below
<?php
namespace Example\MyModule\Ui\Component;
use Magento\Framework\Api\Filter;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\AuthorizationInterface;
use Magento\Framework\View\Element\UiComponent\DataProvider\Reporting;
/**
* Component DataProvider
* @api
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @since 100.0.2
*/
class DataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
{
/**
* @var AuthorizationInterface
*/
private $authorization;
/**
* @var AddFilterInterface[]
*/
private $additionalFilterPool;
/**
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param Reporting $reporting
* @param SearchCriteriaBuilder $searchCriteriaBuilder
* @param RequestInterface $request
* @param FilterBuilder $filterBuilder
* @param array $meta
* @param array $data
* @param array $additionalFilterPool
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
Reporting $reporting,
SearchCriteriaBuilder $searchCriteriaBuilder,
RequestInterface $request,
FilterBuilder $filterBuilder,
array $meta = [],
array $data = [],
array $additionalFilterPool = []
) {
parent::__construct(
$name,
$primaryFieldName,
$requestFieldName,
$reporting,
$searchCriteriaBuilder,
$request,
$filterBuilder,
$meta,
$data
);
$this->meta = array_replace_recursive($meta, $this->prepareMetadata());
$this->additionalFilterPool = $additionalFilterPool;
}
/**
* @deprecated 101.0.7
* @return AuthorizationInterface|mixed
*/
private function getAuthorizationInstance()
{
if ($this->authorization === null) {
$this->authorization = ObjectManager::getInstance()->get(AuthorizationInterface::class);
}
return $this->authorization;
}
/**
* Prepares Meta
*
* @return array
*/
public function prepareMetadata()
{
$metadata = [];
/**
* Instead of Creating Seperate ACl access, CMS authorization is used 'Magento_Cms::save'
*/
if (!$this->getAuthorizationInstance()->isAllowed('Magento_Cms::save')) {
$metadata = [
'mymodule_post_columns' => [
'arguments' => [
'data' => [
'config' => [
'editorConfig' => [
'enabled' => false
]
]
]
]
]
];
}
return $metadata;
}
/**
* @inheritdoc
*/
public function addFilter(Filter $filter)
{
if (!empty($this->additionalFilterPool[$filter->getField()])) {
$this->additionalFilterPool[$filter->getField()]->addFilter($this->searchCriteriaBuilder, $filter);
} else {
parent::addFilter($filter);
}
}
}
Solution
Generally, it means you don't need to add duplicate code in your module to meet up the customisation. The customisation can be done with the Magento 2 interceptor which known as Plugin. You can apply plugin concept to all the public methods of class in Magento 2. Hope this will help.
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange