Drupal 8 Form с пользовательским действием - PullRequest
1 голос
/ 29 октября 2019

Я создал ModalDialog в Drupal, который содержит две формы, такие как:

public function signUpForm() {

    $response = new AjaxResponse();
    // Get the modal form using the form builder.
    $modal_form[] = $this->formBuilder->getForm('Drupal\signup_form\Form\SignupForm');
     $modal_form[] = $this->formBuilder->getForm('Drupal\signup_form\Form\SigninForm');

    // Add an AJAX command to open a modal dialog with the form as the content.
    $response->addCommand(new OpenModalDialogCommand('', $modal_form, ['width' => '800','dialogClass' => 'signup-modal']));

    return $response;
  }

Формы отображаются, но проблема в том, что обе формы отправляются в одну и ту же функцию. Я не могу изменить действие формы. Есть ли варианты, позволяющие изменить действие формы на пользовательский URL?

1 Ответ

0 голосов
/ 30 октября 2019

Вам нужно изменить эти формы, чтобы вы могли добавлять свои собственные обработчики отправки (и удалять нежелательные), и в конечном итоге оттуда вы сможете установить соответствующий редирект, или AjaxResponse.

Например, для каждой формы внедрите hook_form_alter из пользовательского модуля:

function MODULE_signup_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
  $form['actions']['submit']['#submit'][] = 'MODULE_signup_form_ajax_submit';
}

Затем добавьте соответствующие обработчики отправки, например. :

function MODULE_signup_form_ajax_submit(array $form, FormStateInterface &$form_state) {
  $response = new AjaxResponse();
  $form-class = '.signup-form'; # using your own selector 
  $selector = '#drupal-modal' . ' ' . $form-class;
  $message = '<div>submitted</div>';
  $response->addCommand(new ReplaceCommand($selector, $message));
  $form_state->setResponse($response);  
}

Я предположил, что вы хотите обновить модальное содержимое, чтобы вторую форму можно было отправить, поэтому здесь я добавил класс 'use-ajax-submit' (ср. Drupal.behaviors.AJAX) в соответствующую форму $Атрибуты действия, так что ответ на отправку также может быть представлен в модальном режиме. Также используется ReplaceCommand для замены отправленного содержимого формы простым сообщением.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...