Form API: hook_form()
![](https://www.drupalcenter.de/files/imagecache/upic_mini/pictures/picture-110.jpg)
am 01.12.2007 - 03:11 Uhr in
An alle die sich wirklich mit hook_form() auskennen.
1.
Formelemente die in einem Node-Modul in hook_form() aufgenommen werden erscheinen im Bearbeiten-Formular einer Node. Was muss man tun um Formelemente zu erstellen die nicht im Bearbeiten-Formular erscheinen sonder nur bei der Nodeansicht verwendet werden?
2.
Zur Frage von 1. habe ich 2 Moeglichkeiten gefunden, in einem Node-Modul Formelemente zu definieren. Bei beiden Moeglichkeiten ist es so, das damit definierte Formelemente nicht vom Bearbeiten-Formular einer Node sondern nur bei der Nodeansicht verwendet werden.
3.
Ich wuerde gern als Ergebnis dieses Thread einen Handbuchbeitrag erstellen der alle 3 Moeglichkeiten vorstellt und beschreibt.
Dies moechte ich aber nicht allein machen. Ich suche Jemanden der den Part von hook_form() uebernimmt. Ich steuer die beiden anderen Varianten bei.
-----------------------
quiptime
- Anmelden oder Registrieren um Kommentare zu schreiben
Hi quiptime
am 02.12.2007 - 21:56 Uhr
Hi quiptime
zu 1:
hook_form ist genau dafür zuständig, das Bearbeiten-Formular zu bearbeiten :-)
Um ein Formular auf der Node-Ansicht anzuzeigen, benutzt du hook_nodeapi(). Fragst dort ab, ob dein Content-Type angezeigt wird mit $op == view und $node->type == x. Ergänzt dann das $node->content[]-Array und rufst dort drupal_get_form() mit dem Funktionsnamen, in dem du dein ganz eigenes Formular definierst, auf.
Ich spar mir das Ausführliche jetzt ok? Kanns aber nachreichen, wenn du nicht klarkommst.
zu 2 + 3.
Ah, ok.. Man sollte immer erst den ganzen Post lesen bevor man antwortet :-)
Ich verstehe den 2. Punkt nicht richtig. Aber wenn ich meine laschen Ausführungen zu 1 konkretisieren soll fürs Handbuch - kann ich das gerne tun. Gib nochmal bescheid.
@mhuebi, Danke Dir fuer Dein
am 02.12.2007 - 22:59 Uhr
@mhuebi,
Danke Dir fuer Dein Feedback. Kann ich Deinen Post als Zusage fuer den Handbuchbeitrag verstehen?
1. ist mir komplett klar.
Um ein Formular auf der Node-Ansicht anzuzeigen, benutzt du hook_nodeapi(). Fragst dort ab, ob dein Content-Type angezeigt wird mit $op == view ...
Es geht mir auch darum was man machen kann um ein mit mymodule_form() definiertes Formelemen nur ausschliesslich bei der Nodeansicht anzuzeigen.
Was ich mit 2. meine.
Beispiel:
Nehmen wir an man benoetigt bei der Nodeansicht ein Selectfeld um per Javascript Aktionen auszuloesen. Dieses Selectfeld soll aber fuer den Bearbeiter einer Node nicht erreichbar sein, ergo nicht im Bearbeitenmodus erscheinen. Auch gibt es abgesehen von der Definition des Selectfeldes beim Erstellen des Modules keinen Administrationsbedarf fuer dieses Selectfeld
In diesem Falle muss ich das Selectfeld ja irgendwie definieren koennen. Dafuer habe ich 2 Drupal-Moeglichkeiten gefunden.
-----------------------------------------------
Meine Idee fuer den Handbuchbeitrag Form API. Hiermit gebe ich Bescheid.
Ich weiss es gibt da Dokus auf drupal.org. Aber denen fehlt nach meiner Einschaetzung das gewisse Etwas.
Ich moechte eigentlich keine Uebersetzung der existierenden Form Api Dokus produzieren sondern schon etwas Eigenstaendiges. Dabei habe ich die Hoffnung, ein wenig mehr Verstaendnis fuer die Verwendung der Form API zu erzeugen.
Kannst Du mit diesen Gedanken mitgehen.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
quiptime wrote: Kann ich
am 03.12.2007 - 07:37 Uhr
Kann ich Deinen Post als Zusage fuer den Handbuchbeitrag verstehen?
Ja, kannst du. Ich könnte den Formularprozess auch noch mal in der Theorie erklären (Ablauf, aufgerufene Funktionen etc). Wir müssen nur klären, wer was genau schreibt. Außerdem komme ich zu sowas wahrscheinlich nur am Wochenende.
Es geht mir auch darum was man machen kann um ein mit mymodule_form() definiertes Formelemen nur ausschliesslich bei der Nodeansicht anzuzeigen.
Vielleicht scheitere ich hier an meinen Kenntnissen, aber wenn ich hook_form() einsetze, dann bearbeite ich das "Editiere"-Formular. Alles was ich mit hook_form() definiere, wird NIE auf der Nodeansicht angezeigt. Dazu setzt man hook_nodeapi() ein. Oder?
In diesem Falle muss ich das Selectfeld ja irgendwie definieren koennen. Dafuer habe ich 2 Drupal-Moeglichkeiten gefunden.
Welche? :-) Schreib mal, was du dann genau ins Handbuch schreiben möchtest.
Kannst Du mit diesen Gedanken mitgehen.
Ja.
Ping mich mal im ICQ (160 045 597) an.
gruß Michael
Zitat: Alles was ich mit
am 03.12.2007 - 10:46 Uhr
Alles was ich mit hook_form() definiere, wird NIE auf der Nodeansicht angezeigt. Dazu setzt man hook_nodeapi() ein. Oder?
Natuerlich haengt hook_nodeapi() zwischen hook_form() und der Nodeansicht. Ich hatte mich etwas knapp ausgedrueckt.
Bei den beiden weiteren Moeglichkeiten ist die eine (1.) hook_forms() und die andere (2.) ist, eine Funktion erstellen mit dem gleichen Namen wie das Foermelement.
Hier kurz die beiden Moeglichkeiten
2.
<?php
function foobar() {
$form['foobar'] = array(
'#type' => 'select',
'#id' => 'blabla',
...
...
);
}
?>
Das Formelement kann ohne Weiteres mit drupal_get_form() verwendet werden.
Um dem Formelement Parameter koennen ueber den Funktionsaufruf keine Funktionsargumente uebergeben werden.
1.
<?php
function mymodule_forms() {
$forms['mymodule_foobar_form'] = array(
'callback' => 'mymodule_form_builder',
'callback arguments' => array('blubber'),
);
$forms['mymodule_second_form'] = array(
'callback' => 'mymodule_form_builder',
'callback arguments' => array('bubble'),
);
return $forms;
}
/* Kann mit Funktionsargumenten erweitert werden welche ueber
* function mymodule_forms() an function mymodule_form_builder()
* weitergereicht werden um dort dynamisch Aenderungen der Formelemente
* durchzufuehren
*/
function mymodule_first_page() {
return drupal_get_form('mymodule_foobar_form');
}
function mymodule_other_page() {
return drupal_get_form('mymodule_barfoo_form');
}
function mymodule_form_builder($param) {
$form = array()
// Formelemente erstellen
if ($param == 'blubber') {
// Formfelder hinzufuegen oder aendern ...
}
if ($param == 'bubble') {
//
}
// This is used the way $callback was in 4.7.x Forms API: it is used as the prefix for
// _submit() and _validate() functions to process the form.
$form['#base'] = 'mymodule_form';
return $form;
}
?>
Die Formelemente kann man zur Ausgabe in hook_view() durch mymodule_first_page() usw. ansprechen. Um dabei Funktionsargumente uebergeben zu koennen muss der obige Code noch angepasst werden.
--------------------------------------
Ich muss erst mal mein ICQ reaktivieren. Irgendwo hab ich auch 'nen Account.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Gut, dann werde ich mich am
am 04.12.2007 - 08:29 Uhr
Gut, dann werde ich mich am Wochenende mal hinsetzen und eine kleine Einführung in hook_nodeapi() aus Sicht der Formulargenerierung schreiben.