Magento2 addFieldToFilter 调用适用于硬编码值但不适用于具有相同值的变量

Magento2 addFieldToFilter call works with hardcoded value but not variable with same value

我正在为 Magento2 商店构建管理员(目前在 2.1.7 上,他们希望在我们上线之前使用最新版本,然后希望稳定特定版本)。有问题的模块应该显示所有现有订单,并带有一个 actionsColumn,其中包含用于取消、编辑和打开与该订单相关的已购买商品的详细概览的链接。订单详细信息页面包含一个网格视图,该视图应显示与 URL.

中传递的订单号关联的所有订单项目

为了过滤掉与特定订单号无关的订单项目,我扩展了 \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult class。除了一个奇怪的警告外,这是有效的。如果在 addFieldToFilter 调用中,我将 $ordNum 替换为“10000”,它会获取正确的数据。但是,当使用 $ordNum 动态调用它时,它 returns 根本没有行。尽管尝试了各种转换和 === 检查以确保硬编码值和动态值之间没有区别,但仍然如此。这是一个 Magento 错误吗?我完全想不通为什么会这样。

<?php


class OrderItems extends \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult
{

    protected function _initSelect()
    {        
        $this->filterByOrderNum();

        parent::_initSelect();

        return $this;
    }

    private function filterByOrderNum()
    {
        $request = \Magento\Framework\App\ObjectManager::getInstance()
                       ->get('Magento\Framework\App\Request\Http');

        $ordNum = $request->getParam('order_num');

        $this->addFieldToFilter('order_num', ['eq' => $ordNum]); //if I switch this to hardcoded 10000, this works. With the variable, no dice.

        return $this;
    }
}

尝试用这个代替 getParam 语句:

$url = parse_url($request);
$path =  explode('/',$url['path']);
$ordNum = $path[3];

为了确保我们在同一页面上,这是完整代码:

<?php


class OrderItems extends \Magento\Framework\View\Element\UiComponent\DataProvider\SearchResult
{

    protected function _initSelect()
    {        
        $this->filterByOrderNum();

        parent::_initSelect();

        return $this;
    }

    private function filterByOrderNum()
    {
        $request = \Magento\Framework\App\ObjectManager::getInstance()
                       ->get('Magento\Framework\App\Request\Http');

        $url = parse_url($request);
        $path =  explode('/',$url['path']);
        $ordNum = $path[3];

        $this->addFieldToFilter('order_num', $ordNum); //if I switch this to hardcoded 10000, this works. With the variable, no dice.

        return $this;
    }
}

我们通过执行以下操作解决了这个问题:

/**
 * CcCustompriceProductListingDataProvider constructor.
 * @param string $name
 * @param string $primaryFieldName
 * @param string $requestFieldName
 * @param \Magento\Framework\Api\Search\ReportingInterface $reporting
 * @param \Magento\Framework\Api\Search\SearchCriteriaBuilder $searchCriteriaBuilder
 * @param \Magento\Framework\App\RequestInterface $request
 * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
 * @param array $meta
 * @param array $data
 * @throws \Exception
 */
public function __construct(
    $name,
    $primaryFieldName,
    $requestFieldName,
    ReportingInterface $reporting,
    SearchCriteriaBuilder $searchCriteriaBuilder,
    RequestInterface $request,
    FilterBuilder $filterBuilder,
    array $meta = [],
    array $data = []
) {
    $data['config']['filter_url_params']['product_id'] = $request->getParam('cppc_product_id', 0);
    parent::__construct($name, $primaryFieldName, $requestFieldName, $reporting, $searchCriteriaBuilder, $request, $filterBuilder, $meta, $data);
}

您不需要使用任何其他功能。这是因为它还使用更新 URL 进行了更新,并且没有该参数。通过将其添加到数据中,它还将其解析为更新 url.

你可以在这里看到(父函数)

/**
 * @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()
            );
        }
    }
}

我刚刚使用下面提到的步骤修复了它

在控制器的会话中存储参数值

public function execute() { 
  $this->_catalogSession->setTokenId($this->request->getParam('entity_id')); 
  $this->_view->loadLayout(); 
  $this->_view->loadLayoutUpdates(); 
  $this->_view->getPage()->getConfig()->getTitle()->set(__('Redeem Token History')); 
  $this->_view->renderLayout(); 
}

在数据提供者中使用会话值

$tokensCollection->addFieldToFilter('token_id', ['eq' => $this->_catalogSession->getTokenId()]);

尽情享受吧:)