2010-10-13 11 views
5

In drupal fapi gibt es ein Attribut "#process". Was genau tut? Warum Passwort-Feld für die Feld-Duplizierung verwenden, anstatt es mit Theming hinzufügen?
Ich möchte es verwenden, um einen neuen Feldtyp mit hook_elements zu definieren.Was ist "#Process" Rückruf in Drupal Form API verwenden?

Edit:
hier ist mein hook_elements:

function test_elemets() { 
    return array(
     'test_field' => array( 
      '#input' => TRUE, 
      '#process' => array('test_field_process'), 
     ) 
    ); 
} 

und Prozess Rückruf:

function test_field_process($element, $edit, &$form_state, $complete_form) { 
    $element = array();  
    return $element;  
} 

, wie Sie in der Prozessfunktion gebraucht I $ element = array(), um zu sehen, was passiert. Aber die Form wird so dargestellt, wie sie vorher war. Warum?

Antwort

9

Gelesen the Forms API documentation on the '#process' form element property.

Es ist ein Array von Callback-Funktionen, von denen jede mit dem Element-Definition-Array aufgerufen wird, das an sie übergeben wird. Die Rückruffunktion kann dann auf das Elementdefinitionsfeld einwirken, um es in eine andere (üblicherweise komplexere) Definition umzuwandeln, wie z.B. Duplizieren eines Passwortfelds beim Anhängen einer JavaScript-Datei zur Gleichheitsüberprüfung oder Umwandeln einer kombinierten "Funk" -Definition in eine entsprechende Menge spezifischer "Radio" -Definitionen usw.

Sie werden es verwenden wollen, wenn Sie eine komplexes Formularelement (z. B. eine Kombination mehrerer "Standard" -Elemente kombiniert oder eines mit automatischem Hinzufügen von Standard-JavaScript-Helfern), aber dennoch den einfachen, deklarativen Ansatz der Forms-API beibehalten. (Schauen Sie MA - nur ein '#type' = 'myCrazyFormElement' Array, das ‚automagically‘ auf etwas Weise komplexere erweitert;)

tun dies über die Thematisierung Schicht könnte möglich sein, je nach Anwendungsfall, würde aber mehr Code erforderlich , jedes Mal Sie brauchen es.

4

api.drupal.org documentation on #process sagt:

Eine Reihe von Funktionen, die aufgerufen werden, wenn ein Element verarbeitet wird. Unter Verwendung dieses Callbacks können Module weitere Aktionen "registrieren" . Zum Beispiel wird der Formulartyp "Funkgeräte" auf mehrere Optionsfelder mit einer Verarbeitungsfunktion erweitert.

Verarbeitung unterscheidet sich von Theming innerhalb der Form API. Sie können ein Formular-Array in der Design-Ebene nicht ändern (zumindest nicht in D6). Password fügt speziell # form_expand_ahah #process hinzu. Man könnte wahrscheinlich die meisten, dass in das Thema Schicht Flickschusterei, aber nicht diese Zeile:

$element['#cache'] = TRUE; 

Da Caching vor dem Thema Schicht passiert, dass nicht in dem Thema Schicht getan werden könnte. Allgemeiner gesagt, während etwas von dem, was in #process passiert, in der Themenebene passieren könnte, könnte es nicht alles dort passieren, weil Formulare mehr sind als die Front-End-Anzeige; Sie sind auch Back-End-Verarbeitung.

+0

Danke.But warum das Modul das Element zur Verfügung stellt, fügt diese Befehle nicht zur Funktion hook_elements selbst hinzu, zum Beispiel warum $ element ['# cache'] = TRUE in die Prozessfunktion anstelle von example_elements hook schreiben? –