nach der Übersicht in Teil 1 folgt hier die Liste aller Feldtypen und Properties mit Beispielen.
Auch wenn's etwas unübersichtlich aussieht - ein kleiner Blick lohnt sich.
Das meiste ist ausprobiert - und hat sich zu Drupal7 hoffentlich nicht zu arg geändert :-)
Feldtypen

Feldtypen | Default-Werte |
| Genau 1 Checkbox | |
$form['copy'] = array( '#type' => 'checkbox', '#title' => t('Send me a copy.'), ); | #return_value = 1 #ahah['event'] = 'change' |
| mehrere Checkboxen options als key-value Paar | |
$form['question'] = array( '#type' => 'checkboxes', '#title' => t('Default options'), '#default_value' => 'promote'), '#options' => array( 'status' => t('Published'), 'moderate' => t('In moderation queue'), 'promote' => t('Promoted to front page'), 'sticky' => t('Sticky at top of lists'), ), '#description' => t('[irgendein Text]'), ); | #tree = TRUE |
Wie checkbox | #ahah['event'] = 'change' |
Wie checkboxes | |
| Dropdown-Menü | |
Aufbau wie checkboxes oder radios | |
#default_value und #return_value ist Array: array('year'=>2007, 'month'=>2, 'day'=>15) $form['question'] = array( '#type' => 'date', '#title' => t('Datum'), ); | #default_value = Heute |
$form['new']['upload'] = array( '#type' => 'file', '#title' => t('Attach new file'), ); Zusätzlich braucht das Formular dieses (siehe hier): $form['#attributes'] = array('enctype' => "multipart/form-data"); Und einiges Herumwerkeln in der submit-Funktion (ebenfalls hier). | #size = 60 |
| 1-zeilig | |
$form['title'] = array( '#type' =>'textfield', '#title' =>t('Subject'), '#default_value' =>$node->title, '#required' =>TRUE, ); | #size = 60 #maxlength = 128 #autocomplete_path = FALSE #ahah['event'] = 'blur' |
$form['body'] = array( '#type' =>'textarea', '#title' =>t('Body'), '#default_value' =>$node->body, '#required' =>TRUE ); | #cols = 60 #resizable = TRUE #rows = 5 #ahah['event'] = 'blur' |
| Textfeld, welches den Inhalt als '•••' anzeigt | |
$form['pass'] = array( '#type' => 'password', '#title' => t('Password'), '#maxlength' => 64, '#size' => 15, ); | #size = 60 #maxlength = 128 #ahah['event'] = 'blur' |
| Zwei Passwort-Felder, deren Inhalte identisch sein müssen | |
$form['pass'] = array( '#type' => 'password_confirm', '#title' => t('Password'), '#size' => 25, ); | #size = 60 |
| Dropdown-Menü mit den Zahlen -Delta bis +Delta | |
$form['weight'] = array( '#type' => 'weight', '#title' => t('Weight'), '#default_value' => 0, '#delta' => 5, ); | #delta = 10 |
Besondere Feldtypen | ||
| Freier Text Im HTML direkt vor dem nächsten Element | ||
$form['infotext'] = array( '#value' => t('Press this Button '), ); $form['submit'] = ... // der OK-Button '#type'=>'markup' kann fehlen, weil das der Default ist ! | ||
| wie markup, aber Text in <div>..</div> | ||
$form['infotext'] = array( '#value' => t('Press this Button '), '#type' => 'item', ); HTML-Ausgabe: <div class="form-item">Press..</div> | ![]() | |
| Gruppiert Felder Auch schachtelbar ! | ||
$form['contact'] = array( '#type' => 'fieldset', '#title' => t('Contact settings'), '#weight' => 5, '#collapsible' => TRUE, '#collapsed' => FALSE, ); Elemente im Fieldset werden dann so gebildet: $form['contact']['vorname'] = array( ... | #collapsible = FALSE #collapsed = FALSE | |
| OK, Senden, Accept | ||
$form['submit'] = array( '#type' => 'submit', '#value' => t('Und los...') ); Betätigen dieses Buttons ruft submit-Funktion auf. | #name = 'op' #button_type = 'submit' #executes_submit_callback = TRUE #ahah['event'] = 'click' | |
| Funktion wie submit | ||
$form['ok'] = array( '#type' => 'image_button', '#value' => 'Anmelden', '#prefix' => '<div class="spezial">', '#src' => 'files/ok_pic.gif', '#suffix' => '</div>', ); | #button_type = 'submit' #executes_submit_callback = TRUE #ahah['event'] = 'click' | |
| Validiert (wie bei submit), ruft aber nicht die Submit-Funktion auf | ||
$form['preview'] = array( '#type' => 'button', '#value' => t('Preview'), ); Sobald '#executes_submit_callback '= true gesetzt wird, verhält sich button wie submit ! | #name = 'op' #button_type = 'submit' #executes_submit_callback = FALSE #ahah['event'] = 'click' | |
| zB für mehrstufige Formulare | ||
$form['gesamt'] = array( '#type' => 'value', '#default_value' => 1, // "Formular-Variable" ); | ||
| kann (anders als value) auch durch Javascript geändert werden | ||
$form['seite'] = array( '#type' => 'hidden', '#default_value' => 1, // Unterschied sonst unklar ); | ||
Attribute (Properties)
Wo? | Attribute | Felder | ||
E | Alle | Formelement erscheint "Grau" - nicht editierbar -> true/false | ||
G/E | HTML vor/nach Element | Alle | $form['choice'] = array( '#type' =>'fieldset', '#title' =>t('Choices'), '#prefix' =>'<div class="poll-form">', '#suffix' =>'</div>', ); | |
Alle | Reihenfolge | |||
E | Alle | false à Item wird nicht gerendert (quasi nicht vorhanden) | ||
E | Alle | ?? Nicht verstanden... Siehe #tree and #parents auf drupal.org | ||
E | Alle außer button u.ä. | $form['url'] = array( '#type' => 'textfield', '#title' => t('URL eingeben'), '#description' => 'Nur lokale Adressen !', ); ![]() Beschreibung unterhalb Form-Element | ||
E | Alle Eingabe-Elemente | Titel - bitte in t(..) setzen, um Übersetzung zu ermöglichen. | ||
G/E | wird in HTML-Tags eingebaut | Alle Eingabe-Elemente | Klasse für das gesamte Formular: $form['#attributes'] = array('class' => 'search-form'); Klasse für Checkbox/Fieldset...: '#attributes' => array('class' => 'readonly', 'style' => ''), | |
E | Alle Eingabe-Elemente nicht filefield | true à Eingabe erforderlich. Name bekommt ein "*" | ||
E | checkbox(es) radio(s) select, date textarea, -field token, weight hidden | Voreingestellter Wert, wenn Formular aufgebaut wird. | ||
E | button image_button submit markup, item token, value | Fester Wert - nicht vom User zu ändern. zB Button-Name oder Wert von Value-Element. Siehe unbedingt auch #name $form['vid'] = array( // hier: interner Gebrauch '#type'=>'value', '#value' => $node->vid ); | ||
E | für CSS-Class | button image_button submit | $form['ok'] = array( '#type' => 'submit', '#value' => 'OK', '#button_type' => 'ok2', ); // erzeugt dieses HTML: <input type="submit" class="form-ok2" value="OK" id="edit-ok" name="op"> | |
E | button submit | Alle Button/Submit-Elemente müssen gleichen Namen haben. Default: 'op' Aber: Wenn #value identisch, muss #name unterschiedlich sein, sonst kann Drupal die Buttons nicht unterscheiden. | ||
E | image_button | Pfad zum Bild | ||
E | button image_button submit | Soll "submit" aufgerufen werden ? Default: true (button: false) | ||
E | textfield password password_confirm select | Breite - Default=60 | ||
E | textfield | '#field_prefix' => 'Hier:', Text vor (nach) dem textfield - inline mit <span>. HTML-Ausgabe: <span class="field-prefix">Hier:</span> | ||
E | textfield password | Maximale Eingabelänge (Zeichen) | ||
E | textarea | Breite - Default=60 | ||
E | textarea | Höhe - Default=5 | ||
E | textarea | Default à false | ||
E | select | True à Dropdown-Menü wird zu Liste im Kasten, damit mehrere Items auswählbar sind: $form['items']=array('#type' => 'select', '#title' => 'Welche Farben', '#options' => array('rot','gelb','blau'), '#multiple' => 1, ); | ||
E | checkboxes radios select | einfache Liste oder key=>value Liste Ergebnis ('#value') ist dann Array-Index oder Array-Key | ||
E | checkbox radio image_button | Default à 1 Ändert generischen Rückgabewert. | ||
E | weight | Dropdown-Menü mit den Zahlen -Delta bis +Delta | ||
E | fieldset | Fieldset ist "eingeklappt" à true/false | ||
E | fieldset | Fiedset ist "einklappbar" à true/false | ||
Wo? | Callback-Attribute | Funktionen, die etwas erledigen sollen - siehe unten à Workflow-Grafik | |
G/E | Alle | Liste von Funktionen, die bei "processing" aufgerufen werden. Drupal erzeugt zB. mit der Callbackroutine process_weight($element) die Dropdownliste für select. Auch das Form-Element von checkboxes und radios wird auf diese Weise aufgeblasen - inkl. Auto-Generierung aller CSS-Klassen. #processed wird true gesetzt, damit nicht mehrmals "aufgeblsen" wird. | |
G/E | Alle | Theme-Function - ohne 'theme_' | |
G/E | Alle | Liste von Funktionen, die vor/nach drupal_render() aufgerufen werden sollen. Achtung: wird auch hook_form_alter() benutzt, kann es zu Problemen kommen. (eher selten benutzt) | |
G/E | Array von Funktionsnamen, die nach build aufgerufen werden sollen | Alle | $form['file_directory_path'] = array( '#type' => 'textfield', '#title' => t('File system path'), '#default_value' => file_directory_path(), '#maxlength' => 255, '#description' => t('A file system path...'), '#after_build' => array('system_check_directory'), ); ... function system_check_directory($form_element) {...} |
E | Alle | Liste von Validierungsfunktionen. Dort muss form_error() oder form_set_error() aufgerufen werden, wenn die Validierung fehlschlägt. | |
G/E | button image_button submit | Liste von Funktionen. Zusätzlich / Alternativ zu {form}_validate(). Nutze form_set_error(), wenn es nicht valide ist. | |
E/G | button image_button submit | Liste von Funktionen, die anstatt(!) {form}_submit() aufgerufen werden. $form['#submit'][]='_myProject_form_submit'; Parameter der aufgerufenen Funktion: function _myProject_form_submit ($form, &$form_state) {...} | |
E | textfield | Pfad zum AJAX Autocomplete-Script - nur für user implementiert: $form['author']['name'] = array( '#type' => 'textfield', '#title' => t('Authored by'), '#autocomplete_path' => 'user/autocomplete', '#default_value' => $node->name, ); |
Globale-Attribute | wirken nur auf das gesamte Formular |
Sprung auf URL bei Submit. Kein {form}_validate() und {form}_submit() | |
HTTP-Methode 'get' oder 'post' | |
URL, die mit drupal_goto() angesprungen wird, wenn form_submit() selber nicht springt. | |
#id | Selbstgewählte CSS-Klasse (Default: form-ID) |
Der nächste Teil
behandelt einige typische und praktische Vorgehensweisen...




![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form1.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form2.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form3.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form4.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form4b.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form5.png)
![Formulare - (kl)eine Einführung [2]](http://www.comm-press.de/sites/default/files/imagecache/scframe160x090/form6.png)













