我在Drupal 8中使用Ajax时出现了自定义表单的问题。
让我解释一下。我有两个选择字段,当您在第一个选择一个选项时,Ajax请求将获得第二个选项。提交表单时,它会将您重定向到特定页面。所有这些都很有效。
问题在于您重定向到某个页面,然后点击了浏览器的上一页按钮。默认情况下,您获得第一个字段的第一个选项,以及第二个字段的第一个选项,但在此特定情况下,您将获得先前为第一个字段选择的选项,但第二个选项不会获得好的值,因为Ajax请求不会被触发。
例如:
当您选择"选项A"在第一个领域,你得到"价值A.1"和"价值A.2"在第二个字段中,如果您选择"选项B",您将获得"值B.1"等...
例如,如果您使用"选项C"提交表单。和#34;值C.3",您被重定向到一个页面,如果您回到浏览器中的上一页,您将拥有"选项C"已选中,但值为"选项A"在第二个字段中("值A.1","值A.2",...),如果您提交,则会收到此错误
检测到非法选择。请联系该网站 管理员。
我肯定会错过重建表单的内容,但我无法找到任何解决方案。
这是我的代码:
<?php
namespace Drupal\chdou_intuitive_search\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;
/**
* Class DefaultForm.
*
* @package Drupal\chdou_intuitive_search\Form
*/
class DefaultForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'default_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['i_wish'] = [
'#type' => 'select',
'#title' => $this->t('Je souhaite'),
'#options' => [
'appointment' => $this->t('prendre rendez-vous'),
'doctor' => $this->t('rechercher un médecin'),
'help' => $this->t('une aide ou un soutien')
],
'#default_value' => 'appointment',
'#required' => true,
'#multiple' => false,
'#size' => false,
'#ajax' => [
'callback' => '::getOptions',
'event' => 'change',
'wrapper' => 'what',
]
];
$parent = $form_state->getValue('i_wish');
if (empty($parent)) {
$parent = $form['i_wish']['#default_value'];
}
$form['what'] = [
'#prefix' => '<div id="what">',
'#suffix' => '</div>',
'#type' => 'select',
'#title' => $whatLabel,
'#options' => $this->getOptionsBySelection($parent),
'#default_value' => key($this->getOptionsBySelection($parent)),
'#required' => true,
'#multiple' => false,
'#size' => false,
];
$form['submit'] = [
'#prefix' => '<div class="form-actions">',
'#suffix' => '</div>',
'#type' => 'submit',
'#value' => $this->t('Search'),
'#attributes' => [
'class' => [
'button',
],
],
];
return $form;
}
/**
* Ajax callback for the "Je souhaite" dropdown
*/
public function getOptions(array &$form, FormStateInterface $form_state) {
return $form['what'];
}
/**
* Returns list of options that correspond to the "Je souhaite" selected option
*/
public function getOptionsBySelection($parent) {
switch ($parent) {
case 'appointment':
$terms = $this->getAppointmentOptions();
break;
case 'doctor':
$terms = $this->getDoctorOptions();
break;
case 'help':
$terms = array(
'140' => 'Je suis patient',
'141' => 'Je suis aidant',
'142' => 'Pour un proche',
);
break;
default:
break;
}
return $terms;
}
/**
* Returns list of care_sheet_consultation taxonomy tree
*/
public function getAppointmentOptions() {
// ...
}
/**
* Returns list of :
* - care_sheet_consultation
* - care_sheet_hospitalization
* - care_sheet_medical_techno
* taxonomy trees
*/
public function getDoctorOptions() {
// ...
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
// CHOIX : Je souhaite prendre rendez-vous
if ($form_state->getValue('i_wish') == 'appointment') {
$form_state->setRedirect('entity.taxonomy_term.canonical', [
'taxonomy_term' => $form_state->getValue('what')
]);
}
// CHOIX : Je souhaite rechercher un médecin
else if ($form_state->getValue('i_wish') == 'doctor') {
$form_state->setRedirect('entity.node.canonical', [
'node' => '29', // i.e. page Annuaire
'service' => $form_state->getValue('what')
]);
}
// CHOIX : Je souhaite une aide ou un soutien
else if ($form_state->getValue('i_wish') == 'help') {
$form_state->setRedirect('entity.node.canonical', [
'node' => $form_state->getValue('what')
]);
}
}
}