Ergebnis 1 bis 13 von 13

Thema: SQL-Abfrage im mehrseitigen Formular inkl. Füllung der Value-Feldern möglich?

  1. #1
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Frage SQL-Abfrage im mehrseitigen Formular inkl. Füllung der Value-Feldern möglich?

    Hallo!

    Folgende Situation:
    Es gibt ein mehrseitiges Formular. Auf Seite 1 wird ein individueller Code eingegeben. Nachdem der Code eingegeben wurde, soll eine SQL-Abfrage auf eine MySql-DB ausgeführt werden. Dort werden Adressdaten selektiert und in die Formularfelder auf Seite 2 vorausgefüllt. Nun sollen die Daten im vorausgefüllten Formular aktualisiert werden können.

    Ablauf also:
    Eingabe des individuellen Codes > Seite 1 abschicken > Ausführung des SQL-Query (Select bla WHERE Code = $gutscheincode) > Speicherung der Ergebnisse des SQL-Query in $_POST > Aufbau der Formularseite 2 mit z.B. Standard-Wert = $_POST['Vorname'] > Möglichkeit der Aktualisierung der Felder > Update der Datenbank mit den neuen Feldinhalten (Macht EFG ja automatisch).

    Das Formular ist soweit aufgebaut, ich habe bisher allerdings noch keine Möglichkeit gefunden die SQL-Abfrage zwischen Seite1 und Seite2 einzubauen.

    Wie kann ich das umsetzen?

    Vielen Dank für die Hilfe

  2. #2
    Contao-Nutzer Avatar von simplex3
    Registriert seit
    22.06.2009.
    Ort
    Oldenburg (Oldb.)
    Beiträge
    73

    Standard

    Moin.
    Schuss aus der Hüfte:
    Kannst du nicht eine php-Datei mit den entspr. Abfragen schreiben, in der die Ergebnisse dann in $_POST gepackt werden. Die dann mittels insert-tag auf der Seite mit Formular 2 einbinden?

    Bis denne..

  3. #3
    Contao-Fan Avatar von tom
    Registriert seit
    16.06.2009.
    Ort
    Ludwigsburg
    Beiträge
    385

    Standard

    Hallo zusammen,

    mein Vorschlag wäre, den 'validateFormField-Hook' zu verwenden.

    Also zunächst, entweder in der system/config/dcaconfig.php oder einer "Modul"-config.php eine eigene callback-Methode registrieren, z.B.:
    Code:
    $GLOBALS['TL_HOOKS']['validateFormField'][] = array('MyValidators', 'onvalidateFormField');
    In der MyValidators dann in etwa folgende Methode:

    Code:
    	public function onvalidateFormField($objWidget, $formId)
    	{
    
    		// hier die ID des Formularelements/Widgets anpassen
    		if ($objWidget->id == 168)
    		{
    
    			if ($objWidget->hasErrors())
    			{
    				return $objWidget;
    			}
    
    			
    			// gewuenschte vorzubelegende Daten abfragen
    			$this->Database->prepare("SELECT bla FROM tl_bla_table  WHERE Code = ? )
    				->limit(1)
    				->execute( $this->Input->post($objWidget->name) )
    			
    			... etc. ...
    				
    			// die Daten zur Vorbefüllung der zweiten Seite in der Session speichern
    
    			$_SESSION['FORM_DATA']['feldname_abc'] = 'gewünschter Wert';
    			$_SESSION['FORM_DATA']['feldname_xyz'] = 'Wert für xyz';
    			... 
    			
    			// damit der EFG die zweite Formularseite befüllt (als bereits "bearbeitet" betrachtet)
    			$_SESSION['EFP'][$formId]['completed']['page_2'] = true;
    
    		}
    
    		return $objWidget;
    	}
    Hoffe, das ist soweit verständlich, sonst nachhaken!

    Schöne Grüße
    Thomas

  4. #4
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Hallo,
    Danke für die Antworten
    tom, ich würde gerne Deinen Tips ausprobieren.

    Allerdings stellt sich mir im Moment noch die Frage, wo ich denn die MyValidators.php speichern müsste, wenn ich den Callback so wie von Dir geschrieben in die dcaconfig.php packe.

    Wird die Methode denn dann immer automatisch mit ausgeführt? Oder muss ich EFG oder Contao noch mitteilen, dass es eine neue Methode gibt, die nach dem Formularumbruch ausgeführt werden soll?

    Vielen Dank!

    Edit:
    Fatal error: Could not load class MyValidators in C:\xampp\htdocs\contao\system\functions.php on line 76, nachdem ich den Callback eingebaut habe.
    Muss ich nun in der functions.php auch noch auf die zu erstellende MyValidators.php hinweisen?
    Geändert von Schwarz (12.11.2010 um 10:33 Uhr)

  5. #5
    Contao-Fan Avatar von tom
    Registriert seit
    16.06.2009.
    Ort
    Ludwigsburg
    Beiträge
    385

    Standard

    Hallo Schwarz,

    am Besten packst Du alles in ein eigenes Modul(-Verzeichnis), in beigefügtem ZIP habe ich es mal 'z_myform' genannt.

    Hoffe, das hilft Dir weiter.

    Schöne Grüße
    Thomas
    Angehängte Dateien Angehängte Dateien

  6. #6
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Hallo tom,

    vielen lieben Dank für Deine Hilfe! Funktioniert wunderbar

  7. #7
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Kann man denn auch spezielle "Feedback"-Seiten einbauen? In meinem Fall wäre das konkret:
    • 1) Wenn die SQL-Abfrage in der WHERE-Bedingung keinen Code in der DB findet, dann soll eine Meldung wie z.B. "Ihr Code wurde nicht gefunden!" erscheinen. Die weitere Formularabarbeitung wird natürlich gestoppt.
    • 2) Wenn die Bestellung mit dem Code schon einmal durchgeführt wurde, dann soll eine entsprechende Meldung erscheinen, wie z.B. "Mit diesem Code wurde schon einmal etwas bestellt!". Auch hier wird die weitere Formularabarbeitung gestoppt.
    • 3) Nach korrekter Ausfüllung des Formulars soll eine Feedbackseite erscheinen mit dem Inhalt "Vielen Dank für die Bestellung!" o.ä.


    Kann EFG das mit der Standardkonfiguration, oder muss auch hier wieder ein Modul o.ä. geschrieben werden?

    Vielen Dank für die Hilfe


    Edit:
    Punkt 3 lässt sich wohl via Weiterleitungsseite umsetzen ...
    Geändert von Schwarz (22.11.2010 um 11:25 Uhr)

  8. #8
    Contao-Fan Avatar von tom
    Registriert seit
    16.06.2009.
    Ort
    Ludwigsburg
    Beiträge
    385

    Standard

    Hallo Schwarz,

    Punkt 1 und 2 wären innerhalb der 'onvalidateFormField' umzusetzen:

    PHP-Code:
    ...

                if (
    $objWidget->hasErrors())
                {
                    return 
    $objWidget;
                }

                
                
    // Code pruefen, gewuenschte vorzubelegende Daten abfragen
                
    $objResult $this->Database->prepare("SELECT bla FROM tl_bla_table  WHERE Code = ?")
                    ->
    limit(1)
                    ->
    execute$this->Input->post($objWidget->name) )
                
                
    // ... wurde der code bereits verwendet?
                
    if ( ... UEBERPRUFUNG HIER ... )
                {
                    
    $objWidget->addError('Mit diesem Code wurde bereits bestellt');
                    return 
    $objWidget;
                }
                
    // ... der Code existiert nicht?
                
    elseif ( ... UEBERPRUEFUNG HIER ...)
                {
                    
    $objWidget->addError('Ihr Code wurde nicht gefunden!');
                    return 
    $objWidget;
                }


    ... 

    Punkt 3 wäre einfach die im Formulargenerator als "Weiterleitungsseite" gewählte Seite. Auf dieser Seite können -falls gewünscht- auch per Insert-Tags {{form::FELDNAME}} Formulardaten ausgegeben werden, z.B.:
    Vielen Dank für Ihre Bestellung!
    Ihr Buchungscode: {{form::FELNDAME_DES_BUCHUNGSCODE_FELDES}}

    Schöne Grüße
    Thomas

  9. #9
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Vielen Dank Thomas, funktioniert alles soweit!

    Nun habe ich allerdings festgestellt, dass die MyValidators.php mehrmals durchläuft. Wenn ich am Ende ein "echo 'test';" mache, dann erscheint die Ausgabe mehrmals. In meinem Fall 4-6x. Woran kann das liegen?

    Und noch etwas: Kann der EFG auch direkt ein Update auf einen Datensatz machen? Im Moment habe ich die eine Quelldatenbank und eine andere Zieldatenbank, in die die Bestellungen mit den aktuellen Adressen geschrieben werden. Diese zwei Tabellen würde ich dann vergleichen.
    Aber kann man auch direkt ein Update auf die Quell-Datenbank machen?


    Danke

  10. #10
    Contao-Fan Avatar von tom
    Registriert seit
    16.06.2009.
    Ort
    Ludwigsburg
    Beiträge
    385

    Standard

    Hallo Schwarz,

    Nun habe ich allerdings festgestellt, dass die MyValidators.php mehrmals durchläuft. Wenn ich am Ende ein "echo 'test';" mache, dann erscheint die Ausgabe mehrmals. In meinem Fall 4-6x. Woran kann das liegen?
    Das ist ganz normal so, die Methode onvalidateFormField in MyValidators wird für jedes Formularfeld/Widget des Formulars aufgerufen.

    Bei der 'Registrierung'
    PHP-Code:
    $GLOBALS['TL_HOOKS']['validateFormField'][] = array('MyValidators''onvalidateFormField'); 
    wird ja nicht angegeben, für welches Formularfeld die Überprüfung/Validierung ausgeführt werden soll. Diese Einschränkung auf ein bestimmtes Formularfeld (sofern wie in diesem Falle nur für ein bestimmtes erforderlich....) wird daher innerhalb der Methode vorgenommen:
    PHP-Code:
            // hier die ID des Formularelements/Widgets anpassen
            
    if ($objWidget->id == 168)
            {
                ...
            } 
    Kann der EFG auch direkt ein Update auf einen Datensatz machen? Im Moment habe ich die eine Quelldatenbank und eine andere Zieldatenbank, in die die Bestellungen mit den aktuellen Adressen geschrieben werden. Diese zwei Tabellen würde ich dann vergleichen.
    Aber kann man auch direkt ein Update auf die Quell-Datenbank machen?
    Der EFG kann (im Falle der Frontendbearbeitung) ein Update auf "Formulardaten" machen. Aber nicht automatisch auf andere Tabellen/Datenbanken.

    Wenn Du etwas deutlicher erklären kannst, was Du in Quelle und Ziel vergleichen oder Updaten möchtest, kann Dir sicherlich auch hier geholfen werden.

    Interessant wären für Dein Update/Vergleich-Problem vermutlich die beiden Hooks
    'processFormData' der Contao-Core-Formularklasse (system/modules/frontend/Form.php)
    und ein entsprechender im EFG 'processEfgFormData' (system/modules/efg/Efp.php)

    Schöne Grüße
    Thomas
    Geändert von tom (22.11.2010 um 20:37 Uhr)

  11. #11
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Lächelndes Gesicht

    Vielen Dank für deine TOP Hilfe
    Das Formular läuft nun soweit perfekt

  12. #12
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Hallo,

    ich benötige diesen Code nun mal wieder, habe aber Probleme den Code anzupassen ...

    Es wird per Mail ein Link mit einer individuellen ID versendet, darüber können sich Kunden zu einem Event anmelden. Das Formular soll mit Daten (falls diese vorhanden sind) vorausgefüllt werden.
    Quasi das gleiche wie oben, nur dass es jetzt kein mehrseitiges Formular mit einer Eingabe gibt, sondern eine ID im Link.

    Mein Code bisher:
    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
    class 
    MyValidators extends Backend {
      public function 
    onvalidateFormField($objWidget$formId) {
        if (
    $objWidget->hasErrors()) {
          return 
    $objWidget;
        }
        if (
    $objWidget->id == 201) {
          
    // gewuenschte vorzubelegende Daten abfragen
          
    $sql sprintf(
            
    "SELECT a1.* 
            FROM Kunden a1
            WHERE a1.ID = '%s'"

            
    mysql_real_escape_string($_GET['id'])); 
          
    $res $this->Database->prepare($sql)
                      ->
    limit(1)
                      ->
    execute($this->Input->post($objWidget->name));
          
    $arrayPageData $res->fetchAssoc();           
          if (!empty(
    $arrayPageData)) {
            foreach(
    $arrayPageData as $fieldName => $fieldValue) {
              
    $_SESSION['FORM_DATA'][$fieldName] = $fieldValue;
            }
          } else {
            
    $objWidget->addError('Sie haben eine falsche ID eingegeben!');
          }
    //      if (!empty($_SESSION['FORM_DATA']['gutscheincodeChecked'])) {
    //        $objWidget->addError('Sie haben eine falsche ID eingegeben!');
    //      }
          // damit der EFG die zweite Formularseite befüllt (als bereits "bearbeitet" betrachtet)
          
    $_SESSION['EFP'][$formId]['completed']['page_1'] = true;
        }
        return 
    $objWidget;
      }
    }
    ?>
    Ich bekomme damit allerdings keine Ausgabe.
    Kann mir jmd. helfen?

    Danke.

  13. #13
    Contao-Nutzer
    Registriert seit
    11.11.2010.
    Beiträge
    80

    Standard

    Kann mir hier noch jmd. helfen?
    Danke

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Modul Auflistung - Abfrage über mehrere Tabellen möglich?
    Von zorin1st im Forum Sonstige Erweiterungen
    Antworten: 2
    Letzter Beitrag: 08.05.2013, 13:43
  2. Daten über Formular an Datenbank-Abfrage - Error
    Von Lengen1971 im Forum Formulare
    Antworten: 1
    Letzter Beitrag: 23.02.2011, 10:41
  3. Abfrage-Formular erstellen und versenden
    Von marcelo im Forum Formulare
    Antworten: 1
    Letzter Beitrag: 27.01.2011, 10:23
  4. Antworten: 6
    Letzter Beitrag: 30.11.2010, 22:39

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •