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()]);
尽情享受吧:)
我正在为 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()]);
尽情享受吧:)