it-swarm.com.de

Modalform statt Weiterleitung

Ich habe ein Site-weites Kontaktformular eingerichtet, das den Benutzer zur Startseite weiterleitet und das Übermittlungsergebnis im Hilfebereich veröffentlicht. Es funktioniert wie beabsichtigt, aber ich habe mich gefragt, was ich tun muss, um dieses Verhalten zu ändern.

Anstatt umzuleiten, möchte ich das Ergebnis der Formularübermittlung in einem modalen (möglicherweise jQuery) Popup anzeigen.

Wie könnte ich das erreichen?

Ich möchte die Kernfunktionalität nicht verlieren, sondern sie möglicherweise mit einem benutzerdefinierten Modul oder etwas anderem überschreiben. Irgendwelche Gedanken?

EDIT :

Ausgehend von @ rémys Vorschlag habe ich ein .module Datei, in der ich versuche, das Standardverhalten für die Formularübermittlung zu überschreiben.

Im Moment habe ich nur Folgendes (obwohl es nicht funktioniert):

<?php

/*
*  Override the the form submit behaviour.
*/

function modal_contact_form_result_form_node_form_alter(&$form,       FormStateInterface $form_state, $form_id){
    $form['actions']['submit']['ajax'] = array(
        'callback' => 'ajax_test_dialog_form_callback_modal'
    );
}

function ajax_test_dialog_form_callback_modal($form, FormStateInterface $form_state){
    $response = new AjaxResponse();
    $content = 'Form submitted successfully, thank you!';
    $title = 'YForm submited';
    $response->addCommand(new OpenModalDialogCommand($title, $content, array('width' => '700' )));

return $response;

}

In diesem Moment wird jedoch weder die Umleitung verhindert noch das Modal angezeigt.

4
Joum

In einem benutzerdefinierten Modul müssen Sie das Kontaktformular ändern und der Schaltfläche "Senden" ein #ajax-Attribut hinzufügen:

function YOUR_MODULE_form_contact_site_form_alter(&$form, &$form_state) {
    $form['#prefix'] = '<div id="my_form_wrapper">';
    $form['#suffix'] = '</div>';

    $form['actions']['submit']['#ajax'] => array(
          'callback' => 'ajax_test_dialog_form_callback_modal',
    );
}

Stellen Sie diese Methode dann mit OpenModalDialogCommand auch in Ihrem Modul bereit:

    function ajax_test_dialog_form_callback_modal($form, &$form_state) {
      $response = new AjaxResponse();

      if ($form_state->getErrors()) {
        unset($form['#prefix']);
        unset($form['#suffix']);
        $form['status_messages'] = [
          '#type' => 'status_messages',
          '#weight' => -10,
        ];
        $response->addCommand(new HtmlCommand('#my_form_wrapper', $form));
      }
      else {
        $content = 'Something to show in the modal';
        $title = 'Hi, I'm a Modal';
        $response = new AjaxResponse();
        $response->addCommand(new OpenModalDialogCommand($title, $content, array('width' => '700')));
      }
      return $response;
    }

Hier verwende ich das Formularelement status_messages, um Validierungsfehler anzuzeigen. Andernfalls wird ein Modal mit benutzerdefiniertem Text angezeigt.

Mit drupal_get_messages () können Sie die Systemnachrichten abrufen und die Warteschlange löschen.

Vergessen Sie nicht, die Klassen zur Verfügung zu stellen

use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
3
rémy

Check out https://www.mediacurrent.com/blog/loading-and-rendering-modal-forms-drupal-8 - erklärt das Laden und Rendern von Formularen in modalen Dialogen in Drupal 8.

1
edwardchiapet

Schauen Sie sich Ihren drupal Watchdog) an.

Sie können am Anfang Ihres Moduls hinzufügen:

use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
1