如何在Statamic控制器中更新Replicator字段内指定字段值
解决Statamic中Replicator字段指定项的Total Delegates更新问题
你需要遍历Replicator字段的数组,根据预订的课程日期ID(即Replicator项的id)定位到目标项,再累加预订人数到对应字段。以下是修正后的完整代码:
$delegates_booked = $checkout_session->metadata->delegate_count; $upcoming_course_date_id = $checkout_session->metadata->upcoming_course_date_id; $course_id = $checkout_session->metadata->course_booked_id; // 查询目标课程条目 $entry = Entry::query() ->where('collection', 'courses') ->where('id', $course_id) ->first(); if (!$entry) { // 处理条目不存在的情况,比如记录日志或返回错误 return; } // 获取Replicator字段的所有课程项 $upcoming_courses = $entry->get('upcoming_courses'); // 遍历找到对应ID的课程项并更新人数 foreach ($upcoming_courses as &$course_item) { if ($course_item['id'] === $upcoming_course_date_id) { // 处理字段未初始化的情况,默认初始为0 $current_delegates = $course_item['total_delegates'] ?? 0; $course_item['total_delegates'] = $current_delegates + $delegates_booked; break; // 找到目标项后退出循环 } } // 更新Replicator字段并保存条目 $entry->set('upcoming_courses', $upcoming_courses); $entry->save();
关键细节说明:
- 使用引用遍历(
&$course_item)直接修改数组内的项,无需额外重新赋值 - 增加条目不存在的判断,避免后续代码触发报错
- 用
?? 0处理total_delegates字段未设置的场景,确保累加逻辑不会出现PHP警告 - 匹配到目标项后立即终止循环,提升执行效率
如果你的字段实际名称是booked_delegates(和你原代码一致),只需将代码中的total_delegates替换为booked_delegates即可。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

