You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'];
}

关键修改点

  1. 同步表单状态:在设置#default_value的同时,调用$form_state->setValue()更新field_aspect_ratio的值,确保表单重建时状态一致。
  2. 规范AJAX回调:直接返回表单元素而非手动使用ReplaceCommand,Drupal的AJAX系统会自动处理HTML替换和状态维护,避免手动操作可能出现的兼容性问题。

内容的提问来源于stack exchange,提问作者imran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:46:25