Wie emuliere ich alle AJAX-Funktionen, wenn das Formular nach einem AJAX-Rückruf gerendert wird?


7

Ich habe ein Drupal-Formular, aber ich füge es der Seite als Ergebnis eines AJAX-Rückrufs hinzu.

Ich benötige dieses Formular, um einen neuen Rückruf auszulösen. Mein Code unten:

      $form['#suffix'] = '<div id="form-return-message-box">this is the return box</div>';
  $form['#attached']['js'] = array('misc/ajax.js');

  $form['markup'] = array(
    '#type' => 'markup',
    '#markup' => '<h2>This is a form</h2>'
  );


  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Submit'),
    '#ajax' => array(
      'callback' => 'module_myform_callback',
      'wrapper' => 'form-return-message-box',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );

  $replace_layer = '#somelayer';

  $commands = array();
  $commands[] = ajax_command_replace($replace_layer, drupal_render($form));
  $page = array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );

  ajax_deliver($page);

Das passiert also: Dieses Formular wird in einen Container namens "Somelayer" eingefügt, der bereits auf der Seite vorhanden ist (ich habe diesen Teil des Codes nicht hinzugefügt, weil ich dachte, dass dies unnötig wäre). Es wurde von einem Link mit der Klasse 'use-ajax' aufgerufen.

Das Formular wird also nach einem durch den Link ausgelösten AJAX-Rückruf wie gewünscht auf der Seite gerendert. Dieser Teil funktioniert in Ordnung.

Aber hier ist der (sehr) knifflige Teil: Ich möchte auch die neue Form-AJAX-Funktionalität beibehalten (überprüfen Sie den '#ajax'-Teil des Arrays), der nicht auftritt. Nach dem Rendern des Formulars löst die Schaltfläche keinen AJAX-Code aus. Wenn Sie darauf klicken, wird die Seite aktualisiert und die Rückruffunktion wird nicht ausgelöst (hier nicht hinzugefügt, um Platz zu sparen).

Wenn Sie den Quellcode einer regulären Formularseite mit AJAX untersuchen, sehen Sie Code wie diesen, der die AJAX-Funktionalität aktiviert:

"ajax":{"edit-something":{"callback":"module_formname_callback","wrapper":"wrapper-name","method":"replaceWith","effect":"fade","event":"change","url":"\/spabear\/system\/ajax" ...

Wenn ich mir den Quellcode des Formulars ansehe, das meiner Seite hinzugefügt wurde, kann ich feststellen, <script></script>dass es in meinem dynamisch geladenen Formular keinen Code gibt, der den AJAX-Rückruf auslösen würde. Wie kann ich alle AJAX-Funktionen emulieren, wenn das Formular nach einem AJAX-Rückruf gerendert wird?


1
Hast du das gelöst? Ich habe ein sehr ähnliches Problem: drupal.stackexchange.com/questions/155527/…
Cambraca

Vielleicht im Zusammenhang mit drupal.org/node/1781242 ?
Berliner

1
Ist das Drupal 8?
Matt

Antworten:



0

Versuchen Sie, Ihrem #ajax ein 'verhindern' => 'Klicken' hinzuzufügen. Dadurch wird verhindert, dass das Formular die Seite sendet und aktualisiert. Danach sollte es etwas einfacher sein, das Problem zu debuggen.

    $ form ['button'] = array (
      '#type' => 'button',
      '#value' => t ('Submit'),
      '#ajax' => array (
        'callback' => 'module_myform_callback',
        'wrapper' => 'form-return-message-box',
        'Methode' => 'ersetzen',
        'effect' => 'fade',
        'verhindern' => 'klicken',
      ),
    );

0

Überprüfen Sie, ob Ihrem Formular die richtige Bibliothek beigefügt ist. Wenn es also in eine Seite geladen wird, wird sichergestellt, dass diese Bibliotheken für das definierte Verhalten verfügbar sind.

Ich gehe gemäß Ihrer ursprünglichen Frage davon aus, dass Sie auf D7 sind:

  $form['#attached']['library'][] = array('system', 'drupal.ajax');
  $form['#attached']['library'][] = array('system', 'jquery.form');

Ich bin mir bei Ihrem Codebeispiel nicht sicher, aber Sie sollten auch so viel wie möglich versuchen, Verantwortlichkeiten zu zerlegen. Sie sollten eine Funktion zum Generieren Ihres Formulars, eine Funktion zum Senden Ihres Formulars, eine Funktion zum Laden und Senden Ihres Formulars über Ajax usw. haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.