进入 Magento 2 后台商品列表,表头出现但加载图标一直转,或者页面空白没有数据。Admin Grid 由 UI Component、数据源请求、Bookmark 状态和后台集合共同组成,问题不一定在商品数量。
先找到 mui/index/render 请求
在 Network 中筛选 XHR,查看类似 mui/index/render 的请求。它返回 200 且包含 JSON,问题通常在前端组件;返回 302 到登录页,检查后台会话和 form key;403 检查管理员 ACL;500 则按时间查看 exception 和 PHP 日志。
响应体如果是完整 HTML 而不是 JSON,说明请求被重定向或服务器错误页面替换。不要只看状态码,有些代理会把上游错误包装成 200。
清理个人 Bookmark 可验证列状态问题
Magento 会在 ui_bookmark 中保存管理员对列、排序、筛选和视图的设置。安装扩展或删除列后,旧 Bookmark 可能引用不存在的字段,导致网格异常。先让受影响管理员使用默认视图或重置网格;只有一位管理员失败而其他人正常,是 Bookmark 问题的重要线索。
SELECT bookmark_id, user_id, namespace, identifier
FROM ui_bookmark
WHERE namespace LIKE '%product%';
删除记录属于写操作,必须先确认 user_id、namespace 并备份。不要清空所有管理员的 Bookmark。
自定义列可能破坏集合 SQL
最近增加的 extension_attribute、join 或 filter strategy 是重点。普通页面打开时集合可能尚未真正加载,等数据源请求应用筛选和排序才触发 SQL。查看异常中的 unknown column、ambiguous column、duplicate alias 或 GROUP BY 错误。
对慢 SQL 执行 EXPLAIN,确认筛选列和 join 条件有索引。后台网格使用大量 LEFT JOIN、计算列或逐行 repository 加载,会随商品量增长迅速变慢。自定义列如果能从主查询批量获得,就不要在每一行渲染时重新加载商品。
前端错误要从第一条开始处理
请求已经返回正确 JSON,但加载动画不结束时,检查 Console 的 RequireJS、Knockout 和 UI registry 错误。主题一般不影响后台,但自定义 adminhtml 模块可能覆盖 listing XML 或 JS mixin。运行静态内容部署与缓存清理前,先确认代码和生成目录的所属用户一致。
修复后测试默认视图、保存视图、筛选、排序、分页、批量选择和 CSV 导出。一个网格能显示第一屏并不代表 filter mapping 与批量操作已经正确。

