I'm building pretty simple forms loaded with AJAX and displayed with Foundation Reveal. I can get the form submission to work with AJAX, and update the markup inside the reveal, but with the AJAX-powered submission button, the validation method is not executed.
Why? How can I get the form validated with AJAX?
I just want the normal form validation process, where I can add my own validation to ::validateForm
and then pass control to my AJAX form submission handler.
$form['submit'] = [
'#type' => 'submit',
'#value' => 'Tallenna',
'#ajax' => [
'callback' => '::ajaxFormSubmitHandler'
]
];
I tried with $form['#validate'] = array('::validateForm');
, but it doesn't work. I also tried calling Form::validateForm($form, $form_state)
in the submission handler with the following code.
Form::validateForm($form, $form_state);
if ($form_state->hasAnyErrors()) {
$form_state->setRebuild();
$errors = $form_state->getErrors();
return($form);
}
else {
$form_state->setRebuild(FALSE);
}
I can set up the callback for a single element.
$form['field_asiakkaan_nimi'] = [
'#type' => 'textfield',
'#title' => $this->t('Asiakkaan nimi'),
'#required' => TRUE,
'#ajax' => [
'callback' => array($this, 'validateNimiAjax'),
'event' => 'change',
],
'#suffix' => '<span class="nimi-valid-message"></span>'
];
I can use that callback for the field processing.
public function validateNimiAjax(array &$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$message = 'Nimi validoitu!';
$response->addCommand(new HtmlCommand('.nimi-valid-message', $message));
return $response;
}
This doesn't seem to be the proper way to go about this.
I am also getting this error:
The form has become outdated. Copy any unsaved work in the form below and then reload this page.
How can I get AJAX delivered forms validated and processed?