我的屏幕上有两个字段:一个按 ID 列出用户列表的 select 和 2 个单选按钮。
当用户更改选择值时,我想更改 *ajax * 中的 hidden 输入“has_photo”的值。
这就是我的表单在 buildForm() 中的样子(扩展 FormBase):
$form['card']['user'] = [
'#type' => 'select',
'#empty_option' => 'Choose',
'#options' => $users,
'#default_value' => $id_user,
'#ajax' => [
'method' => 'replace',
'callback' => '::addPhotoWarning',
'event' => 'change',
'wrapper' => 'hasPhoto'
],
];
$form['card']['hasPhoto'] = [
'#type' => 'number',
'#value' => $hasPhoto
];
还有我的ajax函数:
/**
* @param array $form
* @param \Drupal\Core\Form\FormStateInterface $form_state
*
* @return void
*/
public function addPhotoWarning(array &$form, FormStateInterface $form_state) {
$idUser = $form_state->getUserInput()['card']['user'] ? $form_state->getUserInput()['card']['user'] : NULL;
if ($idUser) {
$hasPhoto = $this->hasPhoto($idUser);
$form['card']['user']['#value'] = $hasPhoto ? '1' : '0';
}
return $form['card']['hasPhoto'];
}
$form['card']['hasPhoto'] 是一个输入类型数字,因为我无法找到如何重新加载这个值,因为我使用了隐藏类型,因为drupal ajax api需要一个包装器。当用户更改选择的值时,我不想重新加载所有表单(因为用户可以在其他输入中放入其他值)
我使用的是drupal 9.5
您可以添加新的 hasPhotoWrapper 字段:
$form['card']['hasPhotoWrapper'] = [
'#type' => 'markup',
'#markup' => '<div id="hasPhoto"></div>',
];
并将 hasPhoto 字段更新为
$form['card']['hasPhoto'] = [
'#type' => 'hidden',
'#value' => $hasPhoto,
'#prefix' => '<div id="hasPhoto">',
'#suffix' => '</div>',
];
此外,Ajax 回调为
public function addPhotoWarning(array &$form, FormStateInterface $form_state) {
$idUser = $form_state->getUserInput()['card']['user'] ? $form_state->getUserInput()['card']['user'] : NULL;
if ($idUser) {
$hasPhoto = $this->hasPhoto($idUser);
$form['card']['hasPhoto']['#value'] = $hasPhoto ? '1' : '0';
}
return $form['card']['hasPhotoWrapper'];
}