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

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

jo. Im HTML wird es eben gar

Eingetragen von rapsli (1500)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zwei prinzipielle

Eingetragen von mhuebl (60)
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 &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 - 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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Links

Eingetragen von mhuebl (60)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke. hat

Eingetragen von rapsli (1500)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 2 Wochen 2 Tagen
  • Hey danke
    vor 2 Wochen 3 Tagen
  • Update: jetzt gibt's ein
    vor 2 Wochen 3 Tagen
  • Hallo, im Prinzip habe ich
    vor 3 Wochen 1 Tag
  • Da scheint die Terminologie
    vor 3 Wochen 1 Tag
  • Kannst doch auch alles direkt
    vor 3 Wochen 5 Tagen
  • In der entsprechenden View
    vor 3 Wochen 5 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 5 Tagen
  • gelöst
    vor 6 Wochen 2 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 6 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20453

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 32 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