Magento2 Magento 2 UI数据提供程序不加载数据
首先,我不是Magento 2中的铁杆程序员,所以我很可能遗漏了什么。我确实在网上搜索过,但似乎找不到解决办法。希望有人能帮我 形势 我创建了一个自定义模块,我有一个自定义控制器,它必须从自定义表中提取数据。为此,我创建了一个自定义UI数据提供程序,它应该提取数据。当我访问控制器时,url中的参数提供一个内部ID。当我检索此ID并创建一个简单搜索时,我的表中没有任何值。在本例中,ID为59。当我在搜索中硬编码ID时,我会在表中得到结果 我使用一些调试打印输出测试了查询和提取的项,在这两种情况下,在函数getData()中返回数据之前,数据都存在。所以在这一点上,我真的不明白为什么我硬编码值59时它会工作,但当我使用getParam检索它时它不会工作 我想可能在某种程度上我用的是不正确的收藏。如果我在parent::中添加了相同的过滤器,那么我会得到一个错误,它似乎是在使用Magento产品集合。出错的部分是:Magento2 Magento 2 UI数据提供程序不加载数据,magento2,Magento2,首先,我不是Magento 2中的铁杆程序员,所以我很可能遗漏了什么。我确实在网上搜索过,但似乎找不到解决办法。希望有人能帮我 形势 我创建了一个自定义模块,我有一个自定义控制器,它必须从自定义表中提取数据。为此,我创建了一个自定义UI数据提供程序,它应该提取数据。当我访问控制器时,url中的参数提供一个内部ID。当我检索此ID并创建一个简单搜索时,我的表中没有任何值。在本例中,ID为59。当我在搜索中硬编码ID时,我会在表中得到结果 我使用一些调试打印输出测试了查询和提取的项,在这两种情况下,
$items = $this->purchaseOrderItemCollection
->addFieldToFilter('purchase_order_id', array('eq' => $id))
//->addFieldToFilter('purchase_order_id', array('eq' => 59))
->getData()
;
如果我用$id注释addFieldToFilter,并用硬代码59取消注释该行,它就可以工作。我还在这里尝试通过注册表设置$id值,因为我可能认为Magento在其他地方不记得数据,但这并没有解决问题
在我的控制器下面
<?php
namespace DssSolutions\Management\Ui\DataProvider\PurchaseOrderItem;
use DssSolutions\Management\Api\PurchaseOrderSalesOrderItemRepositoryInterface;
use DssSolutions\Management\Model\PurchaseOrderSalesOrderItem\DataProvider;
use DssSolutions\Management\Model\ResourceModel\PurchaseOrderItem;
use DssSolutions\Management\Model\ResourceModel\PurchaseOrderSalesOrderItem;
use DssSolutions\Management\Model\ResourceModel\PurchaseOrdersLines;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Framework\App\ObjectManager;
use Magento\Store\Model\Store;
use Magento\Ui\DataProvider\Modifier\ModifierInterface;
use Magento\Ui\DataProvider\Modifier\PoolInterface;
/**
* Class ProductDataProvider
*
* @api
* @since 100.0.2
*/
class ReceiveOrderedProductDataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
/**
* Product collection
*
* @var \DssSolutions\Management\Model\ResourceModel\PurchaseOrderItem\Collection
*/
protected $collection;
/**
* @var \Magento\Ui\DataProvider\AddFieldToCollectionInterface[]
*/
protected $addFieldStrategies;
/**
* @var \Magento\Ui\DataProvider\AddFilterToCollectionInterface[]
*/
protected $addFilterStrategies;
/**
* @var PoolInterface
*/
private $modifiersPool;
/**
* @var \Magento\Framework\App\Request\Http
*/
protected $request;
/**
* @var PurchaseOrderItem\Collection
*/
protected $purchaseOrderItemCollection;
/**
* @var \Magento\Framework\Registry
*/
protected $_registry;
/**
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param CollectionFactory $collectionFactory
* @param \Magento\Ui\DataProvider\AddFieldToCollectionInterface[] $addFieldStrategies
* @param \Magento\Ui\DataProvider\AddFilterToCollectionInterface[] $addFilterStrategies
* @param array $meta
* @param array $data
* @param PoolInterface|null $modifiersPool
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
CollectionFactory $collectionFactory,
\Magento\Framework\App\Request\Http $request,
\Magento\Framework\Registry $registry,
\DssSolutions\Management\Model\ResourceModel\PurchaseOrderItem\Collection $purchaseOrderItemCollection,
array $addFieldStrategies = [],
array $addFilterStrategies = [],
array $meta = [],
array $data = [],
PoolInterface $modifiersPool = null
) {
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
$this->request = $request;
$this->_registry = $registry;
$this->purchaseOrderItemCollection = $purchaseOrderItemCollection;
$this->collection = $collectionFactory->create();
$this->addFieldStrategies = $addFieldStrategies;
$this->addFilterStrategies = $addFilterStrategies;
$this->modifiersPool = $modifiersPool ?: ObjectManager::getInstance()->get(PoolInterface::class);
}
/**
* Get data
*
* @return array
*/
public function getData()
{
if (!$this->getCollection()->isLoaded()) {
$this->getCollection()->load();
}
$this->_registry->register('current_purchase_order', $this->request->getParam('purchase_id', null));
$id = $this->_registry->registry('current_purchase_order');
$items = $this->purchaseOrderItemCollection
->addFieldToFilter('purchase_order_id', array('eq' => $id))
//->addFieldToFilter('purchase_order_id', array('eq' => 59))
->getData()
;
$collectionCounter = 1;
foreach ($items as $k => $product){
$items[$k]['qty_receivable'] = ($product['qty_orderred'] - $product['qty_received']);
$collectionCounter++;
}
$data = [
'totalRecords' => $collectionCounter,
'items' => array_values($items),
];
/** @var ModifierInterface $modifier */
foreach ($this->modifiersPool->getModifiersInstances() as $modifier) {
$data = $modifier->modifyData($data);
}
return $data;
}
/**
* Add field to select
*
* @param string|array $field
* @param string|null $alias
* @return void
*/
public function addField($field, $alias = null)
{
if (isset($this->addFieldStrategies[$field])) {
$this->addFieldStrategies[$field]->addField($this->getCollection(), $field, $alias);
} else {
parent::addField($field, $alias);
}
}
/**
* @inheritdoc
*/
public function addFilter(\Magento\Framework\Api\Filter $filter)
{
if (isset($this->addFilterStrategies[$filter->getField()])) {
$this->addFilterStrategies[$filter->getField()]
->addFilter(
$this->getCollection(),
$filter->getField(),
[$filter->getConditionType() => $filter->getValue()]
);
} else {
parent::addFilter($filter);
}
}
/**
* @inheritdoc
* @since 103.0.0
*/
public function getMeta()
{
$meta = parent::getMeta();
/** @var ModifierInterface $modifier */
foreach ($this->modifiersPool->getModifiersInstances() as $modifier) {
$meta = $modifier->modifyMeta($meta);
}
return $meta;
}
经过大量调查,我发现UI数据提供程序可能会发生更改,而且URL参数并不总是提交的,这是因为UI网格使用ajax和路由mui/index/render
因此,要使其正常工作,必须对数据源进行调整,使其包含一个包含url参数的项。在我的示例中,这是通过以下代码完成的
<item name="filter_url_params" xsi:type="array">
<item name="purchase_order_id" xsi:type="string">*</item>
</item>
这样,过滤就可以工作了,别忘了在xml中添加字段作为字段,否则Magento无法过滤
对于感兴趣的用户,正确的数据提供程序代码为:
<?php
namespace DssSolutions\Management\Ui\DataProvider\PurchaseOrderItem;
use Magento\Ui\DataProvider\AbstractDataProvider;
use Magento\Ui\DataProvider\Modifier\PoolInterface;
use Magento\Framework\Api\FilterBuilder;
use DssSolutions\Management\Model\ResourceModel\PurchaseOrderItem\Collection;
/**
* Class PurchaseOrderItem
* @package DssSolutions\Management\Ui\DataProvider\PurchaseOrsderItem
*/
class ReceiveOrderedProductDataProvider extends AbstractDataProvider
{
/**
* @var PoolInterface
*/
protected $pool;
/**
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry;
/**
* @var \Magento\Framework\App\Request\Http
*/
protected $request;
/**
* @var FilterBuilder
*/
protected $filterBuilder;
/**
* Warehouse constructor.
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param PoolInterface $pool
* @param array $meta
* @param array $data
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
PoolInterface $pool,
Collection $collection,
\Magento\Framework\Registry $registry,
\Magento\Framework\App\Request\Http $request,
FilterBuilder $filterBuilder,
array $meta = [],
array $data = []
) {
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
$this->pool = $pool;
$this->collection = $collection;
$this->_coreRegistry = $registry;
$this->request = $request;
$this->filterBuilder = $filterBuilder;
$this->prepareUpdateUrl();
}
/**
* {@inheritdoc}
*/
public function getData()
{
$this->collection->addFieldToSelect('purchase_order_item_id');
$this->collection->addFieldToSelect('purchase_order_id');
$this->collection->addFieldToSelect('product_sku');
$this->collection->addFieldToSelect('qty_orderred');
$this->collection->addFieldToSelect('qty_received');
$this->collection->addFieldToSelect('qty_returned');
$items = $this->collection->getData();
foreach ($items as $k => $product){
$items[$k]['qty_receivable'] = ($product['qty_orderred'] - $product['qty_received']);
}
$data = [
'totalRecords' => $this->collection->count(),
'items' => array_values($items),
];
return $data;
}
/** * @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());
}
}
}
/**
* {@inheritdoc}
*/
public function getMeta()
{
$meta = parent::getMeta();
/** @var ModifierInterface $modifier */
foreach ($this->pool->getModifiersInstances() as $modifier) {
$meta = $modifier->modifyMeta($meta);
}
return $meta;
}
}
<?php
namespace DssSolutions\Management\Ui\DataProvider\PurchaseOrderItem;
use Magento\Ui\DataProvider\AbstractDataProvider;
use Magento\Ui\DataProvider\Modifier\PoolInterface;
use Magento\Framework\Api\FilterBuilder;
use DssSolutions\Management\Model\ResourceModel\PurchaseOrderItem\Collection;
/**
* Class PurchaseOrderItem
* @package DssSolutions\Management\Ui\DataProvider\PurchaseOrsderItem
*/
class ReceiveOrderedProductDataProvider extends AbstractDataProvider
{
/**
* @var PoolInterface
*/
protected $pool;
/**
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry;
/**
* @var \Magento\Framework\App\Request\Http
*/
protected $request;
/**
* @var FilterBuilder
*/
protected $filterBuilder;
/**
* Warehouse constructor.
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param PoolInterface $pool
* @param array $meta
* @param array $data
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
PoolInterface $pool,
Collection $collection,
\Magento\Framework\Registry $registry,
\Magento\Framework\App\Request\Http $request,
FilterBuilder $filterBuilder,
array $meta = [],
array $data = []
) {
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
$this->pool = $pool;
$this->collection = $collection;
$this->_coreRegistry = $registry;
$this->request = $request;
$this->filterBuilder = $filterBuilder;
$this->prepareUpdateUrl();
}
/**
* {@inheritdoc}
*/
public function getData()
{
$this->collection->addFieldToSelect('purchase_order_item_id');
$this->collection->addFieldToSelect('purchase_order_id');
$this->collection->addFieldToSelect('product_sku');
$this->collection->addFieldToSelect('qty_orderred');
$this->collection->addFieldToSelect('qty_received');
$this->collection->addFieldToSelect('qty_returned');
$items = $this->collection->getData();
foreach ($items as $k => $product){
$items[$k]['qty_receivable'] = ($product['qty_orderred'] - $product['qty_received']);
}
$data = [
'totalRecords' => $this->collection->count(),
'items' => array_values($items),
];
return $data;
}
/** * @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());
}
}
}
/**
* {@inheritdoc}
*/
public function getMeta()
{
$meta = parent::getMeta();
/** @var ModifierInterface $modifier */
foreach ($this->pool->getModifiersInstances() as $modifier) {
$meta = $modifier->modifyMeta($meta);
}
return $meta;
}
}