后台列表加批量操作后,勾选几行再提交却提示没有选择记录,通常不是控制器收不到参数,而是 UI Grid 用来标识行的字段不一致。

在请求里看selected传来的到底是什么

Network 中打开 Mass Action 请求,正常应包含:

selected[]=12
selected[]=15
excluded=false

如果 selected 是空,先对比 storageConfig、selectionsColumn 和主键字段:

<storageConfig>
    <param name="indexField" xsi:type="string">entity_id</param>
</storageConfig>

<selectionsColumn name="ids">
    <settings>
        <indexField>entity_id</indexField>
    </settings>
</selectionsColumn>

数据源返回的每条 item 也必须包含 entity_id。数据库主键叫 rule_id,XML 却抄成 entity_id,页面仍会显示勾选框,但前端没有稳定的行 ID。

控制器别自己拼where in

批量操作用 MagentoUiComponentMassActionFilter 处理“选择全部”和 excluded:

$collection = $this->filter->getCollection(
    $this->collectionFactory->create()
);

foreach ($collection as $item) {
    $item->setIsActive(false)->save();
}

这样既支持逐条勾选,也支持跨页“全选后排除几条”。修完后分别测试选两条、全选当前页、Select All,再看真正被修改的 ID 是否一致,避免页面不报错但误处理整张表。