Probleme mit form_validate und form_set_value
Eingetragen von rapsli (1500)
am 30.11.2007 - 22:14 Uhr in
am 30.11.2007 - 22:14 Uhr in
Zuerst den Code und dann das Problem:
<?php
function simple_buy_role_form($node){
if (variable_get('preview_flag','false') != 'false') {
$form['simple_buy_role']['submit'] = array(
'#type' => 'submit',
'#value' => t('Send'),
);
}else{
$form['simple_buy_role']['preview'] = array(
'#type' => 'button',
'#value' => t('preview'),
);
}
$form['simple_buy_role']['preview_flag'] = array(
'#type' => 'hidden',
'#value' => variable_get('preview_flag','false'),
);
return $form;
}
?>
Der submit knopf wird also nur angezeigt, wenn das flag auf true gesetzt ist. Damit möchte ich erreichen, dass das Formular zuerst einmal als preview angeschaut werden muss. Die validate welche beim absenden von preview aufgerufen wird, sieht wie folgt aus:
<?php
function simple_buy_role_form_validate($form_id, $form_values) {
form_set_error('','Please validate your data and make sure they are correct.');
form_set_value($form['simple_buy_role']['preview_flag'],'true');
}
?>
Ich komme also wieder zurück zum Formular, der Wert wird jedohc nicht auf true geändert! Irgend welche Ideen?
PS: scheint, als wäre das Problem nicht neu...
- Anmelden oder Registrieren um Kommentare zu schreiben
Ist egal ob so if
am 30.11.2007 - 22:36 Uhr
Ist egal ob so
if (variable_get('preview_flag','false') != 'false')
oder
if (variable_get('preview_flag','false') != FALSE)
so?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
jo. Im HTML wird es eben gar
am 30.11.2007 - 23:51 Uhr
jo. Im HTML wird es eben gar nicht geändert. aber ich werde es nochmals prüfen.
___________________________
it's easier than you think
Raphael Schär
http://www.schaerwebdesign.ch
Facebook Gruppe Schweiz-CH: http://www.facebook.com/group.php?gid=5683015414
______________________________
Yet Another Drupal Site (YADS)
http://www.rapsli.ch
******************************
Zwei prinzipielle
am 02.12.2007 - 21:44 Uhr
Hallo rapsli
Zwei prinzipielle Sachen:
1.) Du müsstest der _validate Funktion noch $form als dritten Parameter übergeben. Denn wie soll er denn sonst $form['simple_buy_role']['preview_flag'] ansprechen?
2.) Wenn du form_set_value() aufrufst, wieso willst du den Wert dann mit variable_get abrufen? form_set_value bearbeitet direkt die $form[]-Parameter
Würde dir aber alles nichts bringen, da du einen generellen Denkfehler in dem Modul hast. :-)
Die _validate-Funktion wird nämlich aufgerufen, NACHDEM die Struktur des Formulars bereits erstellt wurde. form_set_value kann also schlichtweg keinen Einfluss mehr auf die Werte des Formulars nehmen (mal davon abgesehen, dass form_set_value sowieso einen ganz anderen Sinn hat). Außerdem ist es wichtig zu wissen, dass in Drupal nach dem Aufruf der _validate-Funktion das Formular NICHT neu gerendert wird, sondern nur entschieden wird, ob die Daten verarbeitet werden sollen (nämlich wenn die Validierung ok ist, aufruf der _submit Funktion), oder ob das Formular noch einmal angezeigt werden muss (z.B. mit einer Fehlermeldung durch form_set_error()). In beiden Fällen gilt: Das Formular wurde schon längst aufgebaut und man kann keinen Einfluss mehr auf die Werte nehmen. Ich habe dir zwei, leider etwas unübersichtliche, Folien online gestellt, die den Formularprozess etwas verdeutlichen. [1]
Da Drupal allerdings das beste CMS der Welt ist, gibt es doch noch einen Weg, auch nach der _validate-Funktion in die Formularstruktur einzugreifen. Und zwar in dem man eine pre_render Funktion deklariert
<?php
$form['#pre_render'] = array ('render_after_validating');
?>
Diese Funktion wird NACH der _validate und NACH der theme_ Funktion ausgeführt. Und zwar als letzter Schrift, bevor das Formular endgültig ausgegeben wird durch drupal_render_form().
Hier könntest du also festlegen, dass dein Submit-Button anders benannt wird, und das hidden-Feld beschrieben wird.
<?php
function render_after_validating($form_id, &$form) {
//Wir ändern den Text des Submit-Knopfes von "Vorschau" auf "Absenden"
$form['mytestform']['submit']['#value'] = t('Absenden');
//Wir speichern im hidden-Field, dass wir die Validierung einmal durchlaufen haben
$form['mytestform']['was_validated']['#value'] = 'true';
}
return $form;
}
?>
Bleibt noch das Problem, dass die Änderungen nur durchgeführt werden dürfen, wenn der Submit-Button das erste Mal gedrückt wurde. Um das zu bestimmen fragst du erst den Wert des hidden-Feldes ab, und setzt dir dann am besten ein eigenes Flag als Variable.
<?php
function testmodule_testform_validate($form_id, $form_values) {
//Wenn das hidden-Field auf true steht, haben wir die Validierung bereits einmal durchlaufen
//und können den Text in der Datenbank speichern.
if ($form_values['was_validated'] == 'true') {
return '';
}
//Die Validierungsfunktion wird das erste Mal aufgerufen
else {
//Wir speichern in einer Variable, dass die Validierungsfunktion aufgerufen wurde
variable_set('was_validated', 'true');
//Und geben dem Benutzer eine Meldung aus, dass er seine Daten noch einmal überprüfen soll
form_set_error('','Hallo Benutzer. Bitte überprüfe deine Daten noch einmal.');
}
}
?>
Steht das hidden-Feld auf false, gibst du deine Fehlermeldung aus. Danach wird die pre_render-Funktion aufgerufen, der Submit-Button geändert und das hidden-Feld auf true gesetzt. Drückt der Benutzer nun erneut den Submit-Button, wird erst die _validate und dann die _submit-Funktion ausgeführt.
Et Voilà - Es funktioniert :-)
Der Vollständigkeit halber der komplette Code:
<?php
function testmodule_perm() {
return array ('enter testmodule');
}
//Wir legen eine eigene Seite für unser Formular an.
function testmodule_menu($may_cache) {
$items = array();
if ($may_cache) {
$items[] = array(
'path' => 'testmodule',
'title' => t('My testsite'),
'callback' => 'testmodule_page',
'access' => true
);
}
return $items;
}
//Die Ausgabe der Seite besteht ausschließlich aus dem Formular
function testmodule_page() {
$output = drupal_get_form('testmodule_testform'); //Initialisierung des Formulars
return $output;
}
//Wir bauen uns ein Formular
function testmodule_testform(){
$form['mytestform'] = array (
'#type' => 'fieldset',
'#title' => t('Geben Sie eine wichtige Nachricht ein'),
'#description' => 'Wir wollen erreichen, dass man vor dem Absenden eines Beitrages, den Submit-Knopf zwei Mal betätigen muss',
);
$form['mytestform']['text'] = array(
'#type' => 'textfield',
'#default_value' => '',
);
//Hier speichern wir, ob die Validierungsfunktion bereits einmal aufgerufen wurde
$form['mytestform']['was_validated'] = array(
'#type' => 'hidden',
'#default_value' => 'false',
);
$form['mytestform']['submit'] = array(
'#type' => 'submit',
'#value' => t('Vorschau'),
);
$form['#after_build'] = array (); //Funktion nach form_builder()
$form['#pre_render'] = array ('render_after_validating'); //Funktion nach #theme, #validation Funktion
return $form;
}
function testmodule_testform_validate($form_id, $form_values) {
//Wenn das hidden-Field auf true steht, haben wir die Validierung bereits einmal durchlaufen
//und können den Text in der Datenbank speichern.
if ($form_values['was_validated'] == 'true') {
return '';
}
//Die Validierungsfunktion wird das erste Mal aufgerufen
else {
//Wir speichern in einer Variable, dass die Validierungsfunktion aufgerufen wurde
variable_set('was_validated', 'true');
//Und geben dem Benutzer eine Meldung aus, dass er seine Daten noch einmal überprüfen soll
form_set_error('','Hallo Benutzer. Bitte überprüfe deine Daten noch einmal.');
}
}
function render_after_validating($form_id, &$form) {
//Wenn die Validierungsfunktion aufgerufen wurde, ändern wir das Formular
if (variable_get('was_validated', 'false') == 'true') {
//Wir ändern den Text des Submit-Knopfes von "Vorschau" auf "Absenden"
$form['mytestform']['submit']['#value'] = t('Absenden');
//Wir speichern im hidden-Field, dass wir die Validierung einmal durchlaufen haben
$form['mytestform']['was_validated']['#value'] = 'true';
variable_del('was_validated');
}
return $form;
}
function testmodule_testform_submit($form_id, $form_values) {
drupal_set_message("Danke, dass Sie sich die Mühe gemacht haben, zwei Mal den Knopf zu drücken!");
}
?>
Viel Spaß noch :-)
[gelöst] Probleme mit form_validate und form_set_value
am 03.12.2007 - 07:03 Uhr
Thanks. You're my man. Werde ich heute gleich mal in die Praxis umsetzen. Falls nicht klappt, werde ich mich nochmals melde, aber ich habe vollstes Vertrauen in deine Lösung.
___________________________
it's easier than you think
Raphael Schär
http://www.schaerwebdesign.ch
Facebook Gruppe Schweiz-CH: http://www.facebook.com/group.php?gid=5683015414
______________________________
Yet Another Drupal Site (YADS)
http://www.rapsli.ch
******************************
Links
am 03.12.2007 - 07:24 Uhr
Moin.
Hatte noch die Links vergessen:
[1] Folien: http://rapidshare.de/files/37962438/drupal_menusystem.pdf.html
[2] Modul: http://rapidshare.de/files/37962442/testmodule_twicesubmit.rar.html
Danke. hat
am 03.12.2007 - 11:49 Uhr
Danke. hat geklappt.
___________________________
it's easier than you think
Raphael Schär
http://www.schaerwebdesign.ch
Facebook Gruppe Schweiz-CH: http://www.facebook.com/group.php?gid=5683015414
______________________________
Yet Another Drupal Site (YADS)
http://www.rapsli.ch
******************************