Drupal8 Динамический вызов формы в модальном окне и ее сабмит

Главные вкладки

Аватар пользователя zeltekat zeltekat 21 июня 2016 в 20:02

Есть некая форма с выводом списка значений. Над формой три кнопки (добавить, редактировать, удалить)

<?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';    
}?>

физически он меняется, но при сабмите все равно используется походу "кешированый" урл...
Собственно вопрос: как можно открывать мод.окно из текущей формы, чтобы сабмит работал как текущей формы, так и модальных форм?