Formular ohne hook_form_alter modifizieren [gelöst]
am 27.06.2010 - 20:16 Uhr in
Blödes Problem, bei dem ich nicht weiter komme: in einem Modul habe ich ein kleines Formular definiert, sowie einen passenden Submit-Handler dazu. Etwa so:
function mymodule_form(&$form_state) {
$form = array();
$form['text'] = array(
'#title' => t('Help text'),
'#type' => 'textarea',
);
$form['submit'] = array(
'#value' => t('Save'),
'#type' => 'submit',
'#weight' => 99,
);
return $form;
}
function mymodule_form_submit(&$form, &$form_state) {
// Mach was mit dem Formular...
}
Jetzt möchte ich dieses Formular in einem Template (xyz.tpl.php) verwenden. Die Standardmethode dafür ist folgende:
<?php print drupal_get_form('mymodule_form'); ?>
Das funktioniert auch, das Formular wird angezeigt, ich kann etwas eingeben, das Formular abschicken, und der Submit-Handler wird aufgerufen und macht den Rest. Aber jetzt zum eigentlichen Problem: ich möchte das Formular vor der Ausgabe verändern, z.B. vorbelegen. drupal_get_form liefert aber das fertige HTML. Normalerweise würde man hook_form_alter verwenden, um Änderungen vorzunehmen. Diese Methode kann ich hier nicht benutzen, da die benötigten Variablen nur in dem betroffenen Template zur Verfügung stehen. Also habe ich im Template anstelle von drupal_get_form folgenden Ansatz versucht:
<?php
$form_state = array();
$form = drupal_retrieve_form('mymodule_form',$form_state);
drupal_prepare_form ('mymodule_form',$form,$form_state);
$form['text']['#value'] = 'Irgendein Text';
drupal_process_form ('mymodule_form',$form,$form_state);
print drupal_render_form ('mymodule_form',$form);
?>
Das Formular wird auch angezeigt, mit dem geänderten Feldinhalt. Aber der Submit-Handler wird nicht mehr aufgerufen, obwohl er im Formular enthalten ist. Ich kann das Formular also nicht weiter verarbeiten.
Die Funktionen drupal_retrieve_form, drupal_prepare_form und drupal_process_form sind leider nicht sonderlich gut dokumentiert, bzw. einfach selten verwendet. Ich weiss nicht ob das der richtige Weg ist. Auf jeden Fall funktioniert es so nicht.
Gibt es vielleicht einen besseren Weg? Oder mache ich was falsch?
Danke und Gruß,
Boris
- Anmelden oder Registrieren um Kommentare zu schreiben
Anderer Ansatz
am 28.06.2010 - 11:37 Uhr
Ich wähle jeweils einen anderen Ansatz. Default Werte kann man direkt im Formular setzten, mit der Funktion variable_get sogar dynamische. Das Aussehen passe ich jeweils so an, dass ich mit prefix und suffix beliebige
http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....
Jaaah...
am 28.06.2010 - 12:01 Uhr
Danke, das ist gar nicht so dumm. Also im Template eine Variable setzen, die im Formular angezogen wird, und dann das Formular wie im ersten Ansatz behandeln:
function mymodule_form(&$form_state) {
$form = array();
$form['text'] = array(
'#title' => t('Help text'),
'#value' => variable_get ('myvar','');
'#type' => 'textarea',
);
$form['submit'] = array(
'#value' => t('Save'),
'#type' => 'submit',
'#weight' => 99,
);
return $form;
}
Und im Template:
<?php variable_set ('myvar','Irgendwas steht hier'); ?>
<?php print drupal_get_form('mymodule_form'); ?>
Wenn das aber kein statischer Defaultwert ist, überschreiben sich die User den Inhalt gegenseitig, oder man muss lustige Arrays in der Variablentabelle speichern und diese ziemlich aufblähen. Aber ich denke mal drüber nach.
Ne andere Möglichkeit wäre, auf hook_form zu verzichten und das Formular komplett im Template aufzubauen. Hab ich so aber noch nicht gemacht, muss mich erst einlesen.
Hab mal grad nen bissl
am 28.06.2010 - 12:18 Uhr
Hab mal grad nen bissl rumprobiert, teste mal folgendes:
<?php
function mymodule_form(&$form_state, $values) {
$form = array();
$form['text'] = array(
'#title' => t('Help text'),
'#type' => 'textarea',
'#default_value' => $values['text'],
);
$form['submit'] = array(
'#value' => t('Save'),
'#type' => 'submit',
'#weight' => 99,
);
return $form;
}
?>
und im Template
<?php
$values = array(
'text' => 'test',
);
echo drupal_get_form('mymodule_form', $values);
?>
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.
Super!
am 28.06.2010 - 13:16 Uhr
Das klappt einwandfrei, vielen Dank! Manche Sachen in der API Dokumentation kann man drei Mal lesen, und bemerkt sie immer noch nicht:
5 – 7 drupal_get_form($form_id)
... Any additional arguments are passed on to the functions called by drupal_get_form(), including the unique form constructor function. For example, the node_edit form requires that a node object be passed in here when it is called.
Auf die Idee, hier einfach mal nen zweiten Parameter zu verwenden, wäre ich so schnell nicht gekommen!
Hehe, ja genau das hab ich
am 28.06.2010 - 13:23 Uhr
Hehe, ja genau das hab ich auch gelesen und einfach nen 2. Parameter eingebunden. Die meiste Zeit ging beim Anlegen des Moduls drauf ... ;)
sense-design | online solutions | Do not hack core!
Drupalcenter Verhaltensregeln | Threads bitte auf [gelöst] stellen.