Magento 2筛选参数存储位置及获取已应用筛选条件的技术问询
嘿,这两个问题都是Magento 2后台开发里经常碰到的,我来给你详细拆解下~
问题1:Magento 2中筛选参数存储在何处?
筛选参数的存储位置分两种场景,对应后台管理网格和前端产品列表:
- 后台管理网格(比如产品、客户、订单网格):
- 核心存储在后台Session中,对应类
Magento\Backend\Model\Session,通过getFilterData()方法来存储和读取筛选条件; - 应用筛选后,URL会自动带上筛选参数(比如
filter[sku]=test&filter[name]=example),刷新页面时系统会优先读取URL参数,再同步Session中的数据; - 网格组件内部靠
Magento\Ui\Component\Filters\Pool来管理筛选规则,负责解析和应用这些参数到查询中。
- 核心存储在后台Session中,对应类
- 前端产品列表(分层导航筛选):
- 主要通过URL参数传递(比如
?category=12&price=10-100); - 部分筛选状态会存在
Magento\Catalog\Model\Session中,用来维持用户的筛选上下文,比如返回分类页时保留之前的筛选条件。
- 主要通过URL参数传递(比如
问题2:自定义导出按钮获取已应用的筛选条件,能否从全局变量获取?
全局变量里并没有直接暴露这些筛选条件,但有两种可靠的方式获取,同时我也会解释刷新后筛选保留的原因:
获取筛选条件的两种方法
- 从请求参数中读取
当用户应用筛选后,筛选参数会附加到当前页面的URL里,你可以在自定义导出按钮对应的控制器中,通过请求对象直接提取这些参数:
use Magento\Framework\App\RequestInterface; class ExportController extends \Magento\Backend\App\Action { protected $request; public function __construct( \Magento\Backend\App\Action\Context $context, RequestInterface $request ) { parent::__construct($context); $this->request = $request; } public function execute() { // 获取所有请求参数,包含筛选条件 $allParams = $this->request->getParams(); // 提取筛选条件部分 $appliedFilters = isset($allParams['filter']) ? $allParams['filter'] : []; // 用$appliedFilters构建你的导出查询即可 // ... } }
- 从后台Session中读取
刷新页面后筛选能保留,核心原因就是Magento把筛选条件存在了后台Session里。你可以直接从Session中获取已保存的筛选数据:
use Magento\Backend\Model\Session; class ExportController extends \Magento\Backend\App\Action { protected $backendSession; public function __construct( \Magento\Backend\App\Action\Context $context, Session $backendSession ) { parent::__construct($context); $this->backendSession = $backendSession; } public function execute() { // 获取当前网格的筛选数据(注意:不同网格的筛选数据是分开存储的) $filterData = $this->backendSession->getFilterData(); if ($filterData) { $appliedFilters = $filterData->getData(); // 处理筛选条件并构建导出逻辑 } } }
刷新后筛选保留的原因
当你在后台网格点击「应用筛选」时,Magento会做两件事:
- 把筛选参数拼接到页面URL上,刷新时浏览器会带着这些参数请求页面;
- 同时把筛选条件序列化后存储到
Magento\Backend\Model\Session中,作为兜底——即使URL参数丢失,也能从Session恢复筛选状态。
系统渲染网格时,会先检查URL中的筛选参数,如果存在就直接应用;如果没有,就从Session读取之前保存的筛选条件,这就是刷新后筛选依然保留的原因。
内容的提问来源于stack exchange,提问作者BlackWhite
相关产品推荐
相关产品推荐

