Contao-Camp 2024
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 40 von 55

Thema: Gutschein Code Validierung

  1. #1
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard Gutschein Code Validierung

    Habe noch ein Validierungsproblem
    Von manchen Veranstaltern wird gefordert das sie Gutschein-Codes verteilen können und dann die Zahlung per Einzugsermächtigung weg fällt.
    Die Codes können von mir vorgegeben werden. Das heißt es werden z.B. 10 Gutscheine benötigt und ich kann also 10 8-stellige Codes (länge ist aber im Prinzip beliebig und nicht vorgegeben) nennen, die dann in einem Formularfeld auf Gültigkeit geprüft werden müssen.
    Gibt es hier eine Möglichkeit über die Eingabeprüfung?
    Habe schon ein bischen gegoogelt und irgendwelche Hooks gefunden, muss aber gestehen das ich da nicht wirklich weiter gekommen bin.
    Es sollte auch so sein, dass ich für jedes Veranstalterformular unterschiedliche Gutschein-Codes verwenden kann.

    Um nur ein Formular verwenden zu müssen wäre es gut, wenn ein Gutscheincode eingegeben wird die Kontodetails nicht mehr als Pflichtfeld definiert oder ganz ausgeblendet werden. Das könnte ich aber auch über eine Vorauswahl (Einzugsermächtigung oder Gutschein) mit zwei Formularen lösen, wenn es nicht so einfach möglich ist.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  2. #2
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard inspiredminds/contao-extended-form-fields

    Habe das im Titel angegebene Paket gefunden, welches eine Black- oder Whitelist ermöglicht. Eine Whitelist sollte das Problem ja lösen. Werde das testen ...
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  3. #3
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Mit eine Whitelist fehlt Dir dann aber noch, daß ein Gutscheincode nach Verwendung auf "nicht mehr gültig" gesetzt wird.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  4. #4
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Mit eine Whitelist fehlt Dir dann aber noch, daß ein Gutscheincode nach Verwendung auf "nicht mehr gültig" gesetzt wird.
    Ja ... shit! Jetzt hatte ich mich schon gefreut, aber klar.
    Habe dieses Paket gefunden exotelis/coupon, aber das funktioniert nur mit einem Shop-System, oder?

    Hat jemand eine Idee wie ich das mit vorhandenen Paketen lösen könnte, oder benötige diesmal tatsächlich bezahlte Hilfe?

    Es kommt auch noch eine Anforderung. Es sollten Sammelanmeldungen möglich sein. D.h. das z.B. von einem Verein, Schule ,... jemand mehrere Teilnehmer anmelden kann und für diese dann nur noch die individuellen Angaben eingeben muss, wie Name, Jahrgang, Geschlecht.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  5. #5
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Bzgl. der Sammelanmeldung fehlt mir vermutlich dieses Paket
    https://contao.org/de/erweiterungsli....50009.de.html
    damit die Formularfelder an ein weiteres Formular weitergegeben werden. Das scehint aber sehr alt zu sein ist es noch verfügbar und mit 4.4.X kompatibel? Weiß jemand ob man das installieren kann oder es eine Alternative gibt?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  6. #6
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Sammelanmeldung hat sich erledigt!
    Konnte es einem versteckten Feld wo im Standardwert über {{post::feld_name}} der Wert übergeben wird lösen.
    Für eine Validierung von Gutschein-Codes, die nach einmaliger Verwendung die Gültigkeit verlieren habe ich allerdings momentan keine Idee.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  7. #7
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard Fast&Media Event Manager

    Kennt jemand die kostenpflichtige Erweiterung aus dem Titel?
    Ist sie zu empfehlen? Falls ja wäre es mir der Preis wert, wenn dann alle meine Probleme gelöst sind, was sich laut der Feature Liste so anhört.
    Ist das mit dem RockSolid Open Souce Theme und Template kompatibel?
    Habe mal einen Testzugang für das Demo-Backend angefordert.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  8. #8
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Mit eine Whitelist fehlt Dir dann aber noch, daß ein Gutscheincode nach Verwendung auf "nicht mehr gültig" gesetzt wird.
    Ist es möglich den verwendeten Whitelisteintrag mit dem Absenden des Formulars zu löschen?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  9. #9
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Laut https://github.com/inspiredminds/con...ld.php#L86-L93 wird die Whitelist des Form-Fields in der Datenbank gespeichert. Du könntest vielleicht einen Hook registrieren (ich denke https://docs.contao.org/books/api/ex...rocessformdata sollte geeignet sein), der nach erfolgreichem Absenden des Formulars diesen Datenbankeintrag modifiziert un den übermittelten Wert aus der Whiltelist entfernt.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  10. #10
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Computer

    Zitat Zitat von fiedsch Beitrag anzeigen
    Laut https://github.com/inspiredminds/con...ld.php#L86-L93 wird die Whitelist des Form-Fields in der Datenbank gespeichert. Du könntest vielleicht einen Hook registrieren (ich denke https://docs.contao.org/books/api/ex...rocessformdata sollte geeignet sein), der nach erfolgreichem Absenden des Formulars diesen Datenbankeintrag modifiziert un den übermittelten Wert aus der Whiltelist entfernt.
    Puh ... Danke, aber wie schon mehrfach erwähnt bin ich kein Entwickler und hab absolut keine Ahnung wie ich das machen müßte :-)
    Ich denke aber das es billiger sein wird das hier über ein Kleinauftrag anzufragen, als das Event Manager Tool zu kaufen. Und ich hätte dann alles was ich brauche individuell "selbst" gemacht und der Event Manager glaube ich keinen Urkundenabruf über die Plazierung der Laufveranstaltungen bietet, was ich auch bereits anbiete. Der einzoge Vorteil des Manages wäre wohl Zahlung per z.B. Paypal, aber das brauche ich nicht wirklich.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  11. #11
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Habe das hier gefunden
    https://community.contao.org/de/show...FormField-Hook
    Das sollte mein Problem lösen - weiß nur nicht wie ich diesen Hook registriere.
    Bräuchte dann halt für jede Veranstaltung (Tabelle in der DB) eine php-Datei, aber das wäre ja kein Problem.
    Eine Anleitung wie für die IBAN-Validierung ( https://community.contao.org/de/show...tizen-php-iban ) würde mir reichen um es selbst hinzubekommen.
    Für den Aufwand würde ich auch entschädigen - einen Kleinauftrag habe ich hierfür schon aktiviert und auf dieses Thema verwiesen.
    Mir ist nur wichtig das ich das nach einem Beispiel dann für alle Veranstaltungen selbst einrichten kann.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  12. #12
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Habe das hier gefunden
    https://community.contao.org/de/show...FormField-Hook
    Das sollte mein Problem lösen - weiß nur nicht wie ich diesen Hook registriere.
    So, wie jeden anderen

    Bräuchte dann halt für jede Veranstaltung (Tabelle in der DB) eine php-Datei, aber das wäre ja kein Problem.
    Wieso? Wenn Du die Versnastaltungs-ID mit im Formular transprotierst (z.B. als hidden form field oder implizit über die ID des Formulars) sollte es doch alles in einer php-Datei gehen.

    Eine Anleitung wie für die IBAN-Validierung ( https://community.contao.org/de/show...tizen-php-iban ) würde mir reichen um es selbst hinzubekommen.
    Transferdenken reicht auch :-)

    Du musst das dort erwähnte

    PHP-Code:
    <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = ['AppBundle\Hooks\Iban''validateIban'];
    anpassen, damit es den Hook validateFormField berücksichtigt. Z.B. so:

    PHP-Code:
    <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    (siehe https://docs.contao.org/dev/framework/hooks/ "Using the PHP Array configuration")


    Mir ist nur wichtig das ich das nach einem Beispiel dann für alle Veranstaltungen selbst einrichten kann.
    Da ist es für Dich wahrscheinlich am einfachsten, wenn Du Dir dafür eine eigene Tabelle (z.B.) tl_gutscheine anlegst, die
    zumindest die Spalten

    Code:
    | id | gutschein_code | veranstsltungs_id | gueltig |
    beinhaltet. Die könntest Du dann im Backend von Contao pflegen.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  13. #13
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    PHP-Code:
    <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    Kann ich das in eine config.php machen? also:
    PHP-Code:
    <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = ['AppBundle\Hooks\Iban''validateIban'];
    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    PHP-Code:
     <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    Das "Forms" steht für den Namen der PHP-Datei im Vereichnis, oder?

    Code:
    if ($arrForm['formID'] == 'gewinnspiel')
    Die Formular ID in Contao ist ja eine Zahl - ist hier der Formalias gemeint? Oder was ist hier gemeint?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  14. #14
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    In meiner config.php habe ich beide Einträge wie vorher beschrieben

    Meine Datei sieht wie folgt aus - es funktioniert nicht :-( sonst habe ich nichts gemacht, was fehlt oder ist falsch?

    PHP-Code:
    <?php

    // app/Resources/contao/classes/AppBundle/Hooks

    $gutscheinc $_POST['gutscheincode'];

    namespace 
    AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    $host="localhost"// Host name 
    $username="user_name"// Mysql username 
    $password=""// Mysql password 
    $db_name="db_name"// Database name 
    $tbl_name="table_name"// Table name

    $con mysqli_connect($host,$username,$password);
    mysqli_select_db($con,$db_name);

    class 
    Gutschein {


      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == '15') {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tbl_name WHERE value=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  15. #15
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Code:
    $sql = "SELECT * FROM $tbl_name WHERE value=$gutscheinc";
    Funktioniert auch nicht
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  16. #16
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    ok - formID ist der Formalias, sieht man in den Details des Formulars
    Code:
    ...
    if ($arrForm['formID'] == 'testlauf-einzel-gutschein') {
    ...
    funktioniert aber auch nicht
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  17. #17
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    In meiner config.php habe ich beide Einträge wie vorher beschrieben

    Meine Datei sieht wie folgt aus - es funktioniert nicht :-( sonst habe ich nichts gemacht, was fehlt oder ist falsch?
    Nur zur Sicherheit: Du hast nach den Änderungen an der Konfiguration den Cache gelöscht?


    In Deinem Code sind noch Fehler bzw. Unsabberkeiten. Ich schreibe mal als Kommentare in Deinen Code:

    PHP-Code:
    <?php

    // app/Resources/contao/classes/AppBundle/Hooks/<Dateiname>  // Dateiname == class fehlt hier noch; wie heißt die Datei/Klasse? Das muss zur Registrierung des Hooks passen! Bei Dir also Forms. 
    // Außerdem ist es wohl sinnvoller, die Dateien so abzulegen (Verzeichnisse) wie es @Spooky hier beschrieben hat: 
    // https://gist.github.com/fiedsch/1575f5ab27c6d2623fe6fe99896c5239#gistcomment-3063387

    // (1) Vor namespace ... darf nichts stehen
    // (2) Code außerhalb der class 
    // (3) In Contao nicht direkt auf $_POST zugreifen, sondern die Klasse \Contao\Input evrwenden.
    // $gutscheinc = $_POST['gutscheincode'];

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    // Contao stellt die Klasse Database zur Verfügung. Diese sollte man verwenden
    // Das machst Du weiter unten auch bereits. 
    /*
    $host="localhost"; // Host name 
    $username="user_name"; // Mysql username 
    $password=""; // Mysql password 
    $db_name="db_name"; // Database name 
    */
    $tbl_name="table_name"// Table name
    /*
    $con = mysqli_connect($host,$username,$password);
    mysqli_select_db($con,$db_name);
    */

    class Gutschein // wieso heißt diese Klasse Gutschein und nicht Forms (s.o.)


      
    public function myValidateFormField(Widget $objWidget$intId$arrForm){
       
        
    // eine hartkodierte ID ist nicht so schön und schnell eine Fehlerquelle, wenn ein Formular gelöscht und neu angelegt wird (=> neue ID)
        
    if ($arrForm['formID'] == '15') {       if($objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tbl_name WHERE value=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
            
    // höchstwahrscheinlich nicht das, was Du willst. Nur weil der Gutscheincode in der Tabelle steht
            // ist er doch nch nicht verwendet, oder? Müsste hier nicht zusätzlich eine weitere Spalte abgefragt und bei der 
            // ersten Verwendung des Gutscheincodes gesetzt werden?
            // Hier käme dann wahrscheinlich der nächste Hook (processFormData wie in #9 erwähnt) ins Spiel
              
    if($result->numRows 0) {
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }




    Zitat Zitat von Sizoberz Beitrag anzeigen
    Kann ich das in eine config.php machen? also:
    PHP-Code:
    <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['addCustomRegexp'][] = ['AppBundle\Hooks\Iban''validateIban'];
    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    Ja, musst Du.

    PHP-Code:
     <?php
    // src/AppBundle/Resources/contao/config/config.php

    $GLOBALS['TL_HOOKS']['validateFormField'][] = ['AppBundle\Hooks\Forms''validateFormField'];
    Das "Forms" steht für den Namen der PHP-Datei im Vereichnis, oder?
    Ja, genau. Und das muss zu den Klassen (PHP-Dateien) passen, die Du anlegst.

    Du schreibst in weiteren Posts "funktioniert nicht". Was heißt das jeweils? Die Prüfung ist nicht erfolgreich? Der Code wird überhaupt nicht aufgerufen? Es erscheint eine Fehlermeldung? Sonstiges ...
    Geändert von fiedsch (28.10.2019 um 13:52 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  18. #18
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Daumen hoch

    @fiedsch Du bist der Beste! Es funktioniert!
    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    // $tbl_name="tl_an_testlauf"; // Table name

    class Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == 'testlauf-einzel-gutschein') {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM tl_an_testlauf WHERE gutscheincode=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Wenn es jetzt noch klappt das ich den Tabellennamen übernehmen kann das eine Datei für alle Veranstaltungen funktioniert bin ich überglücklich!
    Aber es ändert sich ja die FormID und die Tabelle - ich weiß noch nicht wie ich das machen kann.
    Die Abfrage ob der Wert in der Tabelle ist reicht mir da die Whitelisteinträge ja woanders gespeichet sind und sobald einer verwendet wird, wird er mit der Anmeldung in die Datenbank geschrieben, somit passt es das wenn der Wert gefunden wird, der Gutschein-Code ungültig ist.
    @fiedsch bin Dir was schuldig!
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  19. #19
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Wenn es jetzt noch klappt das ich den Tabellennamen übernehmen kann das eine Datei für alle Veranstaltungen funktioniert bin ich überglücklich!
    Ich würde es so machen, wie oben beschrieben. Vielelicht könntest Du dort noch eine Spalte anlegen, die den zugehörigen Form-Alias beinhaltet, den
    Du in Deinem Code abprüfst. Also in etwa so:


    Aber es ändert sich ja die FormID und die Tabelle - ich weiß noch nicht wie ich das machen kann.
    Warum ändert sich die Tabelle, die Gutscheincodes können doch alee in eine Tabelle geschrieben werden (Voraussetzung natürlich: sie sind über die verscheidenen Veranstaltungen hinweg eindeutig). Evtl. brauchst Du auch nicht beide Prüfungen

    PHP-Code:
        if ($arrForm['formID'] == 'testlauf-einzel-gutschein') {
          if(
    $objWidget->name == 'gutscheincode'){ 
    und es reicht die Prüfung $objWidget->name == 'gutscheincode', denn so viele Formulare, die ein Feld namens 'gutscheincode' haben, aber nichts mit der Validierung zu tun haben wird es nicht geben.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  20. #20
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Es gibt für jede Veranstaltung eine Tabelle mit dem Feld (Spalte) 'gutscheincode'. Bisher ca 15 für 2020.
    Ich werde es jetzt so versuchen für den Tabellennamen und die formID eine zusätzliche Spalte anzulegen, die mit jedem Formular in einem unsichtbaren Feld gesetzt wird und diese übergebe ich dann über die Input Klasse ... ich gebe bescheid ob´s klappt oder ich noch Probleme habe.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  21. #21
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == \Input::post('form-id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM \Input::post('tablename') WHERE gutscheincode=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    So funktioniert es nicht - Fehler in den Logs
    Code:
    [2019-10-28 18:56:47] app.CRITICAL: An exception occurred. {"exception":"[object] (Doctrine\\DBAL\\Exception\\SyntaxErrorException(code: 0): An exception occurred while executing 'SELECT * FROM \\Input::post('tablename') WHERE gutscheincode='12345678'':\n\nSQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\Input::post('tablename') WHERE gutscheincode='12345678'' at line 1 at /.../vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:99, Doctrine\\DBAL\\Driver\\PDOException(code: 42000): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\Input::post('tablename') WHERE gutscheincode='12345678'' at line 1 at /.../vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:109, PDOException(code: 42000): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\\Input::post('tablename') WHERE gutscheincode='12345678'' at line 1 at /.../vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:107)"} []
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  22. #22
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    PHP-Code:
    <?php
            
    // ...
            
    $sql "SELECT * FROM \Input::post('tablename') WHERE gutscheincode=?"
            
    // ...
    unabhängig vom Fehler solltest Du das nicht machen! Stichwort SQL-Injection: stell Dir vor ist schicke als POST-Parameter tablename etwas wie 'tl_user where id>0; select * from xxx' wobei xxx der ursprüngliche von Dir erwartete tablename-Parameter wäre. Dann ist wahrscheinlich jeder Gutschein gültig und mit etwas Kreativität lässt sich auch echter Schaden anrichten.

    Wenn Du nur noch eine Tabelle hast, weißt Du wie sie heißt und musst das nicht als Parameter durchschleifen.


    Code:
    [2019-10-28 18:56:47] app.CRITICAL: An exception occurred. {"exception":"[object] (Doctrine\\DBAL\\Exception\\SyntaxErrorException(code: 0): An exception occurred while executing 'SELECT * FROM \\Input::post('tablename') WHERE gutscheincode='12345678'':\n\nSQLSTATE[42000]: Syntax error or access violation:
    Der Fehler kommt daher, daß Du
    PHP-Code:
    <?php
            $sql 
    "SELECT * FROM " . \Input::post('tablename') . " WHERE gutscheincode=?";
    hättest schreiben müssen, damit der Parameterwert eingesetzt wird. ABER: s.o.!
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  23. #23
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM tl_an_testlauf WHERE gutscheincode=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    So funktioniert es. Die formID konnte ich übergeben - warum klappt das nicht mit dem Tabellennamen? Wie muss das korrekt in der sql Abfrage eingefügt werden?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  24. #24
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Jetzt klappt alles mit dem Sicherheitsrisiko :-(
    Ich benötige wie gesagt min. 15 Tabellen auf die das angewendet werden sollte.
    Gibt es eine sicherere Lösung?
    Kann ich in der sql Zeile sowas wie oder verwenden? So dann ich alle Datenbanken dort einfügen könnte?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  25. #25
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Was spricht denn dagegen, alles in einer Tabelle vorzuhalten. Bsp.: eine Deiner bisherigen Tabellen erweitert um (z.B.) eine Spalte 'formalias' , im Beispiel tl_gutscheincodes genannt und dann
    als SQL-Abfrage

    PHP-Code:
    $sql "SELECT * FROM tl_gutscheincodes WHERE gutscheincode=? AND formalias=?";  
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value$arrForm['alias']); 
    Disclaimer: ich habe es nicht getestet und weiß nicht, ob der Form-Alias im $arrForm unter 'alias' verfügbar ist. Das musst Du ggf. noch herausfinden!
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  26. #26
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Das geht leider nicht mit nur einer Tabelle. Weil es bei fast jeder Veranstaltung einen 10 km-Lauf gibt und ich bei den Veranstaltungen die aktuellen Voranmelder aufliste der einzelnen Läufe einer Veranstaltung.
    Das würde sicher irgendwie gehen, aber dann müßte ich alle Abfragen wieder anpassen, noch weitere Felder einfügen für die Veranstaltung ,...
    Und außerdem sind die Veranstaltungen ja immer zu unterschiedlichen Terminen das Jahr verteilt und ich müßte dann jedes mal die benötigten Anmelder rausholen, ...
    Ich möchte unbedingt für jede Veranstaltung eine eigene Tabelle beibehalten.

    Das Feld das den Tabellen Namen überträgt ist ja ein verstecktes Feld, d.h. es kann ja niemand was direkt dort hin übertragen. Oder verstehe ich da was falsch?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  27. #27
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Ich möchte unbedingt für jede Veranstaltung eine eigene Tabelle beibehalten.
    Dann mach es so. Mein Gefühl sagt mir, daß Du Dir damit letztlich das Leben unnötig schwer machst.


    Das Feld das den Tabellen Namen überträgt ist ja ein verstecktes Feld, d.h. es kann ja niemand was direkt dort hin übertragen. Oder verstehe ich da was falsch?
    Ja! Du musst ja nur mit den Browsertools, die jeder mit F12 zur Hand hat den Quelltext Deines versteckten Formularfelder ändern und schon hast Du gefälschte Daten.

    Wenn Du es unbedingt mit verschiedenen Tabellen machen willst, könntest Du in Deinem Code einen Array erstellen (quasi eine Tabellennamen-Whitelist), der die \Input:ost('form_id') auf den Tabellennamen abbildet. Z.B. so:

    PHP-Code:
    $form_id = \Input::post('form_id');
    $tablenames = [
      
    => 'tabelle_a',
      
    => 'etwas_anderes',
      
    => 'tabele_xyz',
      
    // ...
    ];

    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null;

    if (
    null === $tablename) {
      
    // Fehler behandeln. Z.B.
      
    $objWidget->addError('Der Gutschein-Code konnte nicht geprüft werden!'); 
      return  
    $objWidget;
    }

    // wenn wir hierher kommen, dann mit dem ermittelten $tablename im $sql Query weiter machen
    // ... 
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  28. #28
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Funktioniert nicht. Verstehe auch nicht warum form_id verwendet wird - sollte das nicht tbl_name sein?
    Wie wird $tablename dann in der sql abfrage verwendet?
    Kann man in der Whitelist zum testen nur ein Eintrag verwenden?

    Mein aktueller Code der funktioniert:
    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM " . \Input::post('tbl_name') . " WHERE gutscheincode=?"
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Geändert von Sizoberz (28.10.2019 um 20:50 Uhr)
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  29. #29
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Funktioniert nicht.
    Heißt?

    Verstehe auch nicht warum form_id verwendet wird - sollte das nicht tbl_name sein?
    Ich habe im Beispiel form_id verwendet, weil Du das in Deinem Code (siehe #21) verwendet hattest.
    Wenn Du an die ID des jeweiligen Forms mit $arrForm['formID'] zugreifen kannst, dann nihh dieses. Ich wollte mit meinem Beispiel nur ein mögliches Prinzip aufzeigen.

    Wie wird $tablename dann in der sql abfrage verwendet?
    PHP-Code:
    $sql "SELECT * FROM $tablename WHERE gutscheincode=?"

    Kann man in der Whitelist zum testen nur ein Eintrag verwenden?
    Du kannst in die Whitelist schreiben was Du willst. Wichtig ist, daß der zum übermittelten formID Parameter gehörige Tabellenname dort enthalten ist und so der richtige Tabellenname gefunden wird.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  30. #30
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Frage

    form_id habe ich für die formID verwendet - es geht doch aber um den Tabellennamen in der sql Abfrage. Jetzt bin ich ganz verwirrt.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  31. #31
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Ich habe Deine Aufgabe so verstanden, daß Du für verschiedene Veranstaltungen verschiedene Contao-Formulare (und damit verschiedene FormIDs) hast.

    Zu jedem Formular gibt es eine eigene Tabelle. Anstatt nun (potenziell veränderbar) den Tabellennamen im Formular mitzuschicken, greifts Du auf die Formular-ID zu, die Du von Contao im $arrForm-Array geliefert bekommst und bestimmst mit dieser ID durch Nachschauen im $tablenames-Array, was der benötigte Tabellenname ist.

    Diesen verwendest Du dann in Deinem $sql. Da Du den Wert aus einer Whitelist holst, sollte das sicherheitstechnisch OK sein.

    Zusätzlich (für den Fall der Fälle) baust Du noch eine Abfrage ein, die prüft, ob beim Bestimmen des Tabellennamens alles OK war und setzt -- falls nicht -- eine Fehlermeldung.

    Wie könnte etwas schief gehen? Du könntest z.B. ein neues Formular anlegen und vergessen haben, den Tabellennamen und die zugehörige FormID in $tablenames nachzutragen.

    (Und aus genau diesen "daran muss man halt denken" Gründen hatte ich oben gemeint, daß es m.E. besser wäre alles in einer Tabelle zu pflegen.)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  32. #32
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Ok das habe ich jetzt verstanden :-)
    Es funktioniert aber nicht :-(
    Mein aktueller Code:
    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;

    class 
    Forms {

    $form_id = \Input::post('form_id');
    $tablenames = [
      
    => 'tl_an_testlauf',
      
    // ...
    ];

    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null;

    if (
    null === $tablename) {
      
    // Fehler behandeln. Z.B.
      
    $objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet!');
      return  
    $objWidget;


      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tablename WHERE gutscheincode=?";
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code ist ungültig oder wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Fehler in den Logs:
    Code:
    [2019-10-28 23:05:22] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Parse error: syntax error, unexpected '$form_id' (T_VARIABLE), expecting function (T_FUNCTION) or const (T_CONST) at /homepages/27/d225070431/htdocs/contaolsm/app/Resources/contao/classes/AppBundle/Hooks/Forms.php:9)"} []
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  33. #33
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;
    use 
    Contao\System// neu hinzugefügt (für Loging; s.u.)

    class Forms {

    // Die folgenden Codezeilen haben keinen Kontext. Wozu sollen sie aus PHPs Sicht gehören?
    // Daher auch die Fehlermeldung:  Parse error: syntax error, unexpected '$form_id' ...
    /*
    $form_id = \Input::post('form_id');
    $tablenames = [
      1 => 'tl_an_testlauf',
      // ...
    ];

    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null;

    if (null === $tablename) {
      // Fehler behandeln.
      // Der Text der Fehlermeldung stimmt hier inhaltlich nicht. Es fehlt ja die interne Konfiguration,
      // d.h. es konnte gar nicht geprüft werden, ob der Gutscheincode gültig oder bereits verwendet ist.
      // Das solltest Du auch dem User sagen und evtl. auch noch, was er jetzt machen soll.
      // Für Dich selbst könntest Du diese Fehlersituation auch noch protokollieren, damit sie im 
      // Backend im Systemlog auftaucht:
      System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen", __METHOD__, TL_ERROR);
      $objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet!'); 
      return  $objWidget;

    */

      
    public function myValidateFormField(Widget $objWidget$intId$arrForm){
       
      
    // Hier gehört der oben auskommentierte Code hin. Dann wird er in der Funktion
      // myValidateFormField() aufgerufen, die Du als Hook verwendest.
       
     
    if ($arrForm['formID'] == \Input::post('form_id')) { // Den Sinn dieser Prüfung verstehe ich immer noch nicht
          
    if($objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tablename WHERE gutscheincode=?";
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code ist ungültig oder wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  34. #34
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;
    use 
    Contao\System;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
    $form_id = \Input::post('form_id');
    $tablenames = [
      
    => 'tl_an_testlauf',
      
    // ...
    ];

    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null;

    if (
    null === $tablename) {
      
    System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen"__METHOD__TL_ERROR);
      
    $objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet!'); 
      return  
    $objWidget;


        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tablename WHERE gutscheincode=?";
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code ist ungültig oder wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    So wird eine schließende Klammer in Zeile 19 bemängelt
    PHP-Code:
    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null
    und so
    PHP-Code:
    $tablename = isset($tablenames[$form_id]? $tablenames[$form_id] : null); 
    kommt folgene Fehlermeldung in den Logs
    Code:
    [2019-10-29 08:48:07] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 0): Compile Error: Cannot use isset() on the result of an expression (you can use \"null !== expression\" instead) at /.../app/Resources/contao/classes/AppBundle/Hooks/Forms.php:18)"} []
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  35. #35
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    So, wie man es sprachlich auch verstehen würde:

    Wenn $tablenames[$form_id] gesetzt ist, dann nehme dies als $tablename, ansonsten nehme null.

    PHP-Code:
    $tablename = isset($tablenames[$form_id]) ? $tablenames[$form_id] : null
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  36. #36
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    So, wie man es sprachlich auch verstehen würde:

    Wenn $tablenames[$form_id] gesetzt ist, dann nehme dies als $tablename, ansonsten nehme null.

    PHP-Code:
    $tablename = isset($tablenames[$form_id]) ? $tablenames[$form_id] : null
    Hmm, form_id wird ja aber per Input geholt und ist also gesetzt. Muss $tablename dem Spaltennamen in der MySQL Tabelle entsprechen? Das wäre dann $tbl_name

    Funktioniert aber auch nicht :-(
    Geändert von Sizoberz (29.10.2019 um 11:18 Uhr)
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  37. #37
    Contao-Nutzer Avatar von Sizoberz
    Registriert seit
    17.11.2017.
    Ort
    Schwabenland
    Beiträge
    128

    Standard

    Ah - die Klammer war falsch gesetzt.
    Jetzt kommt keine generelle Fehlermeldung mehr, aber es kommt bei JEDEM Feld die definierte Error Meldung "Der Gutschein-Code ist ungültig oder wurde schon verwendet!", obwohl keine Einträge in der Datenbank sind, die diesen Wert schon eingetragen haben.

    Hier nochmal mein aktueller Code:
    PHP-Code:
    <?php

    namespace AppBundle\Hooks;
    use 
    Contao\Database;
    use 
    Contao\Widget;
    use 
    Contao\System;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){
       
    $form_id = \Input::post('form_id');
    $tablenames = [
      
    => 'tl_an_testlauf',
      
    // ...
    ];

    $tablename = isset($tablenames[$form_id]) ? $tablenames[$form_id] : null;

    if (
    null === $tablename) {
      
    System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen"__METHOD__TL_ERROR);
      
    $objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet!'); 
      return  
    $objWidget;


        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $tablename WHERE gutscheincode=?";
            
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
              if(
    $result->numRows 0){
                  
    $objWidget->addError('Dieser Gutschein-Code ist ungültig oder wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Geändert von Sizoberz (29.10.2019 um 11:54 Uhr)
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  38. #38
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Hmm, form_id wird ja aber per Input geholt und ist also gesetzt.
    Ist das ein "sollte gesetzt sein", oder hast Du das überprüft?

    Muss $tablename dem Spaltennamen in der MySQL Tabelle entsprechen? Das wäre dann $tbl_name
    Ich verstehe hier nicht, was Du meinst. Wo kommen jetzt plötzlich Spaltennamen ins Spiel?

    $tablename deshalb, weil Du geschrieben hattest, daß Du je Veranstaltung eine eigene Tabelle haben willst.
    D.h. der erste Schritt ist, anhand der ID des abgeschickten Formulars herauszufinden, in welcher Tabelle der Gutscheincode gesucht werden muss.

    Funktioniert aber auch nicht :-(
    Was hast Du genau probiert und wie äußert sich das "funktioniert nicht"?




    Zitat Zitat von Sizoberz Beitrag anzeigen
    A
    Jetzt kommt keine generelle Fehlermeldung mehr, aber es kommt bei JEDEM Feld die definierte Error Meldung "Der Gutschein-Code ist ungültig oder wurde schon verwendet!", obwohl keine Einträge in der Datenbank sind, die diesen Wert schon eingetragen haben.
    Da Du bei beiden "Fehlersituationen" den gleichen Text hast, kannst Du so nicht sagen, wo der Fehler auftritt. Ich würde daher den
    Text des ersten addError() ändern:

    PHP-Code:
    if (null === $tablename) {
      
    System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen"__METHOD__TL_ERROR);
      
    $objWidget->addError('Der Gutschein-Code ist ungültig oder wurde schon verwendet!'); 
      return  
    $objWidget;

    Was steht denn in Contaos System-Log? Heißt, wird das System::log() ausgeführt? Das wäre dann der Beleg dafür, daß dies Dein Fehler ist.
    Du müsstest Dann die $tablenames so anpassen, daß zum übergebenen $form_id auch ein Eintrag existiert -- die $form_id sollte auch im Log-Eintrag stehen.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  39. #39
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.050
    Partner-ID
    10107

    Standard

    Zum ursprünglichen Problem: man könnte die Whitelist Funktion von https://extensions.contao.org/?q=ext...ed-form-fields verwenden. Mehr als die Validierung der Codes passiert dadurch dann aber natürlich auch nicht.

  40. #40
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Danke @spooky. Soweit ich es verstanden habe, ist das auch bereits so. Es geht aber zusätzlich darum, die ein Mal verwendeten Codes zu „invalidieren“.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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