Contao-Camp 2024
Ergebnis 1 bis 8 von 8

Thema: "Ungültige Auswahl" bei Haste\Form\Form select-Feld

  1. #1
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.788

    Fehler "Ungültige Auswahl" bei Haste\Form\Form select-Feld

    Auf meiner Testseite http://development.schachbund.de/pre...netschach.html bekomme ich nach dem Abschicken des Formulars trotz ausgewählter Option im SELECT-Feld eine Fehlermeldung "Ungültige Auswahl". Das SELECT-Feld wird mit jQuery und Chosen und UI/Autocomplete und Ajax betrieben. Beispiel: mind. 2 Buchstaben eingeben, Name auswählen, restliche Felder füllen und abschicken.
    Im POST-Request ist das SELECT-Feld "name" ausgefüllt. Trotzdem kommt "ungültige Auswahl".

    PHP-Code für das Formular:
    PHP-Code:
        protected function compile()
        {

            
    // Der 1. Parameter ist die Formular-ID (hier "linkform")
            // Der 2. Parameter ist GET oder POST
            // Der 3. Parameter ist eine Funktion, die entscheidet wann das Formular gesendet wird (Third is a callable that decides when your form is submitted)
            // Der optionale 4. Parameter legt fest, ob das ausgegebene Formular auf Tabellen basiert (true)
            // oder nicht (false) (You can pass an optional fourth parameter (true by default) to turn the form into a table based one)
            
    $objForm = new \Haste\Form\Form('internetschachform''POST', function($objHaste)
            {
                return \
    Input::post('FORM_SUBMIT') === $objHaste->getFormId();
            });
            
            
    // URL für action festlegen. Standard ist die Seite auf der das Formular eingebunden ist.
            // $objForm->setFormActionFromUri();
        
            
    $elemente = array
            (
                
    '1' => 'eins',
                
    '2' => 'zwei',
                
    '3' => 'drei',
                
    '4' => 'vier',
            );
                
            
    $objForm->addFormField('pid', array(
                
    'inputType'     => 'hidden',
                
    'default'       => $this->internetschach
            
    ));
            
    $objForm->addFormField('name', array(
                
    'label'         => 'Spieler suchen und wählen',
                
    'inputType'     => 'select',
                
    //'selected'      => array('1'),
                //'options'       => array_keys($elemente),
                //'reference'     => $elemente,
                
    'eval'          => array('mandatory'=>true'class'=>'form-control select-box')
            ));
            
    $objForm->addFormField('email', array(
                
    'label'         => 'E-Mail',
                
    'inputType'     => 'text',
                
    'eval'          => array('mandatory'=>true'rgxp'=>'email''class'=>'form-control')
            ));
            
    $objForm->addFormField('chessbase', array(
                
    'label'         => 'ChessBase-Benutzername',
                
    'inputType'     => 'text',
                
    'eval'          => array('mandatory'=>true'class'=>'form-control')
            ));
            
    $objForm->addFormField('description', array(
                
    'label'         => 'Bemerkungen',
                
    'inputType'     => 'textarea',
                
    'eval'          => array('mandatory'=>false'rte'=>'tinyMCE''class'=>'form-control')
            ));
            
    // Submit-Button hinzufügen
            
    $objForm->addFormField('submit', array(
                
    'label'         => 'Anmeldung abschicken',
                
    'inputType'     => 'submit',
                
    'eval'          => array('class'=>'btn btn-primary')
            ));
            
    $objForm->addCaptchaFormField('captcha');

            
    // Ausgeblendete Felder FORM_SUBMIT und REQUEST_TOKEN automatisch hinzufügen.
            // Nicht verwenden wenn generate() anschließend verwendet, da diese Felder dort standardmäßig bereitgestellt werden.
            
    $objForm->addContaoHiddenFields();
            
            
    // validate() prüft auch, ob das Formular gesendet wurde
            
    if($objForm->validate())
            {
                
    // Alle gesendeten und analysierten Daten holen (funktioniert nur mit POST)
                
    $arrData $objForm->fetchAll();
                
    self::saveAnmeldung($arrData); // Daten sichern
                // Seite neu laden
                
    \Controller::addToUrl('send=1'); // Hat keine Auswirkung, verhindert aber das das Formular erneut ausgefüllt ist
                
    \Controller::reload(); 
            }

            
    // Javascript ergänzen
            
    $javascript ='
    <script type="text/javascript">
      $("select.select-box").chosen();
      $(\'.chosen-search input\').autocomplete({
        delay: 500,
        minLength: 2,
        autoFocus: false,
        position: { my : "right top", at: "right bottom" },
        source: function(request, response) {
          $.ajax({
            url: "bundles/contaointernetschach/Spielerliste.php?pid='
    .$this->internetschach.'&q="+request.term,
            dataType: "json",
            success: function(data) {
              $(\'select.select-box\').empty();
              response($.map(data, function(item) {
                $(\'select.select-box\').append(\'<option value="\'+item.id+\'">\' + item.name + \'</option>\');
              }));
              $("select.select-box").trigger("chosen:updated");
              //$(".chosen-search input").val(request.term);
            }
          });
        }
      });
    </script>
    '
    ;

            
    // Template ausgeben
            
    $this->Template = new \FrontendTemplate($this->strTemplate);
            
    $this->Template->class "ce_internetschach";
            
    $this->Template->content $objForm->generate().$javascript;

            return;

        } 
    Was muß ich insbesondere bei
    PHP-Code:
            $objForm->addFormField('name', array(
                
    'label'         => 'Spieler suchen und wählen',
                
    'inputType'     => 'select',
                
    //'selected'      => array('1'),
                //'options'       => array_keys($elemente),
                //'reference'     => $elemente,
                
    'eval'          => array('mandatory'=>true'class'=>'form-control select-box')
            )); 
    ändern, damit die Fehlermeldung nicht mehr kommt? Mit mandatory = false klappte es auch nicht.

    EDIT: Ich habe eine Vermutung. Übergebe ich die Optionen bereits in der Funktion addFormField ist alles in Ordnung. Die nachträglich mit JS reingeworfenen Optionen werden immer mit "Ungültige Auswahl!" quittiert. Wahrscheinlich aus Schutz vor Hackern. Ich muß also eine Möglichkeit finden, die Validierung für das Element abzuschalten.
    Geändert von Samson1964 (07.05.2020 um 13:38 Uhr)
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  2. #2
    Contao-Nutzer
    Registriert seit
    23.05.2012.
    Beiträge
    89

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    EDIT: Ich habe eine Vermutung. Übergebe ich die Optionen bereits in der Funktion addFormField ist alles in Ordnung. Die nachträglich mit JS reingeworfenen Optionen werden immer mit "Ungültige Auswahl!" quittiert. Wahrscheinlich aus Schutz vor Hackern. Ich muß also eine Möglichkeit finden, die Validierung für das Element abzuschalten.
    Hallo, ich stehe vor einem sehr ähnlichen Problem. Ich fülle mein Select-Input ebenfalls per Javascript mit Optionen, was auch bei mir zur Fehlermeldung „Ungültige Auswahl!“ führt. Vermutlich, weil die Optionen bei einem Abgleich mit den im System hinterlegten Optionen nicht übereinstimmen.

    Hast Du eine Möglichkeit gefunden die Validierung für ein Select-Feld auszuhebeln?

  3. #3
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.788

    Standard

    Ja. Ich habe auf Haste/Form verzichtet und mir meine eigene Formklasse schnell zusammengebastelt. Da spielt es keine Rolle, was aus dem Frontend kommt.
    Siehe https://github.com/Samson1964/contao...s/Formular.php.
    Ist nicht die beste Lösung. Aber ich habe hier keine Antwort bekommen und im Haste/Form-Code nichts gefunden.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  4. #4
    Contao-Nutzer
    Registriert seit
    23.05.2012.
    Beiträge
    89

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    Ja. Ich habe auf Haste/Form verzichtet und mir meine eigene Formklasse schnell zusammengebastelt. Da spielt es keine Rolle, was aus dem Frontend kommt.
    Siehe https://github.com/Samson1964/contao...s/Formular.php.
    Ist nicht die beste Lösung. Aber ich habe hier keine Antwort bekommen und im Haste/Form-Code nichts gefunden.
    Danke für die Info. Ich habe es jetzt wie folgt gelöst:

    Ich übertrage die Auswahl per Javascript nach einem change-event in ein unsichtbares input (input type=hidden) und setze beim Klick auf den Absenden-Button das ursprüngliche select wieder auf den Default-Wert. Der User bekommt davon nichts mit:

    /* Hidden input-field */
    $terminSelect.on('change', function() {
    $('input[name=Wunschtermin]').val(this.value);
    });

    /* Erst beim Senden Select zurücksetzen, damit das System keinen Fehler wirft */
    $('form button[type=submit]').click(function(){
    $terminSelect.val('');
    });

    Ist vermutlich etwas hacky, tut es aber für mich.

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

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    EDIT: Ich habe eine Vermutung. Übergebe ich die Optionen bereits in der Funktion addFormField ist alles in Ordnung. Die nachträglich mit JS reingeworfenen Optionen werden immer mit "Ungültige Auswahl!" quittiert. Wahrscheinlich aus Schutz vor Hackern. Ich muß also eine Möglichkeit finden, die Validierung für das Element abzuschalten.
    Ich verrstehe das so: Du übergibst keine Options und sagst nicht wie das Feld zu validieren ist. Daher sind die Optionen leer und es erfolgt eine Standard-Validierung der Form: "ist die übermittelte Option in der Liste der Optionen enthalten, dann OK, sonst nicht". Das ergibt bei Dir dann immer false.

    Eine Option könnte sein, einen eigenen Validator anzugeben (https://github.com/codefog/contao-ha...eld-validation), der immer true den eingegebenen Wert zurück gibt.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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

    Standard

    Du kannst ja einfach die Optionen für das Select dynamisch befüllen.

    Ein eigener Validator funktioniert denke ich nicht, da die Überprüfung, ob der Wert gültig ist, trotzdem noch statt findet, soweit ich weiß.

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.788

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du kannst ja einfach die Optionen für das Select dynamisch befüllen.
    Das hatte ich doch versucht. Beispiel:

    In PHP gebe ich statisch die Werte vor
    PHP-Code:
    $elemente = array
    (
        
    '1' => 'eins',
        
    '2' => 'zwei',
        
    '3' => 'drei',
        
    '4' => 'vier',
    ); 
    Im Frontend ergänze ich dynamisch mit Javascript:
    HTML-Code:
    <option value="5">fünf</option>
    <option value="6">sechs</option>
    <option value="7">sieben</option>
    Die Einträge 5, 6 und 7 werden aber nicht vom Validator akzeptiert, weil sie vorher nicht (statisch) vorhanden waren. Durch diese Eigenschaft des Validators ist es mir unmöglich, eine Autovervollständigung im Frontend per AJAX zu machen, weil die damit hinzugefügten Datensätze (neue "values") nicht akzeptiert werden.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

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

    Standard

    Ich meinte dynamisch per PHP natürlich.

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
  •