FilamentPHP中如何动态添加带参数的重复表格组件?
动态生成分类专属表格组件的解决方法
1. 改造组件类,支持传参和唯一标识
先修改你的LastCreatedByCategoryId组件,让它能接收分类ID,同时给每个实例添加唯一ID避免重复识别:
class LastCreatedByCategoryId extends TableWidget { protected $categoryId; public function __construct(int $categoryId) { parent::__construct(); $this->categoryId = $categoryId; // 给每个组件设置唯一ID,防止仪表盘判定为重复组件 $this->id = 'last-records-' . $categoryId; } // 根据分类ID查询最新记录 public function query() { return Record::where('category_id', $this->categoryId) ->latest() ->take(10); // 按需调整展示条数 } // 动态显示分类名称作为组件标题 public function heading() { $category = Category::find($this->categoryId); return $category ? "{$category->name} 最新记录" : "未知分类记录"; } }
2. 在仪表盘批量生成组件
直接在仪表盘的getWidgets方法里循环符合条件的分类,批量生成对应组件:
public function getWidgets(): array { $widgets = []; // 替换成你的分类筛选逻辑,比如只取启用状态的分类 $targetCategories = Category::where('status', 'enabled')->get(); foreach ($targetCategories as $category) { $widgets[] = new LastCreatedByCategoryId($category->id); // 如果你的组件用make方法封装了构造逻辑,也可以用下面的写法 // $widgets[] = LastCreatedByCategoryId::make($category->id); } return $widgets; }
3. 关键注意事项
- 必须给每个组件实例设置唯一
id,否则仪表盘会因为类名相同,将不同分类的组件判定为重复项,拒绝加载 - 分类查询逻辑要贴合你的需求,比如只筛选特定状态、特定类型的分类,避免生成不必要的组件
4. 可选:优化组件布局
如果分类数量较多,可在仪表盘类里设置列数,让组件自动排版:
public function columns(): int { return 2; // 每行显示2个组件,可根据屏幕宽度调整 }
内容的提问来源于stack exchange,提问作者Branpg
相关产品推荐
相关产品推荐

