[efg] Fortlaufende Nummer bzw. ID per Inserttag in Bestätigungsmail

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • chrizdee
    Contao-Nutzer
    • 24.08.2009
    • 73

    #1

    [efg] Fortlaufende Nummer bzw. ID per Inserttag in Bestätigungsmail

    Ich habe ein Anmeldeformular für eine Veranstaltung erstellt und verschicke via efg eine Bestätigungsmail an die Besucher. Die Bestätigungsmail soll gleichzeitig als Ticket gültig sein und mit einer eindeutigen Nummer (Ticket-ID) versehen werden.

    Die Anmeldungen werden per efg auch in der Datenbank gespeichert und auch hier sollte die Ticket-ID dann irgendwie ersichtlich sein.

    Hat jemand eine Idee, wie man das lösen könnte?
    Ich dachte erst ich könnte per {{form::id}} auf die ID des Datensatzes in der Datenbank zugreifen, aber das war wohl nix :-(

    Herzlichen Dank im Voraus.
  • Dr. Jo
    Contao-Nutzer
    • 11.08.2009
    • 218

    #2
    Hallo chrizdee,

    schau mal hier:


    Hilft Dir das weiter?

    Gruß

    Dr. Jo

    Kommentar

    • chrizdee
      Contao-Nutzer
      • 24.08.2009
      • 73

      #3
      Top!
      Genau danach hab ich gesucht.

      Herzlichen Dank.

      Kommentar

      • thepixture
        Contao-Fan
        • 24.06.2009
        • 536

        #4
        Ich sehe da noch ein Problem bei der Generierung der fortlaufenden Nummer bei der im oberen Link beschriebenen Vorgehensweise.

        Angenommen es sind 4 Einträge in der Datenbank. Dann würde der Neue die Nummer 5 erhalten. Wenn ich jetzt aber Eintrag 3 lösche und dann einen neuen Eintrag anlege, wird dieser wieder die Nummer 5 erhalten, oder sehe ich das falsch?
        Grüße
        thepixture

        Kommentar

        • zweivor
          Contao-Nutzer
          • 05.04.2013
          • 5

          #5
          fortlaufende ID

          Ich würde gerne das Thema noch mal aufgreifen, da es leider keine Infos dazu gibt, wie das Problem gelöst wurde.

          Zur Zeit arbeite ich an einer Seite die eine ähnliche Anforderung hat und brauche eine eindeutige ID für jeden Eintrag, die schon beim ausfüllen und absenden des Formulars übergeben (Bestätigungsmail) und abgespeichert wird.

          Kann hier jemand noch mal Hilfestellung geben?

          Kommentar

          • chrizdee
            Contao-Nutzer
            • 24.08.2009
            • 73

            #6
            Leider hab ich das Projekt von damals nicht mehr online. In Archivdateien habe ich aber folgenden Workaround gefunden.


            Hook registrieren /system/config/dcaconfig.php

            PHP-Code:
            $GLOBALS['TL_HOOKS']['processEfgFormData']['myCallback'] = array('myEfgFuncs', 'createSerialNo'); 
            

            Neue Datei /system/modules/efg/myEfgFuncs.php

            PHP-Code:
            class myEfgFuncs extends Backend
            {
            
                public function createSerialNo($arrSubmitted, $arrFiles, $intOldRecordId, $arrFormConfig)
                {
                    
                    // die Serien-Nr muss nur bei Formular 'Anmeldung 2010 DE' generiert werden
                    if ($arrFormConfig['title'] == 'Anmeldung 2010 DE') 
                    {
                        
                        // die Anzahl der vorhandenen Datensaetze dieses Formulars ermitteln
                        $objDataCount = $this->Database->prepare("SELECT count(*) as num FROM besucher_frm")
                                                ->execute();
                    
                        $numData = $objDataCount->fetchAssoc();
            
                        $varVal = (int) $numData['num'];
                        
                        // der neue Datensatz existiert noch nicht in der DB, also Anzahl erhoehen
                        $varVal += 1;
                        
                        // ggf . noch links mit nullen auffuellen (hier 5-stellig)
                        $varVal = str_pad($varVal, 5, "0", STR_PAD_LEFT);
                         
                        // den Wert im Array $arrSubmitted ueberschreiben
                        $arrSubmitted['fld_serial_no'] = 'DE'.$varVal;
                        
                        // Serial in Datenbank speichern
                        $this->Database->prepare("UPDATE besucher_frm SET fld_serial_no = '".$arrSubmitted['fld_serial_no']."' WHERE name = '".$arrSubmitted['name']."' AND firma = '".$arrSubmitted['firma']."'")->execute();
                        
                    }
            
                    return $arrSubmitted;
                    
                }
            
            } 
            

            In der Bestätigungsmail kann nun {{form::fld_serial_no}} als Inserttags verwendet werden.

            Ich glaub dieser Beitrag hat mir damals geholfen.

            Kommentar

            • zweivor
              Contao-Nutzer
              • 05.04.2013
              • 5

              #7
              ok ich guck mir das mal genauer an. Danke für die schnelle Reaktion.

              Kommentar

              • drapper
                Contao-Nutzer
                • 27.12.2012
                • 40

                #8
                Zitat von thepixture Beitrag anzeigen
                Ich sehe da noch ein Problem bei der Generierung der fortlaufenden Nummer bei der im oberen Link beschriebenen Vorgehensweise.

                Angenommen es sind 4 Einträge in der Datenbank. Dann würde der Neue die Nummer 5 erhalten. Wenn ich jetzt aber Eintrag 3 lösche und dann einen neuen Eintrag anlege, wird dieser wieder die Nummer 5 erhalten, oder sehe ich das falsch?
                tritt das Problem auf?
                Wenn ja wie kann man das Vermeiden?

                Ich brauche einfach eine immer hochzählende Nummer welche einem neuen Formular zugewiesen wird und ich dann abrufen und anzeigen kann.

                gruß
                drapper

                Kommentar

                • franc
                  Contao-Nutzer
                  • 21.02.2014
                  • 158

                  #9
                  Gibt es da mittlerweile vielleicht eine Erweiterung?
                  Dieser nur individuelle Hack (#6) ist ja eher eine Notlösung, das ist ja ziemlich hartcodiert und außerdem nur ein Ausschnitt, da fehlt ja die Hälfte, so geht das gar nicht, das wirft ja Fehler

                  Könnte man als ID nicht einfach ein Datumsfeld nehmen, also mit Uhrzeit und Sekunden, also etwa:
                  Code:
                  {{date::YmdHis}}
                  EDIT: aber das ist ja nicht fortlaufend, das ist natürlich nicht so toll
                  Mist. Gibt es da keine gescheite Lösung?
                  Zuletzt geändert von franc; 24.08.2015, 18:50.

                  Kommentar

                  • chrizdee
                    Contao-Nutzer
                    • 24.08.2009
                    • 73

                    #10
                    @franc

                    Die damaliger Lösung war für Contao 2.x und wird unter Contao 3 evtl. nicht mehr funktionieren. Eine neuere Version habe ich nicht vorliegen und leider aktuell auch nicht die Zeit mir die Sache genauer anzuschauen. Arg kompliziert kann es aber nicht sein und auch die Auslagerung in ein eigenes Modul sollte fix erledigt sein.

                    Sorry.

                    Kommentar

                    • franc
                      Contao-Nutzer
                      • 21.02.2014
                      • 158

                      #11
                      Zitat von chrizdee Beitrag anzeigen
                      ...die Auslagerung in ein eigenes Modul sollte fix erledigt sein.
                      Das werde ich wohl tun müssen.
                      Hast du eine gute Anleitung für so was? Evtl. ein Buchtipp, wo es ins Detail geht?
                      In der Hilfe finde ich das nicht gut ausgeführt. Das wird nur angekratzt.

                      Ich hoffe die 3.4 Hilfe (obwohl mit outdated markiert) stimmt noch für 3.5, weil die 3.5er Hilfe noch nicht fertig ist, die hört nach Kapitel 5 auf, also vor dem Kapitel mit den Hooks und den Callbacks.
                      An die 3.5 Doku sollte man auch eine Banderole setzen: "Incomplete", wenn die anderen schon mit "Outdated" markiert sind

                      EDIT: gibt doch schon was für die 3.5, ist aber ausgelagert, siehe die Antwort von BugBuster im anderen Thread:
                      Diese Kapitel wurden rausgelöst in ein eigene API Reference Developer Doku.
                      Übersicht https://docs.contao.org/en/#developer-documentation
                      Buch API
                      https://docs.contao.org/books/api/
                      Na dann ans Werk

                      Sehr hilfreich zum Einblick in Hooks für mich Anfänger ist diese Videoanleitung.
                      Es ist nämlich auch gut zu wissen, dass es einen Autoload Creator gibt
                      Zuletzt geändert von franc; 01.09.2015, 17:42.

                      Kommentar

                      • franc
                        Contao-Nutzer
                        • 21.02.2014
                        • 158

                        #12
                        Langsam komme ich weiter mit den Hucks. Immerhin konnte ich schon testweise einen Wert in die DB schreiben.
                        Aber mir kommt noch einen anderen Idee:
                        Gibt es nicht Shop-Extensions, die müssten doch so laufende Nummer längst haben, könnte man nicht so eine Extension umbauen in ein mächtiges Formular?
                        Oder ist das abwegig?

                        Kommentar

                        • franc
                          Contao-Nutzer
                          • 21.02.2014
                          • 158

                          #13
                          Mir ist noch nicht klar, wie ich mit dem Hook für die InsertTags (replaceInsertTags) auf das Formular zugreifen kann, für das ich mit dem processFormData Hook gerade eine fortlaufende Nummer erstellt habe. Dort (in der replaceInsertTags Methode) hab ich das Formular-Array ($arrForm) ja gar nicht, so dass ich den InsertTag mit der neuen fortlaufenden Nummer bestücken könnte.

                          Ich vermute mal in diesem Beitrag steckt eine Lösung. Also ein verstecktes Feld ins Formular integrieren, das ich dann in der processFormData-Methode ersetze.

                          EDIT: Hm, ich komme in der Methode von processFormData aber nicht an das versteckte Feld dran.
                          Zuletzt geändert von franc; 04.09.2015, 00:27.

                          Kommentar

                          • franc
                            Contao-Nutzer
                            • 21.02.2014
                            • 158

                            #14
                            So schaut das jetzt bei mir aus:

                            Ich habe ein neues Modulverzeichnis erstellt efg_lnr
                            Darin die config:

                            /system/modules/efg_lnr/config/config.php

                            Code:
                            <?php
                            $GLOBALS['TL_HOOKS']['processEfgFormData']['myCallback'] = array('myEfgFuncs', 'copyToHidden');
                            und die eigentliche Funktion direkt im Modulverzeichnis:

                            /system/modules/efg_lnr/myEfgFuncs.php

                            Code:
                            <?php
                            class myEfgFuncs extends Backend
                            {
                                public function copyToHidden($arrSubmitted, $arrFiles, $intOldId, &$arrForm)
                                {    
                                    $formular1 = 'aks'; // alias fuer Anmeldung A.Kurs Spezial 
                                    $formular2 = 'buchbestellung'; alias fuer Buchbestellung 
                                    if ($arrForm['alias'] == $formular1)
                                    {
                                        $lnr = 'aks_lnr'; // laufende Nummer fuer A.Kurs Spezial
                                        $result = $this->Database->prepare("SELECT value as maxlnr, pid FROM tl_formdata_details WHERE ff_name = '".$lnr."' ORDER BY pid DESC LIMIT 1")->execute();
                                        if ($result->maxlnr) 
                                        {
                                            $arrSubmitted["$lnr"] = $result->maxlnr + 1;
                                        }
                                        else 
                                        {
                                            $arrSubmitted["$lnr"] = 1;
                                        }
                                        return $arrSubmitted;
                                    }
                                    if ($arrForm['alias'] == $formular2)
                                    {
                                        $lnr = 'buchbestellung_lnr'; // laufende Nummer fuer Buchbestellung
                                        $result = $this->Database->prepare("SELECT value as maxlnr, pid FROM tl_formdata_details WHERE ff_name = '".$lnr."' ORDER BY pid DESC LIMIT 1")->execute();
                                        if ($result->maxlnr) 
                                        {
                                            $arrSubmitted["$lnr"] = $result->maxlnr + 1;
                                        }
                                        else 
                                        {
                                            $arrSubmitted["$lnr"] = 1;
                                        }
                                        return $arrSubmitted;
                                    }
                                }
                            }
                            ?>
                            Die autoload.ini und autoload.php kann man ja über den Autoload-Creator im BE (links fast ganz unten) erstellen lassen.
                            Zur Funktionsweise:
                            Im Formular erstelle ich ein verstecktes Feld, das heißt z.B. aks_lnr, das kommt in diese Funktion (s.o.).
                            Den Alias vom Formular trage ich in der Funktion auch ein.
                            Die Funktion sucht dann bei jedem Absenden des Formulars nach der höchsten Nummer für dieses Formular und zählt eins dazu.
                            Gibt es das Feld zum ersten Mal, also habe ich das Formular frisch erstellt und kriege daher keinen Wert aus der DB-Abfrage, kriegt die lnr eine 1.
                            Das Feld in der DB wo die fortlaufende Nummer mit gespeichert wird, ist das allgemeine Feld "value" in tl_formdata_details, es wird eindeutig mit dem Feld pid mit der tl_formdata verknüpft (was dort der id entspricht), hier suche ich es aber über das Feld "ff_name", das mein lnr-Name (z.B. hier aks_lnr) trägt.

                            Im Moment sind zwei verschiedene laufende Nummern in der Funktion, man kann das natürlich beliebig erweitern. Schöner wäre es, mit foreach ein Array mit den Werten (formularname und lnr) durch zu laufen, aber das habe ich auf die Schnelle nicht hingekriegt und erst mal musste es fertig werden. Außerdem geht mein Debugger lokal nicht in diese Funktion rein, warum auch immer, das hab ich bisher auch nicht raus gekriegt. Eine andere Baustelle.

                            Die Tage werde ich das noch vielleicht etwas überarbeiten, wenn ich auf die ersten Fehler gestoßen bin

                            Geholfen hat mir bei dieser Sache auch dieser Beitrag. aber natürlich auch hier #6, danke.

                            Guten8
                            Zuletzt geändert von franc; 05.09.2015, 01:32.

                            Kommentar

                            • dirksche
                              Contao-Fan
                              • 05.08.2009
                              • 664

                              #15
                              Hallo,

                              ich benötige für ein Formular eine fortlaufende Gutschein Nummer.
                              Ich habe es anhand der Anleitung versucht, aber irgendwie scheint es nicht zu funktionieren.

                              So sieht meine myEfgFuncs.php Datei aus:

                              Code:
                              <?php
                              class myEfgFuncs extends Backend
                              {
                                  public function copyToHidden($arrSubmitted, $arrFiles, $intOldId, &$arrForm)
                                  {    
                                      $formular1 = 'gutschein'; 
                                      if ($arrForm['alias'] == $formular1)
                                      {
                                          $lnr = 'aks_lnr'; 
                                          $result = $this->Database->prepare("SELECT value as maxlnr, pid FROM tl_formdata_details WHERE ff_name = '".$lnr."' ORDER BY pid DESC LIMIT 1")->execute();
                                          if ($result->maxlnr) 
                                          {
                                              $arrSubmitted["$lnr"] = $result->maxlnr + 1;
                                          }
                                          else 
                                          {
                                              $arrSubmitted["$lnr"] = 1;
                                          }
                                          return $arrSubmitted;
                                      }
                                      
                                  }
                              }
                              ?>
                              Mein Formular Alias ist "gutschein" und mein verstecktes Feld im Formular als Feldname "aks_lnr".
                              Habe ich etwas übersehen?
                              Ich nutze Contao 3.2.21 und den aktuellen EFG.

                              LG,
                              Dirk

                              Kommentar

                              Lädt...