Contao-Camp 2024
Seite 2 von 2 ErsteErste 12
Ergebnis 41 bis 55 von 55

Thema: Gutschein Code Validierung

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

    Standard

    Zitat Zitat von fiedsch
    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“.
    Ja genau, so ist es und funktioniert auch mit dem gewissen Sicherheitsproblem.

    Zitat Zitat von fiedsch
    Ist das ein "sollte gesetzt sein", oder hast Du das überprüft?
    In dem anderen Code mit dem Sicherheitsptoblem funktioniert das \Input:ost('form_id') deshalb gehe ich davon aus.

    Zitat Zitat von fiedsch
    $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.
    Ok, aber der Tabellenname passt ja der hier gesetzt wird 1 => 'tl_an_testlauf',

    Zitat Zitat von fiedsch
    Was hast Du genau probiert und wie äußert sich das "funktioniert nicht"?
    Das bezog sich darauf das ich probiert habe statt $tablename $tbl_name zu verwenden

    Zitat Zitat von fiedsch
    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:
    Habe ich - es handelt sich um die erste Meldung
    Das ganze sieht so jetzt aus wie gesagt bei jedem Feld kommt die Meldung
    formscreenshot.png

    Zitat Zitat von fiedsch
    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.
    In den Logs ist keine Meldung zu sehen nur irgendwas das das favicon nicht gefunden wird aber das kommt dauernt und hat damit wohl nichts zu tun
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  2. #42
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Habe ich - es handelt sich um die erste Meldung
    Das ganze sieht so jetzt aus wie gesagt bei jedem Feld kommt die Meldung
    formscreenshot.png
    Dann muss $tablename gleich null sein und also das Nachschlagen anhand der form_id nicht funktioniert haben.

    In den Logs ist keine Meldung zu sehen nur irgendwas das das favicon nicht gefunden wird aber das kommt dauernt und hat damit wohl nichts zu tun
    [/QUOTE]

    Daß es bei jedem Feld kommt zeigt ebenfalls, daß es die erste Fehlermeldung sein muss, denn bei der zweiten hast Du ja zusätzlich die Prüfung "if($objWidget->name == 'gutscheincode')". Mit dem Log meinte ich übrigens nicht die Log-Dateien unter /var/logs/ (dort dürften die Favicon-Einträge stehen) sondern den Menüpunkt im Backend. Welche Meldung (insbes. Form-ID) steht denn hier?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Dann muss $tablename gleich null sein und also das Nachschlagen anhand der form_id nicht funktioniert haben.

    Daß es bei jedem Feld kommt zeigt ebenfalls, daß es die erste Fehlermeldung sein muss, denn bei der zweiten hast Du ja zusätzlich die Prüfung "if($objWidget->name == 'gutscheincode')". Mit dem Log meinte ich übrigens nicht die Log-Dateien unter /var/logs/ (dort dürften die Favicon-Einträge stehen) sondern den Menüpunkt im Backend. Welche Meldung (insbes. Form-ID) steht denn hier?[/QUOTE]

    Code:
    Konnte Tabellenname zu Formular-ID 'testlauf-sammel-gutschein' nicht bestimmen
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  4. #44
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Code:
    Konnte Tabellenname zu Formular-ID 'testlauf-sammel-gutschein' nicht bestimmen
    Dann brauchst Du in $tablenames das:

    PHP-Code:
    $tablenames = [ 
      
    'testlauf-sammel-gutschein' => 'tl_an_testlauf'
      
    // ... 
    ]; 
    Es geht nur darum, anhand des übergebenen Parameters (hier laut Log 'testlauf-sammel-gutschein') den Tabellennamen zu finden.

    So sollte es funktionieren, aber Du benötigst das wahrscheinlich nicht, denn Du könntest in dem Feld der Formulardefinition, in dem Du
    'testlauf-sammel-gutschein' eingegeben hast ja auch gleich den gesuchten Tabellennamen 'tl_an_testlauf' eingeben und hättest dann
    anstelle

    PHP-Code:
    $tablename = isset($tablenames[$form_id]) ? $tablenames[$form_id] : null
    nur noch

    PHP-Code:
    $tablename $form_id
    und damit eine Stelle weniger, an der Du Daten pflegen musst.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard Vielen Dank !!!

    @fiedsch und wieder hast Du mir geholfen ein Problem zu lösen - Danke!
    Tut mir echt leid das ich manchmal nicht sofort verstehe um was es geht oder wie was gemeint ist - und deshalb bin ich ganz besonders froh das mir trotzdem weitergeholfen wird.

    Mein Code sieht jetzt so aus:
    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 $form_id;

    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! -1ste Meldung'); 
      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! 2te Meldung');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Der ist jetzt sicher und kann produktiv verwendetet werden, wenn ich die Liste mit den Tabellennamen erweitere, die für die Veranstaltungen verwendet werden?
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  6. #46
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Der ist jetzt sicher und kann produktiv verwendetet werden, wenn ich die Liste mit den Tabellennamen erweitere, die für die Veranstaltungen verwendet werden?
    Nachdem Du die Liste mit den Tabellennamen ger nicht verwendest, wenn Du

    PHP-Code:
    $form_id = \Input::post('form_id'); 

    $tablenames = [ 
      
    => 'tl_an_testlauf'
      
    // ... 
    ]; 

    $tablename $form_id// unabhängig vom Inhalt von $tablenames setzt Du hier $tablename immer auf den Inhalt von \Input::post('form_id') 
    schreibst, bist Du wieder da wo Du schon warst. Funktioniert, sollte man aber nicht unbedingt machen.

    Die generelle Frage ist für mich hierbei immer die: woher kommen die Daten?

    Der Parameter $arrForm (oder die ID in $intId) kommen von Contao, \Input:ost() vom User und könnte manipuliert sein.

    Jetzt kannst Du entweder die $intId zusammen mit der Liste $tablenames verwenden. Sie enthielte bei Verwendung der $intId die Zuorndung von numerischer Formular-ID (gemäß Contao-Backend; siehe dortiges blaues (i)-Icon) zum von Dir benötigten Tabellennamen.

    Oder Du verwendest ein Feld aus der Formularkonfiguration, das Du selbst gleich dem benötigten Tabellennamen setzen kannst.

    Hier bietet sich für mich aus der Formulardefinition der "Formalias" ("Der Formalias ist eine eindeutige Referenz, die anstelle der numerischen Form-ID aufgerufen werden kann.") an, auf den Du mit $arrForm['alias'] zugreifen können solltest.

    Damit hättest Du dann nur noch

    PHP-Code:
    $tablename $arrForm['alias']; 
    Damit sollte dann auch die Prüfung, ob der so bestimmte $tablename === null ist

    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! -1ste Meldung'); 
          return  
    $objWidget;
        } 
    komplett entfallen können, da Contao den Alias immer setzt: wenn Du keinen Wert vorgibst, wird einer generiert.

    Den Sinn der Prüfung

    PHP-Code:
    if ($arrForm['formID'] == \Input::post('form_id')) { 
    habe ich noch nicht verstanden. Das wäre ja bestenfalls etwas wie: "ist die form_id aus den Post-Daten wie erwartet gleich der aus den $arrForm-Daten"?
    Und wenn ich den Post-Daten nicht vertraue, den $arrForm-Daten aber schon, frage ich mich, wieso ich nicht gleich die $arrForm-Daten verwende.


    PHP-Code:
    <?php

    namespace AppBundle\Hooks;

    use 
    Contao\Database;
    use 
    Contao\Widget;
    use 
    Contao\System;

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm) {
        
        if (
    $objWidget->name == 'gutscheincode') {
          
    $tablename $arrForm['alias']; 
          
    $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;     
      }
    }

    Noch eine Idee zum Text des addError(): Die Gültigkeit des Gutscheincodes an sich müsste doch von der Validierung bzgl. der Whitelist stammen. D.h. es sollte in diesem -- hoffentlich vorgelagerten Schritt -- eine eigene Fehlermeldung erscheinen. Dann bliebe in diesem Schritt als einziger Fehler noch etwas wie "Dieser Gutschein-Code wurde schon verwendet!". Vielleicht macht es das für den User klarer.
    Geändert von fiedsch (31.10.2019 um 05:42 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard

    Hier 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 = [
      
    $form_id => '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('Die Tabelle konnte nicht zugeordnet werden!'); 
      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 wurde schon verwendet!');
              }
          }
        }
          return 
    $objWidget;     
      }
    }
    Wenn ich einen ungültigen Code eingebe kommt die Melsung, die ich als Fehlermeldung für die Whitelist hinterlegt habe - richtig.
    Wenn ich einen gültigen Whitelist-Code eingebe wird die Anmeldung getätigt - richtig.
    Wenn ich jetzt eine zweite Anmeldung mache mit dem schon verwendeten Code kommt auch die Meldung aus der Whitelist "Der Code ist ungültig" und nicht die Meldung aus dem Hook "Der Code wurde schon verwendet".
    Wäre das jetzt so sonst einigermaßen sicher? Als form_id habe ich jetzt wieder "testlauf-einzel-gutschein" und nicht den Tabellennamen direkt.
    Die Fehlermeldung könnte ich ja wieder setzten auf "ist ungültig oder wurde schon verwendet" - damit könnte ich leben.

    PHP-Code:
    if ($arrForm['formID'] == \Input::post('form_id')) 
    Diese zeile prüft ja ob der Wert schon in der Tabelle bei "gutscheincode" vorhanden ist dachte ich und es funktioniert ja auch wie es soll.
    Geändert von Sizoberz (31.10.2019 um 13:33 Uhr)
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  8. #48
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    PHP-Code:
    $form_id = \Input::post('form_id');
    $tablenames = [
      
    $form_id => 'tl_an_testlauf',
      
    // ...
    ];

    $tablename = isset($tablenames[$form_id]) ? $tablenames[$form_id] : null
    Dieser Code mag zwar funktionieren, mach aber nichts sinnvolles. Warum? Weil Du

    • $form_id auf das setzt, was Dir in \Input:ost('form_id') übergeben wird,
    • dann in $tablenames genau unter diesem Schlüssel den Wert 'tl_an_testlauf' hinterlegst
    • und schließlich in $tablenames nachschaust, was unter dem Schlüssel $from_id hinterlegt ist.
    • Das wenig überraschende Erebnis: 'tl_an_testlauf'


    Das funktioniert zwar, solange Du nur die eine Tabelle 'tl_an_testlauf' hast, aber was machst Du, wenn Du zwei oder mehr Formulare und damit Tabellen hast (also der // ...-Teil).


    Wenn ich einen ungültigen Code eingebe kommt die Melsung, die ich als Fehlermeldung für die Whitelist hinterlegt habe - richtig.
    Wenn ich einen gültigen Whitelist-Code eingebe wird die Anmeldung getätigt - richtig.
    Wenn ich jetzt eine zweite Anmeldung mache mit dem schon verwendeten Code kommt auch die Meldung aus der Whitelist "Der Code ist ungültig" und nicht die Meldung aus dem Hook "Der Code wurde schon verwendet".
    Das klingt für mich danach, als ob "die Whitelist" schon um dieses Thema zu kümmern und den Code nach Verwendung aus der Liste zu löschen.

    Ich kenne die Ereweiterung nicht und habe auch keine Testinstallation. Wenn wir von der gleichen Erweiterung reden, dann sieht es so aus, also ob sie das nicht macht: siehe hier.

    Was siehst Du denn im Backend in den Einstellungen der Whitelist, nachdem ein Code verwendet wurde? Ost der dann dort immer noch enthalten?

    Als form_id habe ich jetzt wieder "testlauf-einzel-gutschein" und nicht den Tabellennamen direkt.
    Warum?

    Die Fehlermeldung könnte ich ja wieder setzten auf "ist ungültig oder wurde schon verwendet" - damit könnte ich leben.
    Das beantwortet ja nicht die obige Frage, ob es überhaupt nötig ist und was genau passiert, d.h. warum Du andere Fehlermeldungen bekommst als in Deinem beschriebenen Ablauf erwartet.

    PHP-Code:
    if ($arrForm['formID'] == \Input::post('form_id')) 
    Diese zeile prüft ja ob der Wert schon in der Tabelle bei "gutscheincode" vorhanden ist dachte ich und es funktioniert ja auch wie es soll.
    Diese Zeile prüft, ob der Wert im Array $arrForm unter 'formID' gespeicherte Wert geich dem in den Post-Daten unter 'form_id' übergebenen Wert ist. In der Tabelle gutscheincode wird hier gar nichts geprüft (Damit wir nicht aneinander vorbeireden, ich meinte die Codezeile, nicht den gesamten if-Codeblock!).

    Solange an den Post-Daten nichts verändert wurde ist das wohl immer gegeben und daher verstehe ich nicht, was Du hiermit erreichen willst. Insbesondere, da Du die Prüfung auf "in der Datenbank enthalten", die erst in den darauffolgenden Codezeilen gemacht wird, ja nur machst, wenn die Gleichheit gegeben ist.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard

    Puh - ich glaub jetzt muß kapitulieren und auf ein bezahltes Angebot zurückgreifen, das mir gemacht wurde.
    So wie es sicher sein sollte funktioniert es nicht weil die Tabelle nicht zugeordnet werden kann und die Methoden die funktionieren sind unsicher.
    Ich versehe absolut nicht wie ich den Teil hin bekomme, dass anhand der Übergabe des Feldes form_ID die Tabelle zugewiesen wird und mit der Auswahl abgeglichen.
    Denke ich muss mit dem Sicherheitsrisiko leben oder für einen "Profi" zaheln der weiß was er tut :-)

    Die Erweiterung ist genau diese: inspiredminds/contao-extended-form-fields
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

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

    Standard

    Es läßt mir keine Ruhe und ich will noch nicht kapitulieren ...
    Das funktioniert mit eben nur der Fehlermeldung, die in der Whitelist hinterlegt ist.
    Ist das sicher?
    PHP-Code:
    <?php

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

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){

    $tablenames = array("tl_an_testlauf");
    $tbl_name = \Input::post('tbl_name');
    if(
    in_array($tbl_name,$tablenames)) {
       
        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $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;     
      }
      }
    }
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

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

    Standard

    Habe den Code noch um eine Fehlermeldung erweitert wenn der Tabellennamen nicht passt bzw. manipuliert wurde
    PHP-Code:
    <?php

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

    class 
    Forms {

      public function 
    myValidateFormField(Widget $objWidget$intId$arrForm){

    $tablenames = array("tl_an_testlauf");
    $tbl_name = \Input::post('tbl_name');
    if(
    in_array($tbl_name,$tablenames)) {
       
        if (
    $arrForm['formID'] == \Input::post('form_id')) {
          if(
    $objWidget->name == 'gutscheincode'){
            
    $sql "SELECT * FROM $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;     
      } else
          
    System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen"__METHOD__TL_ERROR);
      
    $objWidget->addError('Die Tabelle konnte nicht zugeordnet werden!'); 
      return  
    $objWidget;
      }
    }
    Die Fehlermeldung kommt zwar bei jedem Feld, aber das kommt auch nur wenn jemand bösartig versucht etwas zu manipulieren.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

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

    Standard

    Das schaut für mich gut aus, weil Du den übergebenen Parameter gegen eine Whitelist prüfst.

    Wenn Du den Code, den Du schon ma hattest — nämlich Prüfen, ob $objWidget->Name gleich „gutscheincode“ noch ganz außen rum als Prüfung einfügst, dann sollte der Fehler auch nur beim Gutscheincode Feld kommen. Außerdem wird Deine Prüfung dann nicht — unnötig — bei allen Feldern erneut durchgeführt.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Multimedia

    Juchu :-)
    Die Abfrage ist doch drin in Zeile 17.
    Muss das da raus oder zusätzlich eine neue Abfrage rein?
    Verstehe nicht ganz was ich machen müßte um es vollens zu perfektionieren, das im optimalfall drei verschiedene Fehlermeldungen kommen
    1. Der Code ist ungültig
    2. Der Code wurde schon verwendet
    3. Die Tabelle konnte nicht zugeordnet werden
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

  14. #54
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Sizoberz Beitrag anzeigen
    Juchu :-)
    Die Abfrage ist doch drin in Zeile 17.
    Sorry, hatte ich vorhin nicht gesehen, war mobil unterwegs. Ich würde sie ganz außen rum machen, denn wenn das nicht gegeben ist, also nicht das gutscheincode-Widget geprüft wird, ist alles andere unnötig und die Methode kann sofort aufhören und $objWidget unverändert zurückgeben:


    PHP-Code:
    public function myValidateFormField(Widget $objWidget$intId$arrForm) { 

      
    // [1] early return, wenn es nicht um "unser Gutscheincode Widget" geht
      
    if($objWidget->name != 'gutscheincode') {
       return 
    $objWidget;
      } 

      
    $tablenames = array("tl_an_testlauf"); 

      
    $tbl_name = \Input::post('tbl_name');

      if (
    in_array($tbl_name$tablenames)) { 
        
        if (
    $arrForm['formID'] == \Input::post('form_id')) { // [2]
         
          
    $sql "SELECT * FROM $tbl_name WHERE gutscheincode=?";
          
    $result Database::getInstance()->prepare($sql)->execute($objWidget->value);
          if(
    $result->numRows 0) {
            
    $objWidget->addError('Dieser Gutschein-Code wurde schon verwendet!'); 
          }
        }
      } else {
          
    System::log("Konnte Tabellenname zu Formular-ID '$form_id' nicht bestimmen"__METHOD__TL_ERROR); // [3]
          
    $objWidget->addError('Die Tabelle konnte nicht zugeordnet werden!');  
      }
      
      return  
    $objWidget
    }

    // [1] Das ist "wichtig", denn sonst werden die folgenden Befehle (insbes. die Datenbankabfrage) für jedes Feld (Widget) 
    // des Formulars durchgeführt, was unnötig ist.
    // 
    // [2] die Notwendigkeit oder den Sinn dieser Prüfung verstehe ich immer noch nicht.
    // Du verwendest doch \Input::post('form_id') nirgends. Und wenn es zweingend glich 
    // $arrForm['formID'], warum würdest Du nicht gleich dieses verwenden?
    //
    // [3] Deine interne Fehlermeldung ist m.E. irritierend, weil Du nirgends versuchst, den Tabellennamen aus der $form_id zu bestimmen
    // Und die Fehlermeldung für den User sagt ihm nichts, denn er/sie weiß nicht, welche Tabelle warum nicht zugeordnet werden konnte
    // und was nun zu tun ist. 
    Verstehe nicht ganz was ich machen müßte um es vollens zu perfektionieren, das im optimalfall drei verschiedene Fehlermeldungen kommen
    1. Der Code ist ungültig
    2. Der Code wurde schon verwendet
    3. Die Tabelle konnte nicht zugeordnet werden
    Der erste Punkt sollte aus der Erweiterung kommen, die die Whitelist bereitstellt.



    Die folgenden beiden Punkte sollten aus Deinem Code kommen, wenn die Whitelist-Prüfung OK war, also keinen Fehler generiert hat.

    Wenn Du sagts, daß das so nicht funktioniert, kann ich Dir nicht sagen, warum. Das müsste ich lokal nachstellen
    Geändert von fiedsch (02.11.2019 um 13:51 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard

    So kommt immer die Whitelist Meldung selbst wenn ich einen noch freien gültigen Code eingebe.
    Aber das ist jetzt wirklich nur noch ein Schönheitsfehler mit dem ich leben kann. Solange alles funktioniert wie es soll und sicher ist.
    Wer die Unfreiheit des Willens fühlt, ist geisteskrank: wer sie leugnet, ist dumm.“ (Friedrich Nietzsche)

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
  •