Contao-Camp 2024
Ergebnis 1 bis 5 von 5

Thema: [GELÖST] Haste Formular auswerten

  1. #1
    Contao-Nutzer
    Registriert seit
    28.09.2017.
    Beiträge
    4

    Standard [GELÖST] Haste Formular auswerten

    Hallo zusammen,

    ich beschäftige mich seit gestern mal wieder mit der Entwicklung von Modulen in Contao.
    Im Frontend sollen über ein Formular erstmal Daten übergeben werden können.
    Das funktioniert soweit auch schon, ich nutze dafür die Haste Erweiterung, erstmal vielen Dank, super Modul!

    Allerdings habe ich ein paar Fragen, ob es so überhaupt richtig und im Sinne des Erfinders ist.
    Und wenn ich nach dem Absenden des Formulares die Seite aktualisiere, wird der selbe Inhalt nochmal in die Datenbank eingetragen, das ist sicherlich eine Kleinigkeit, aber ich sehe gerade den Wald vor lauter Bäumen nicht, vielleicht kann mir ja jemand einen Denkanstoss geben?

    Hier mal mein Code:

    PHP-Code:
    <?php

    class ModuleKundenmeinungenEntry extends Module
    {
        
    /**
         * Template
         * @var string
         */
        
    protected $strTemplate 'mod_kundenmeinungen_entry';

        
    /**
         * Compile the current element
         */
        
    protected function compile()
        {
            
            
    $objForm = new \Haste\Form\Form('kundenmeinung_data''POST', function($objHaste) {
                
    $kundenmeinungModel = new kundenmeinungen\KundenmeinungenModel();
                
    $kundenmeinungModel->setRow(array
                (
                  
    'vorname' => $_POST['vorname'],
                  
    'nachname' => $_POST['nachname'],
                  
    'email' => $_POST['email'],
                  
    'bewertung' => $_POST['bewertung'],
                ));
                
    $kundenmeinungModel->save();

                echo 
    "<pre>";
                
    print_r($_POST);
                echo 
    "</pre>";
                
            return \
    Input::post('FORM_SUBMIT') === $objHaste->getFormId();
        });

        
    $objForm->addFieldsFromDca('tl_kundenmeinungen', function(&$strField, &$arrDca) {

            
    // make sure to skip elements without inputType or you will get an exception
            
    if($arrDca['inputType'] == 'fileTree' || !isset($arrDca['inputType'])) {
             return 
    false;
          }
          
    // add anything you like
          
    if ($strField == 'myField') {
              
    $arrDca['eval']['mandatory'] = true;
          }
          
    // you must return true otherwise the field will be skipped
          
    return true;
        });
          
    $objForm->addFormField('file_upload', array(
               
    'label'         => 'Datei-Upload',
               
    'inputType'     => 'upload',
               
    'eval'          => array('extensions'=>'jpg,jpeg,gif,png,pdf''storeFile'=>true'uploadFolder'=>"62685902-a38f-11e7-a280-1c1b0d42aeef"'doNotOverwrite' => true'maxlength' => 2048000)
          ));
          
    $objForm->addFormField('submit', array(
            
    'label'     => 'Submit form',
            
    'inputType' => 'submit'
          
    ));
        
    $objForm->addContaoHiddenFields();
        
    $objForm->addSubmitFormField('submit''Submit form');
        
    $objForm->addCaptchaFormField('captcha');
          if (
    $objForm->validate()) {
          
    $arrData $objForm->fetchAll();
          }
          
    $this->Template->form $objForm->generate();
        }
    }
    Ist das setRow() so richtig, oder sollte man das irgendwie anders verwenden?

    An der Stelle mit dem "uploadFolder" weiß ich selbst, dass ich die ID noch auslesen muss, habe mich aber noch nicht weiter mit beschäftigt, wird sicherlich in der Doku irgendwo zu finden sein.

    EDIT: Das mit dem Refresh habe ich nun über $this->reload(); gelöst.
    EDIT2: Hm, wenn ich das $this->reload(); nutze, dann wir der FileUpload anscheinend unterbrochen, kann mir dazu jemand etwas sagen?

    Grüße,
    Kai
    Geändert von KaiS (29.09.2017 um 11:22 Uhr)

  2. #2
    Contao-Nutzer
    Registriert seit
    28.09.2017.
    Beiträge
    4

    Standard

    Hallo,

    hier mal mein aktueller Code...

    PHP-Code:
    <?php

    class ModuleKundenmeinungenEntry extends Module
    {
        
    /**
         * Template
         * @var string
         */
        
    protected $strTemplate 'mod_kundenmeinungen_entry';

        
    /**
         * Compile the current element
         */
        
    protected function compile()
        {
            
    $uploadFolder $GLOBALS['TL_CONFIG']['kundenmeinungen_upload_dir'];
            
    $objForm = new \Haste\Form\Form('kundenmeinung_data''POST', function($objHaste) {
                
    $kundenmeinungModel = new kundenmeinungen\KundenmeinungenModel();
                if(isset(
    $_POST['submit'])) {
                        
    $kundenmeinungModel->setRow(array
                        (
                          
    'vorname' => $_POST['vorname'],
                          
    'nachname' => $_POST['nachname'],
                          
    'email' => $_POST['email'],
                          
    'bewertung' => nl2br($_POST['bewertung']),
                        ));
                        
    $kundenmeinungModel->save();
                        
    //$this->reload();
                    
    }
            return \
    Input::post('FORM_SUBMIT') === $objHaste->getFormId();
        });

        
    $objForm->addFieldsFromDca('tl_kundenmeinungen', function(&$strField, &$arrDca) {
            if(
    $arrDca['inputType'] == 'fileTree' || !isset($arrDca['inputType'])) {
             return 
    false;
          }
          return 
    true;
        });
          
    $objForm->addFormField('file_upload', array(
               
    'label'         => 'Datei-Upload',
               
    'inputType'     => 'upload',
               
    'eval'          => array('extensions'=>'jpg,jpeg,gif,png,pdf''storeFile'=>true'uploadFolder'=> $uploadFolder'doNotOverwrite' => true'maxlength' => 2048000)
          ));
        
    $objForm->addCaptchaFormField('captcha');
        
    $objForm->addSubmitFormField('submit''Submit form');
          if (
    $objForm->validate()) {
          
    $arrData $objForm->fetchAll();
          }
          
    $this->Template->form $objForm->generate();
        }
    }
    Also die Daten werden nun in der Datenbank eingetragen.
    Die ID für uploadFolder bekomme ich über die TL_CONFIG.

    Das $this->reload(); habe ich auskommentiert, weil sonst die Datei nicht mehr hochgeladen wird, allerdings würde ich das schon gerne nutzen, da man sonst beim refresh der Seite die Daten doppelt einträgt und hochlädt.
    Ich hoffe mir kann an dieser Stelle nun jemand weiterhelfen.

    Vielen Dank schon mal.

    EDIT: ... Manchmal einfach mal kurz abschalten, was anderes machen und es klappt. Wenn ich die Datei selbst nach dem Upload verarbeitet mit "move_uploaded_file", geht es natürlich.
    Geändert von KaiS (29.09.2017 um 11:03 Uhr)

  3. #3
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.466
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
    <?php

    class ModuleKundenmeinungenEntry extends Module
    {
        
    /**
         * Template
         * @var string
         */
        
    protected $strTemplate 'mod_kundenmeinungen_entry';

        
    /**
         * Compile the current element
         */
        
    protected function compile()
        {
            
    $uploadFolder $GLOBALS['TL_CONFIG']['kundenmeinungen_upload_dir'];

            
    $objForm = new \Haste\Form\Form('kundenmeinung_data''POST', function($objHaste) {
                return \
    Input::post('FORM_SUBMIT') === $objHaste->getFormId();
            });

            
    $objForm->addFieldsFromDca('tl_kundenmeinungen', function(&$strField, &$arrDca) {
                if (
    $arrDca['inputType'] == 'fileTree' || !isset($arrDca['inputType'])) {
                    return 
    false;
                }
                return 
    true;
            });

            
    $objForm->addFormField('file_upload', array(
                
    'label'         => 'Datei-Upload',
                
    'inputType'     => 'upload',
                
    'eval'          => array('extensions'=>'jpg,jpeg,gif,png,pdf''storeFile'=>true'uploadFolder'=> $uploadFolder'doNotOverwrite' => true'maxlength' => 2048000)
            ));

            
    $objForm->addCaptchaFormField('captcha');
            
    $objForm->addSubmitFormField('submit''Submit form');

            
    // Das Model an das Formular binden
            
    $kundenmeinungModel = new kundenmeinungen\KundenmeinungenModel();
            
    $objForm->bindModel($kundenmeinungModel);

            
    // Hier prüft haste ob das Formular abgeschickt wurde und alle Felder
            // valid sind.
            
    if ($objForm->validate()) {
                
                
    // Das Model enthält jetzt die Daten vom Formular und kann gespeichert
                // werden.
                
    $kundenmeinungModel->save();
                
                
    // Jetzt kannst du reloaden
                
    \Controller::reload();
            }
            
            
    $this->Template->form $objForm->generate();
        }
    }
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

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

    Standard

    Das Beispiel von Toflar lädt zwar die Seite neu, aber danach ist das Formular immer noch ausgefüllt und kann dadurch immer und immer wieder versendet werden. Wie bekomme ich statt des Formulars eine Bestätigung ("Vielen Dank") angezeigt?
    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

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

    Standard

    Befülle das Template einfach innerhalb von if ($objForm->validate()) { mit einem anderen Inhalt.

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
  •