BLOG

Formulare - (kl)eine Einführung [2]

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

Außer 'textfield' und 'submit' gibt es noch weitere Feldtypen.
Jeder Feldtyp braucht spezielle Attribute - einige haben bereits (sinnvolle) Defaultwerte.
Eine genaue Auflistung findet sich in der forms_api_reference auf api.drupal.org.
 
 
Feldtypen
Default-Werte
Genau 1 Checkbox
 
$form['copy'] = array(
 '#type' => 'checkbox',
 '#title' => t('Send me a copy.'),
);
#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
 
 
$form['body'] = array(
  '#type' =>'textarea',
  '#title' =>t('Body'),
  '#default_value' =>$node->body,
  '#required' =>TRUE
);
#cols = 60
#resizable = TRUE
#rows = 5
Textfeld, welches den Inhalt als '•••' anzeigt
 
$form['pass'] = array(
  '#type' => 'password',
  '#title' => t('Password'),
  '#maxlength' => 64,
  '#size' => 15,
);
#size = 60
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'
#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'
#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'
#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
);
 
weitere Felder: token, form
 
 

Attribute (Properties)

Eigenschaften können sich auf einzelne Elemente (E) beziehen (zB '#value') - oder auf das gesamte Formular (G).
Globale Attribute werden wie ein Form-Element definiert - netterweise erkennt man Attribute ja am '#'. Bsp:
$form['#after_build'] = array('node_teaser_js', 'node_teaser_include_verify');
à Nach Formularbildung werden zwei weitere Funktionen aufgerufen: 'node_teaser_js'und 'node_teaser_include_verify'.
 
 
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]
Formulare - (kl)eine Einführung [2]
Formulare - (kl)eine Einführung [2]
Formulare - (kl)eine Einführung [2]
Formulare - (kl)eine Einführung [2]
Formulare - (kl)eine Einführung [2]
Formulare - (kl)eine Einführung [2]

Kommentare

kleiner Fehler

Moin,

Euer Beitrag kam mir gerade recht um nen kleines Beispiel für eine Schulung zu kopieren.

Dabei ist jedoch ein kleiner Fehler bei den checkboxes aufgefallen. In der Zeile
'#default_value' => 'promote'),
hat sich eine Klammer zu viel eingeschlichen und führt zu einem Parser-Error ;-)

Viele Grüße,
Sven

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Mit dem Absenden dieses Formulars, akzeptieren Sie die Datenschutzrichtlinie von Mollom.