Drupal 10启用状态下AJAX表单字段change事件无法更新值
Drupal AJAX字段更新问题解决方法
问题描述
field_aspect_ratio字段启用时,触发field_video_id的change事件后,field_aspect_ratio的值无法自动更新;但将该字段设为禁用状态(#disabled=true)时功能正常。要求保留用户手动选择field_aspect_ratio的权限,不依赖禁用字段的方式解决。
问题原因
当字段处于可编辑状态时,Drupal表单状态(form_state)中会保留用户之前的输入值,仅设置#default_value不会覆盖form_state中的已有值,导致AJAX回调返回的字段仍显示旧值。而字段禁用时,form_state不会保存用户输入,#default_value才能生效。
解决方案
需要同时更新form_state中的字段值和表单元素的#default_value,确保表单重建时使用最新值;同时优化AJAX回调的返回方式,遵循Drupal的规范实现。
修改后的代码
function my_module_form_node_event_video_edit_form_alter(&$form, FormStateInterface $form_state) { add_video_ajax($form, $form_state); } function add_video_ajax(&$form, &$form_state) { // 为Video ID字段添加AJAX回调 $form['field_video_id']['widget'][0]['value']['#ajax'] = [ 'callback' => 'ajax_callback', 'event' => 'change', 'wrapper' => 'replace-container', ]; $form['field_aspect_ratio']['#prefix'] = '<div id="replace-container">'; $form['field_aspect_ratio']['#suffix'] = '</div>'; $video_id_value = $form_state->getValue('field_video_id'); $video_id_value = isset($video_id_value[0]) ? $video_id_value[0]['value'] : NULL; if ($video_id_value) { // 更新form_state中的值,确保表单状态同步 $form_state->setValue('field_aspect_ratio', [['value' => $video_id_value]]); // 设置字段默认值 $form['field_aspect_ratio']['widget']['#default_value'] = $video_id_value; } } function ajax_callback($form, $form_state) { // 直接返回需要替换的表单元素,Drupal会自动处理wrapper替换 return $form['field_aspect_ratio']; }
关键修改点
- 同步表单状态:在设置
#default_value的同时,调用$form_state->setValue()更新field_aspect_ratio的值,确保表单重建时状态一致。 - 规范AJAX回调:直接返回表单元素而非手动使用
ReplaceCommand,Drupal的AJAX系统会自动处理HTML替换和状态维护,避免手动操作可能出现的兼容性问题。
内容的提问来源于stack exchange,提问作者imran
相关产品推荐
相关产品推荐

