Zwei submit-Buttons - submit-Handler mit Parametern
Eingetragen von axelf (110)
am 21.02.2010 - 13:40 Uhr in
am 21.02.2010 - 13:40 Uhr in
Hi,
in einem Formular ibt es 2 Submitbuttons. Wenn der Button 'Dokument erstellen' geklickt wird, dann wird die angegeben Funktion ausgeführt. Wie kann ich dieser Funktion ein Array mit Daten als Parameter übergeben?
In der Doku steht '#submit' => array('funktion' => array('arg1'...)), aber da bekomme ich immer eine Fehlermeldung, das als erstes Argument ein String erwartet wird und ein Array angegeben wurde.
<?php
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Daten ändern',
);
$form['create_pdf'] = array(
'#type' => 'submit',
'#value' => 'Dokument erstellen',
'#submit' => array('_create_PDF')
);
?>
- Anmelden oder Registrieren um Kommentare zu schreiben
Hi wenn ich dich richtig
am 27.02.2010 - 15:41 Uhr
Hi
wenn ich dich richtig verstehe, dann willst du etwas im Submit des Formulars machen.
Schau bitte nochmal hier nach:
http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6
Validating Forms und Submitting Forms
Mit dem Ansatz denke ich kannst du erreichen, was du willst
Hi, also ich habe gelesen,
am 27.02.2010 - 16:42 Uhr
Hi,
also ich habe gelesen, der einzige Weg um zu unterscheiden, welcher Button gedrückt wurde ist einen eigenen Submit-Handler zu benutzen ('#submit' => ....), da im form_state keine Unterscheidung möglich ist. In meiner angegeben Funktion wird auf eine andere Seite weitergeleitet und vorher wollte ich noch die Daten in eine Sessionvariable schreiben.
Habe es jetzt so gemacht, das ich mir die Daten in der _form-Funktion in die Sessionvariable schreibe und dann weiterverwende.
Zumindest kann ich in der _submit-Funktion nicht unterscheiden welcher Button gedrückt wurde.
Hmm okay, muss ich mal
am 27.02.2010 - 17:49 Uhr
Hmm okay, muss ich mal testen, soweit niemand anderes das grad weiß. Aber über die Session klingt schon ziemlich krank ;)
Schau mal hier
am 27.02.2010 - 17:56 Uhr
Schau mal hier rein:
http://api.drupal.org/api/function/system_settings_form/6
http://api.drupal.org/api/function/system_settings_form_submit/6
Da wird auch nur
<?php
if ($op == t('Reset to defaults')) {
?>
Geprüft und dann das entsprechende ausgeführt.
Kars-T schrieb Schau mal hier
am 27.02.2010 - 19:02 Uhr
Schau mal hier rein:
http://api.drupal.org/api/function/system_settings_form/6
http://api.drupal.org/api/function/system_settings_form_submit/6
Da wird auch nur
<?php
if ($op == t('Reset to defaults')) {
?>
Geprüft und dann das entsprechende ausgeführt.
Das hatte ich auch gefunden, aber ist nich die empfohlene Methode, sondern über den eigenen Submit-Handler. Ich find nur grad nicht wo ich das gelesen hatte. Die Lösung mit der Sessionvariable habe ich gewählt, weil ich ja nach der Weiterleitung die Daten zur Verfügung stehen haben muss. Gibts denn ne andere und nicht so "kranke" Lösung? :-)
Was zum Teufel sind fuer Dich Submit Handler mit Parametern?
am 27.02.2010 - 21:32 Uhr
Ich kapier nicht warum Du nicht einen extra Submit Callback verwendest.
Allerdings ist in diesem Zusammenhang dies hier falsch:
<?php
'#submit' => array('_create_PDF')
?>
Ein Submit Callback ist eine Funktion. Also:
<?php
'#submit' => '_create_PDF';
?>
Du kannst aber auch am normalen $form Submit einen zusaetzlichen Submit anhaengen. Allerdings solltest Du dann Deinem Button einen Namen geben und in Deinem Submit Callback den geklickten Button pruefen.
<?php
$form['create_pdf'] = array(
'#type' => 'submit',
'#name' => 'create_document',
'#value' => t('Create document'),
);
// Allgemeinen Submit erweitern.
$form['#submit'][] = 'create_document_pdf';
// Der Submit Callback.
function create_document_pdf($form, &$form_state) {
if ($form_state['clicked_button']['#name'] == 'create_document') {
// Hier das was der Callback verarbeiten soll.
}
}
?>
Ob Du die eine oder andere Variante verwendest haengt unter Umstaenden davon ab ob Du eine Reihenfolge benoetigst in der die Submit Callbacks abgearbeitet werden.
Submit Callbacks am Button werden vor den allgemeinen Submit Callbacks abgearbeitet.
Was zum Teufel sind fuer Dich Submit Handler mit Parametern?
Reichen die gesendeten Daten nicht aus die Du im Callback entgegennimmst?
Danke für die ausführliche
am 28.02.2010 - 12:51 Uhr
Danke für die ausführliche Antwort. Das hat meine Frage beantwortet und das Verständnis für das Formularhandling in Drupal wieder verbessert :-)
Ich meinte genau sowas, was du im letzten Codebeispiel geschrieben hast.
PS: Bis vor 4 Jahren wären wir ja fast Nachbarn gewesen :-)
Zwei Submits
am 08.03.2010 - 15:58 Uhr
Die zuerst genannt Variante mit einem Callback als Array funktioniert doch.
Folgendes Beispiel habe ich gerade ausprobiert:
<?php
//Normaler Submit Button
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Form submit'),
);
//Zweiter Submit Button
$form['senden'] = array(
'#type' => 'submit',
'#value' => t('Noch ein Form submit'),
'#submit' => array('example_form'),
);
?>
Und hier die beiden Funktionen:
<?php
function example_form($form, &$form_state) {
$name = $form_state['values']['name'];
drupal_set_message(t('Herzlichen Dank, %name', array('%name' => $name)));
}
function form_example_form_submit($form, &$form_state) {
drupal_set_message('Vielen Dank');
}
?>
Funktioniert einwandfrei und ist auch bequemer in der Verwendung, da man nicht umständlich einen String vergleichen muss.
Nachzulesen im Pro Dvelopment Buch auf Seite 265 der englischen Version:
For example, if #submit is set to array('my_special_form_submit'), the function my_special_form_submit() will be used instead of the form's definded submit handler(s).
Hi, ja ich hatte es zu Anfang
am 08.03.2010 - 19:32 Uhr
Hi,
ja ich hatte es zu Anfang auch so gelöst, nur konnte ich in der Funktion (in dem oben genannten Bsp: example_form) irgendwie nicht auf &$form_state zugreifen. Ich habe es jetzt erstmal alles zum laufen gebracht und werde mir das aber nochmal ansehen für zukünftige Sachen.