Kann ich Ajax verwenden, um mehrere Formularelemente von einer Eingabe aus anzusprechen?

8

Ich versuche, mit Ajax zwei verschiedene Teile eines Drupal-Formulars von nur einer Formulareingabeunschärfe zu aktualisieren.

Ich habe das Standard-Ajax-Zeug auf meiner Eingabe:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Dies funktioniert gut und tauscht mein div aus, wenn die Eingabe aktualisiert wird. Ich möchte jedoch auch eine andere Formulareingabe an anderer Stelle im Formular mit einem anderen Code aktualisieren, da die ursprüngliche Eingabe unscharf ist.

Ist das möglich, irgendwelche Ideen?

Bearbeiten: Zur Verdeutlichung hier mein Beispiel aus der realen Welt:

  • Inhaltstyp 'Film'
  • Feld 'primary_title' hinzugefügt
  • Wenn 'primary_title' aktualisiert wird, sucht mein Ajax-Rückruf nach ähnlichen Zeichenfolgen und gibt HTML zurück.
  • Das HTML aus dem Rückruf wird in ein leeres div eingefügt.

    Dieser Teil funktioniert großartig!

Ich versuche auch, die Eingabe des Standardknotens 'title' zu ändern und ihm den Wert 'primary_title' zu geben, nachdem ich einen regulären Ausdruck zum Aufräumen der Zeichenfolge vorgenommen habe (Entfernen von "The" oder "A" vom Anfang usw.). Das Ergebnis Es handelt sich um zwei Titelfelder, eines mit dem vollständigen Titel 'primary_title' und eines mit dem Titel 'title', die zum Sortieren und Anzeigen von Datensätzen nützlich sind.

Rick
quelle

Antworten:

13

Es scheint, dass Sie mit Ajax-Befehlen auf verschiedene Teile eines Formulars abzielen können. Sie müssen jedoch nur einen der folgenden Befehle zurückgeben :

  • HTML oder

  • Ein renderbares Array oder

  • Ein Array von AJAX-Befehlen

In der Situation, über die ich ursprünglich geschrieben habe, habe ich versucht, sowohl ein Array von AJAX-Befehlen als auch ein renderbares Array zurückzugeben, was nicht möglich erscheint.

Der Code im Beispielmodul demonstriert das Targeting verschiedener Teile eines Formulars mithilfe eines Arrays von AJAX-Befehlen:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

In diesem Codebeispiel erhält #html_div $ text und #html_status separat "Aktualisiertes html_command_example mit text = $ text;". Datum ('r'). ""

Zwei verschiedene Stellen auf einem Formular mit zwei verschiedenen Informationen aus dem einen Ajax-Rückruf!

Als ich mir noch einmal ansah, woran ich arbeitete, wurde mir klar, dass ich das Knotentitelfeld überhaupt nicht zurückgeben musste. Es wird nur ein Dienstprogrammfeld sein, das zum Sortieren von Daten in Listen verwendet wird.

Ich habe das Feld im Knotenformular ausgeblendet und es wird beim zweiten Erstellen meines Formulars ausgefüllt, wenn mein ursprünglicher Ajax-Rückruf ausgelöst wird.

Rick
quelle
0

Ich bin ziemlich neu bei Drupal, aber bisher fand ich das Ajax-Framework ziemlich unflexibel. Es funktioniert hervorragend, solange Sie es so verwenden, wie es beabsichtigt war. Wenn Sie also in Ihrem Fall einige JS kennen, ist es auf jeden Fall das Beste, dieses Skript selbst zu erstellen, es sollte sehr leicht sein.

Viel Glück!

SilidAdmin
quelle
Vielen Dank für den Vorschlag :) Ich habe festgestellt, dass ich das Knotentitelfeld überhaupt nicht zurückgeben muss, da es einfach als Dienstprogrammfeld zum Organisieren von Listen verwendet wird. Es wird ausgefüllt, wenn mein Formular aufgrund meines vorhandenen Ajax-Rückrufs neu erstellt wird.
Rick
0

Eine weitere Option von drupal.org :

Sie können das gesamte Formular problemlos ersetzen, wenn dies am einfachsten ist. Fügen Sie einfach ein #prefix und #suffix zum gesamten Formulararray hinzu und legen Sie dieses als #ajax ['wrapper'] fest. (Auf diese Weise können Sie mehrere Formularelemente über einen einzigen Ajax-Aufruf ändern.) Der einzige Grund, dies nicht zu tun, besteht darin, dass der Vorgang schneller ist, wenn weniger Informationen übertragen werden.

Ihre Rückruffunktion kann so einfach sein wie:

function _callback($form, $form_state) {
  return $form;
}

Dies sollte von einem #ajaxArray in einem Formularelement ( field_whateverfür das folgende Beispiel) aufgerufen werden, das in einem hook_form_FORM_ID_alter()(oder einer Art Formularänderungs-Hook) definiert ist, in dem Sie auch $form_statedas $formArray testen und Änderungen daran vornehmen, z.

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
cdmo
quelle