Ergebnis 1 bis 24 von 24

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

  1. #1
    Contao-Nutzer Avatar von chrizdee
    Registriert seit
    24.08.2009.
    Ort
    Reichenschwand
    Beiträge
    73

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

  2. #2
    Contao-Nutzer Avatar von Dr. Jo
    Registriert seit
    11.08.2009.
    Ort
    Riehen (CH)
    Beiträge
    205

    Standard

    Hallo chrizdee,

    schau mal hier:
    https://community.contao.org/de/showthread.php?t=1562

    Hilft Dir das weiter?

    Gruß

    Dr. Jo

  3. #3
    Contao-Nutzer Avatar von chrizdee
    Registriert seit
    24.08.2009.
    Ort
    Reichenschwand
    Beiträge
    73

    Daumen hoch

    Top!
    Genau danach hab ich gesucht.

    Herzlichen Dank.

  4. #4
    Contao-Fan Avatar von thepixture
    Registriert seit
    24.06.2009.
    Ort
    Dresden
    Beiträge
    536

    Standard

    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?

  5. #5
    Contao-Nutzer
    Registriert seit
    05.04.2013.
    Beiträge
    5

    Frage 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?

  6. #6
    Contao-Nutzer Avatar von chrizdee
    Registriert seit
    24.08.2009.
    Ort
    Reichenschwand
    Beiträge
    73

    Standard

    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($varVal5"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.

  7. #7
    Contao-Nutzer
    Registriert seit
    05.04.2013.
    Beiträge
    5

    Standard

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

  8. #8
    Contao-Nutzer
    Registriert seit
    27.12.2012.
    Beiträge
    40

    Standard

    Zitat 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

  9. #9
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    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?
    Geändert von franc (24.08.2015 um 17:50 Uhr)

  10. #10
    Contao-Nutzer Avatar von chrizdee
    Registriert seit
    24.08.2009.
    Ort
    Reichenschwand
    Beiträge
    73

    Standard

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

  11. #11
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    Zitat 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
    Geändert von franc (01.09.2015 um 16:42 Uhr)

  12. #12
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    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?

  13. #13
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    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.
    Geändert von franc (03.09.2015 um 23:27 Uhr)

  14. #14
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    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
    Geändert von franc (05.09.2015 um 00:32 Uhr)

  15. #15
    Contao-Fan Avatar von dirksche
    Registriert seit
    05.08.2009.
    Ort
    Grosslittgen
    Beiträge
    643

    Standard

    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

  16. #16
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    Passiert denn überhaupt was?
    Hast du mal in der DB geschaut, ob da was angelegt wird, in der Tabelle tl_formdata_details?
    Sind die autoload.ini und php angelegt und passen?

    Ansonsten:
    Warum hast du das eigentlich auch aks_lnr genannt? AKS stand in meinem Fall für Aufbaukurs Spezial, das wäre doch besser du benennst es in deinen Fall um, also etwa gutschein_lnr, das ist einfach einfacher zum Verstehen. Wenn man in drei Wochen noch mal auf das versteckte Feld aks_lnr trifft, dann könnte man schon ins Grübeln kommen was das soll. Natürlich ist das für die Funktionsweise egal, ich mein ja nur.
    Außerdem: wenn du nur ein Formular abfragst, dein gutschein Formular, dann reicht doch auch statt:

    Code:
            $formular1 = 'gutschein'; 
            if ($arrForm['alias'] == $formular1)
    nur:
    Code:
        if ($arrForm['alias'] == 'gutschein')
    EDIT: ich hatte das ja in der If-Abfrage nur formular1 und formular2 genannt, damit ich oben vor allen if-Abfragen übersichtlicher die Formularnamen eintragen kann. Bei einem Formular ist das ja egal.
    Geändert von franc (16.10.2015 um 13:32 Uhr)

  17. #17
    Contao-Fan Avatar von dirksche
    Registriert seit
    05.08.2009.
    Ort
    Grosslittgen
    Beiträge
    643

    Standard

    Ja, die autoload Dateien hab ich über den Autoload Creator anlgelegt.
    Ich hab das Script nun etwas gekürzt um einfach mal zu testen ob überhaupt ein Wert in das Feld geschrieben wird.
    Code:
    <?php
    class myEfgFuncs extends Backend
    {
        public function copyToHidden($arrSubmitted, $arrFiles, $intOldId, &$arrForm)
        {    
            if ($arrForm['alias'] == 'gutschein')
            {
                $lnr = 'gutschein_lnr';
    			$arrSubmitted["$lnr"] = 1;
    
                
                return $arrSubmitted;
            }
            
        }
    }
    ?>
    Das Formular wird versendet und auch gespeichert. Allerdings wird einfach kein Wert (also die 1) in das versteckte Feld eingetragen :-(

  18. #18
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    Zitat Zitat von dirksche Beitrag anzeigen
    Ja, die autoload Dateien hab ich über den Autoload Creator anlgelegt...
    Das muss nicht zuverlässig funktionieren, das muss man manuell nachprüfen, ob da alles auch drin steht. Ich hatte da schon, dass die Hälfte gefehlt hatte.

    Mein Verdacht ist, dass die Funktion gar nicht aufgerufen wird. Das würde ich zuerst prüfen.
    Du hast schon ein separates Modulverzeichnis angelegt?

  19. #19
    Contao-Nutzer
    Registriert seit
    21.02.2014.
    Beiträge
    158

    Standard

    Klappt es jetzt oder hast du aufgegeben?

  20. #20
    Contao-Fan Avatar von dirksche
    Registriert seit
    05.08.2009.
    Ort
    Grosslittgen
    Beiträge
    643

    Standard

    Ich habs jetzt anders gelöst. Folgendes PHP Script wird per Insert Tag in ein verstecktes Feld geschrieben:
    Code:
    <?php 
    	
    	$this->import('Database');
    
    	/* Erster Gutschein */
    	$gutschein = "UNI#0001";
    
    	/* Lese aktuellen Gutschein */
    	$result = $this->Database->prepare("SELECT * FROM tl_formdata_details WHERE ff_name = 'gutschein_lnr' ORDER BY pid DESC limit 1")->execute();
    
    	if($result->value){
    		$prefix = substr($result->value, 0, 4);
    		$num = substr($result->value, 4);
    
    		$num++;
    
    		$gutschein = sprintf('%s%04u', $prefix, $num);
    	}
    
    	echo $gutschein;
    
    ?>
    Funktioniert auch soweit ganz gut.

  21. #21
    Contao-Nutzer Avatar von wsa
    Registriert seit
    27.10.2009.
    Ort
    Augsburg
    Beiträge
    128

    Frage ID des neuen Datensatzes in der Datenbank

    Hallo zusammen,

    ich greife diesen Thread noch einmal auf. Bin in einer meiner Installationen noch auf Contao 2.11.6 (Umstellungsaufwand auf Contao 3 ist unverhältnismäßig hoch.)
    In der Community habe ich noch keinen passenden Lösungsansatz gefunden bzw. finde veraltete Links (z.B. https://community.contao.org/de/showthread.php?t=1562 in #2)

    Meine Aufgabenstellung:
    • Ich speichere EFG-Formulardaten als neuen Eintrag im Catalog (Ja sowas gibt es unter 2.11 noch und funktioniert nach wie vor.)
    • Im Catalog wird ein neuer Datensatz erzeugt, welcher via auto increment eine neue ID erhält.
    • Diese ID möchte ich gerne als Query-String in einen Link einbauen, der via Bestätigungs-Mail versendet wird.
    • Über diesen Link erhält der Empfänger der Mail Direktzugriff auf genau diesen Eintrag im Catalog.

    Da sowohl processFormData- als auch storeFormData-Hook vor dem Speichern in der DB greifen, können die beiden ja noch nichts von der neuen Entry-ID „wissen“.

    (Ein Auslesen des zuletzt gespeicherten Datensatzes aus der DB wäre zwar möglich, stellt aber nicht sicher, dass (bei mehreren fast gleichzeitigen Einträgen) die richtige ID ausgewählt wird.)

    Wer hat einen zielführenden Lösungsansatz für mich?

    Besten Dank im Voraus!
    wsa

  22. #22
    Contao-Nutzer
    Registriert seit
    18.08.2016.
    Beiträge
    2

    Standard Hilfe

    Hallo möchte das Thema auch gerne noch einmal aufgreifen. Bei mir geht es allerdings um einen Reservierungscode und keinen Gutschein. Also eigentlich das was der Beitragersteller chrizdee schon vor hatte.

    Leider verstehe ich nicht was dirksche meint mit
    PHP Script wird per Insert Tag in ein verstecktes Feld geschrieben.
    Bin eher so der Designer . Vielleicht könnte dirksche ein mini Step-by-step tutorial schreiben? Wäre unendlich Dankbar. Eigentlich möchte ich nur das die Bestätigungsmail (EFG) eine Fortlaufende Nummer enthält, mehr nicht. Contao V. ist 3.5.9.

    Hat einer eine Idee?

    LG Nico

  23. #23
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Wahrscheinlich meint er mit {{file::my-php.html5}}. my-php.html5 liegt in templates/. Diesen Inserttag schreibst du ins Feld "Standard-Wert". In der Datei ist der Code.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  24. #24
    Contao-Nutzer
    Registriert seit
    18.08.2016.
    Beiträge
    2

    Multimedia Danke

    Zitat Zitat von Andreas Beitrag anzeigen
    Wahrscheinlich meint er mit {{file::my-php.html5}}. my-php.html5 liegt in templates/. Diesen Inserttag schreibst du ins Feld "Standard-Wert". In der Datei ist der Code.
    Ja leuchtet ein. Super Danke hat funktioniert. Gutes Forum gute User. Zur Info: Contao 3.5.9 mit EFG 2.2.1.

Aktive Benutzer

Aktive Benutzer

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

Ähnliche Themen

  1. Antworten: 15
    Letzter Beitrag: 01.10.2012, 13:25
  2. Formularfeld mit automatisch generierter Nummer
    Von frick.christian im Forum Formulare
    Antworten: 1
    Letzter Beitrag: 18.01.2011, 20:02
  3. Nummer eines Items?
    Von macringo im Forum Layout / Templates / Holy Grail
    Antworten: 8
    Letzter Beitrag: 21.08.2009, 17:02

Lesezeichen

Lesezeichen

Berechtigungen

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