Есть некая форма с выводом списка значений. Над формой три кнопки (добавить, редактировать, удалить)
<?php $form['top']['add'] = array(
'#type' => 'submit',
'#value' => t('добавить'),
'#name' => 'add',
'#ajax' => array(
'callback' => '::ajaxCallback',
'event' => 'click'
),
);?>
по нажатию на них, через ajaxCallback возвращается AjaxResponse c командой открыть модальное окно с соответствующей формой
<?phppublic function ajaxCallback(array &$form, FormStateInterface $form_state) {
$sbmt = $form_state->getTriggeringElement();
$element = $sbmt['#name'];
$options = array(
'dialogClass' => 'popup-dialog-class',
'width' => '1000',
// 'height' => '500',
);
if($element == 'add'){
$form = \Drupal::formBuilder()->getForm('Drupal\Form\AddForm');
$command = new OpenModalDialogCommand(t('Добавить '),$form,$options);
} else if($element == 'edit'){
$form = \Drupal::formBuilder()->getForm('Drupal\Form\AddForm',['id' => $this->getkId($form, $form_state)]);
$command = new OpenModalDialogCommand(t('Изменить '),$form,$options);
} else if($element == 'del'){
$form = \Drupal::formBuilder()->getForm('Drupal\Form\DelForm',['id' => $this->getIds($form, $form_state)]);
$command = new OpenModalDialogCommand(t('Удалить '),$form,$options);
}
$ajax_response = new AjaxResponse();
$ajax_response->setAttachments($form['#attached']);
$ajax_response->addCommand($command);
return $ajax_response;
}?>
ф-ции getkId и getIds - возврат унакального айди записи, которую мы редактируем или удаляем.
Проблема в том, что после открытия формы в модальном окне и попытке ее засабмитить вылетает аякс ошибка.
При ее диагностике выяснилось, что при нажатии на кнопку сабмита любой из модальных форм запрос идет не на урл нашей формы, а на урл нашей первой формы, которая выводит список записей... понятное дело, что бьет ошибку.
Если сначала генерить ссылку на форму и потом жмакать на нее,
<?phpLink::createFromRoute( t('добавить'),'add', [],
// [
// 'attributes' => [
// 'class' => 'use-ajax btn add',
// 'data-dialog-options' => '{"width": "1200px"}',
// 'data-dialog-type' => 'modal',
// ],
// ]
// ),?>
то форма отлично открывается и сабмитится, но есть большое НО:
после этих форм меняется урл сабмита основной формы на урл модальной формы(например, основная-/list модальная-/add) и она также перестает сабмититься...
при попытке внаглую изменить экшин урл формы
<?phpfunction form_form_alter(&$form, &$form_state) {
$form ['#action'] = '/add';
}?>
физически он меняется, но при сабмите все равно используется походу "кешированый" урл...
Собственно вопрос: как можно открывать мод.окно из текущей формы, чтобы сабмит работал как текущей формы, так и модальных форм?