Einem Formularfeld AJAX hinzufügen
am 16.02.2011 - 22:36 Uhr in
Ich habe ein eigenes Modul erstellt, dass einen neuen Inhaltstypen erstellt und diesem dann die Felder verein_name und verein_kurzname hinzufügt.
Dies geschieht über die Moduldatei verein.install
Bis hierhin ist die Dtei verein.module einfach nur leer.
Es funktioniert auch, denn ich kann anschließend einen entsprechenden Node über "Inhalt hinzufügen" erzeugen.
Nun wollte ich das Eingabeformular insofern abändern, als ich dem Feld verein_name die AJAX-Funktionalität hinzufügen wollte.
Wird ein Name im entsprechenden Feld eingetragen, soll sich die Beschreibung des Feldes für den Kurznamen entsprechend anpassen.
Der Code dafür stammt aus dem Modul "examples"
Geht auch, ich habe den folgenden Code in die Datei verein.module eingefügt:
function verein_form_alter(&$form, &$form_state, $form_id) {
switch ($form_id) {
case 'verein_node_form':
$form['verein_name'] = array(
'#type' => 'textfield',
'#title' => t('Vereinsname'),
'#weight' => -4,
'#ajax' => array(
'callback' => 'verein_simplest_callback',
'wrapper' => 'replace_meldung_div',
),
);
$form['verein_kurzname'] = array(
'#type' => 'textfield',
'#title' => t('Kurzname'),
'#description' => '',
'#weight' => -3,
'#prefix' => '<div id="replace_meldung_div">',
'#suffix' => '</div>',
);
if (!empty($form_state['values']['verein_name'])) {
$form['verein_kurzname']['#description'] = t('der lange Name lautet:'). " '{$form_state['values']['verein_name']}'";
}
break;
}
}
function verein_simplest_callback($form, $form_state) {
// The form has already been submitted and updated. We can return the replaced
// item as it is.
return $form['verein_kurzname'];
}
Im Grunde führe ich also ein hook_form_alter() im selben Modul aus.
Das klappt, weil Drupal 7 intern schon vorher das Standardformular generiert haben muss.
Beim Verlassen des Feldes "verein_name" durch drücken der Taste "Tab" wird AJAX gestartet und die Beschreibung des Feldes "verein_kurzname" ändert sich.
Allerdings geht der Fokus zu diesem Feld verloren => der Curser hängt im luftleeren Raum, statt im Feld "verein_kurzname"
Anschließend klicke ich in das Feld "verein_kurzname" und gebe ihn ein.
Dann klicke ich auf die Schaltfläche speichern, erhalte jedoch die ziemlich kryptische Fehlermeldung lt. Anhang.
Irgendetwas scheint zu fehlen, oder es ist ein BUG.
Bin für jeden Hinweis dankbar.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hier noch die Fehlermeldung
am 16.02.2011 - 22:38 Uhr
Hier noch die Fehlermeldung als Screenshot
Inzwischen kann ich sagen,
am 19.02.2011 - 18:07 Uhr
Inzwischen kann ich sagen, dass es nichts mit Ajax zu tun.
Die Fehlermeldungen kommen immer, wenn ich ein Formularfeld mit hook_form_alter() ändere.
Außerdem kann ich gar nicht alle Elemente ansprechen, wenn ich nicht das ganze Formularfeld ersetzen möchte, sondern nur einen bestehenden Wert ändern will.
z.B. geht:
$form['verein_name']['#weight'] = -3;
Die Gewichtung wird im Formular auf -3 geändert
z.B. geht nicht:
$form['verein_name']['#description'] = t('Test');
wird einfach ignoriert
Könnte jemand ein Beispiel posten, wie es in Drupal 7 geht ?
Hat's noch keiner versucht ?
am 02.03.2011 - 18:08 Uhr
Hat's noch keiner versucht ?
Ein Syntax-Detail
am 01.04.2011 - 11:16 Uhr
Hey @Micha1111! Gibt es einen Grund für die unten stehende Schreibweise?:
$form['verein_kurzname']['#description'] = t('der lange Name lautet:'). " '{$form_state['values']['verein_name']}'";
Reicht denn nicht einfach:
$form['verein_kurzname']['#description'] = t('der lange Name lautet:'). $form_state['values']['verein_name'];
Nur so ein Detail.