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

Drupal 8自定义Webform Handler中无法从$form_state获取值

Drupal 8 Webform Handler AJAX回调无法获取表单值的解决方案

在Webform Handler的配置表单AJAX回调中,$form_state->getValue('key')返回空值,核心原因是Drupal默认仅会将AJAX触发元素的值提交到服务器,非触发元素的输入不会被自动包含到表单状态的已处理值中。以下是几种可行的解决方法:

方法1:使用getUserInput()获取原始用户输入

$form_state->getUserInput()会返回所有用户提交的原始数据,包括非触发元素的值,适合快速获取未经过表单验证处理的输入:

public function fetchParamsCallback(array &$form, FormStateInterface $form_state)
{
    // 使用getUserInput()获取原始输入,添加空值保护
    $smart_email_id = $form_state->getUserInput()['example_select'] ?? '';

    return  [
      '#type' => 'textfield',
      '#size' => '60',
      '#disabled' => TRUE,
      '#value' => 'SEI: ' . $smart_email_id,
      '#prefix' => '<div id="edit-output">',
      '#suffix' => '</div>',
    ];
}

方法2:配置AJAX提交指定元素

通过在触发AJAX的元素中添加#ajax['submit']属性,明确指定需要一起提交的表单元素,这样这些元素的值会被纳入表单状态的处理流程,就能用getValue()正常获取:

修改buildConfigurationForm中的email_template元素配置:

$form['template_settings']['email_template'] = [
  '#type' => 'select',
  '#title' => $this->t('Email Template'),
  '#options' => $this->getTransactionEmailOptions(),
  '#ajax' => [
    'callback' => [$this, 'fetchParamsCallback'],
    'wrapper' => 'cm-param-textarea',
    'progress' => [
      'type' => 'throbber',
      'message' => $this->t('Loading params...')
    ],
    // 添加这行,指定要提交的元素键名
    'submit' => ['example_select']
  ]
];

之后就能正常使用$smart_email_id = $form_state->getValue('example_select');获取值。

方法3:检查表单元素的路径(针对嵌套元素)

如果你的表单元素嵌套在details或其他容器中,需要使用数组键路径来获取值,比如:

// 若元素在template_settings下,路径应为['template_settings', 'element_key']
$value = $form_state->getValue(['template_settings', 'email_template']);

你的example_select是根级元素,所以此方法不适用,但遇到嵌套元素时需注意。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:11:34