Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

Probleme mit form_validate und form_set_value

Eingetragen von rapsli (1500)
am 30.11.2007 - 23:14 Uhr in
  • Modul-Entwicklung
  • Drupal 5.x

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...

‹ Was ist, macht call_user_func ? $form, hook_form(), form_alter() Problem ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Ist egal ob so if

Eingetragen von quiptime (4972)
am 30.11.2007 - 23: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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

jo. Im HTML wird es eben gar

Eingetragen von rapsli (1500)
am 01.12.2007 - 00: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zwei prinzipielle

Eingetragen von mhuebl (60)
am 02.12.2007 - 22: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 &uuml;berpr&uuml;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&auml;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 &uuml;berpr&uuml;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&uuml;he gemacht haben, zwei Mal den Knopf zu dr&uuml;cken!");
   
}
?>

Viel Spaß noch :-)

  • Anmelden oder Registrieren um Kommentare zu schreiben

[gelöst] Probleme mit form_validate und form_set_value

Eingetragen von rapsli (1500)
am 03.12.2007 - 08: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Links

Eingetragen von mhuebl (60)
am 03.12.2007 - 08: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke. hat

Eingetragen von rapsli (1500)
am 03.12.2007 - 12: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • erfahrung mit dem Modul script manager
  • Verständnisfrage private_files in Drupal
  • [erledigt]MP3 in Drupal 10 einbinden
  • HTML oder JS Code wird nicht ausgeführt
  • Posts von einem Inhaltstyp in einen anderen verschieben
  • Mysql Ver 8.0.41 zu MariaDB 10.11.11
  • DrupalCamp Ruhr 12. / 13. September in Essen!
  • [gelöst]Zugriff auf inhaltstyp für angemeldete Benutzer wird verweigert
  • Word DOC Export Modul/Funktion gesucht
  • W3CSS Paragraphs Views
  • Advertising Modul gesucht
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
Weiter

Neue Kommentare

  • dinmikkith schrieb JavaScript
    vor 5 Tagen 13 Stunden
  • Ex- und Import nutzen
    vor 1 Woche 19 Stunden
  • cut&paste lässt sich automatisieren
    vor 1 Woche 1 Tag
  • geht, soweit mir bekannt, nur
    vor 1 Woche 1 Tag
  • Inkompatibilität zwischen MySQL u. MariaDB sowie SQL-Basiswissen
    vor 1 Woche 1 Tag
  • JavaScript gehört in Drupal
    vor 1 Woche 2 Tagen
  • JavaScript gehört in Drupal
    vor 1 Woche 2 Tagen
  • Ich würde mich an die beiden
    vor 2 Wochen 6 Tagen
  • @dinmikkith leider
    vor 3 Wochen 9 Stunden
  • Da gibt's schon was. Ich
    vor 3 Wochen 14 Stunden

Statistik

Beiträge im Forum: 250016
Registrierte User: 20328

Neue User:

  • freundbs
  • Lorydom
  • Tommyloamb

» Alle User anzeigen

User nach Punkten sortiert:
wla9455
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3855
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 9 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association