Drupal 9 Computed Fields模块计算字段钩子部署问题求助
解决Computed Fields平均评分计算不显示的问题
核心问题:代码放置位置错误
绝对不要把自定义钩子函数写在模块自带的compute_field_api.php里——这个文件是模块的核心代码,更新时会被覆盖,且系统不会优先加载这里的自定义逻辑。必须把代码放到你自己创建的自定义模块中,比如:
- 直接写入自定义模块的
your_custom_module.module文件 - 放在自定义模块下的单独文件(如
computed_hooks.php),然后在your_custom_module.module里用require_once __DIR__ . '/computed_hooks.php';引入
其他排查与修正点
钩子命名验证
确认你的计算字段机器名是field_rating_average,钩子命名严格遵循computed_field_field_[字段机器名]_compute规则,机器名不匹配的话钩子不会触发。字段值安全获取
原代码直接用$entity->field_name->value的方式在部分场景下(如字段为空、Drupal版本差异)会获取不到值,改用更可靠的$entity->get('field_name')->value,同时要处理空值和非数值情况,避免计算错误。字段配置与缓存
- 进入计算字段的配置页面,确认已正确设置触发方式(如选择“自定义PHP钩子”,不同版本的Computed Fields选项可能略有不同)
- 清除缓存时要清全量缓存,用Drush命令
drush cr或后台“配置->性能”页面的“清除所有缓存”按钮
修正后的示例代码
将以下代码放入你的自定义模块文件中:
function computed_field_field_rating_average_compute($entity_type_manager, $entity, $fields, $delta) { // 初始化评分总和与有效字段计数 $total = 0; $valid_fields = 0; // 定义需要计算的字段列表 $rating_fields = [ 'field_facilities_and_services', 'field_fairway_rating', 'field_recommendable_to_friends_rating', 'field_food_rating', 'field_value_rating', 'field_english_rating', 'field_layout_rating', 'field_quality_rating', 'field_greens_rating', 'field_length_rating', ]; // 遍历字段,安全获取值并累加 foreach ($rating_fields as $field_name) { if ($entity->hasField($field_name) && !$entity->get($field_name)->isEmpty()) { $value = $entity->get($field_name)->value; // 确保值是数值类型 if (is_numeric($value)) { $total += (float)$value; $valid_fields++; } } } // 避免除以0的情况 if ($valid_fields === 0) { return 0; } // 计算平均值,保留两位小数(可选) return round($total / $valid_fields, 2); }
内容的提问来源于stack exchange,提问作者Asuka Nakajima
相关产品推荐
相关产品推荐

