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
相关产品推荐
相关产品推荐

