Magento2 Magento 2 UI数据提供程序不加载数据

Magento2 Magento 2 UI数据提供程序不加载数据,magento2,Magento2,首先,我不是Magento 2中的铁杆程序员,所以我很可能遗漏了什么。我确实在网上搜索过,但似乎找不到解决办法。希望有人能帮我 形势 我创建了一个自定义模块,我有一个自定义控制器,它必须从自定义表中提取数据。为此,我创建了一个自定义UI数据提供程序,它应该提取数据。当我访问控制器时,url中的参数提供一个内部ID。当我检索此ID并创建一个简单搜索时,我的表中没有任何值。在本例中,ID为59。当我在搜索中硬编码ID时,我会在表中得到结果 我使用一些调试打印输出测试了查询和提取的项,在这两种情况下,

首先,我不是Magento 2中的铁杆程序员,所以我很可能遗漏了什么。我确实在网上搜索过,但似乎找不到解决办法。希望有人能帮我

形势 我创建了一个自定义模块,我有一个自定义控制器,它必须从自定义表中提取数据。为此,我创建了一个自定义UI数据提供程序,它应该提取数据。当我访问控制器时,url中的参数提供一个内部ID。当我检索此ID并创建一个简单搜索时,我的表中没有任何值。在本例中,ID为59。当我在搜索中硬编码ID时,我会在表中得到结果

我使用一些调试打印输出测试了查询和提取的项,在这两种情况下,在函数getData()中返回数据之前,数据都存在。所以在这一点上,我真的不明白为什么我硬编码值59时它会工作,但当我使用getParam检索它时它不会工作

我想可能在某种程度上我用的是不正确的收藏。如果我在parent::中添加了相同的过滤器,那么我会得到一个错误,它似乎是在使用Magento产品集合。出错的部分是:

    $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;
}

}