In my case (D8), I just had to implement the RedirectCommand in my AjaxSubmit :
Code of the submit button :
$form['submit_' . $this->uniqueIdentifier] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
'#attributes' => [
'class' => ['btn', 'btn-primary']
],
'#ajax' => [
'callback' => [$this, 'submitModalFormAjax'],
'event' => 'click',
],
];
Code of the submit callback:
public function submitModalFormAjax(array $form, FormStateInterface $form_state) {
$response = new AjaxResponse();
if ($form_state->hasAnyErrors()) {
// Do validation stuff here
// ex: $response->addCommand(new ReplaceCommand... on error fields
}
else {
// Do submit stuff here
$url = Url::fromRoute('page_route');
$command = new RedirectCommand($url->toString());
$response->addCommand($command);
}
return $response;
}
Do not forget to declare :
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\RedirectCommand;
use Drupal\Core\Url;