Ergebnis 1 bis 8 von 8

Thema: Contao 5.x - Forms FORM_SUBMIT

  1. #1
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard Contao 5.x - Forms FORM_SUBMIT

    Hallo,

    ich versuche gerade meine Gästebuch Erweiterung auf Contao 5 anzuheben und stolpere darüber, dass Code wie der folgende unter C5 ja nicht mehr unterstützt wird:
    Code:
    if ($this->Input->post('FORM_SUBMIT') == 'tl_guestbook') {
    ...
    Nach langem Suchen - auch auf Slack - bin ich auf den Ansatz gestoßen ggf. mittels :
    Code:
    $formData = System::getContainer()->get('request_stack')->getCurrentRequest()->getSession();
    		
    $strWebsite = $formData->get('contao.form.data')->getValue()['???'];
    zu versuchen an die Formulardaten zu kommen ... aber wie erhalte ich
    Code:
    FORM_SUBMIT
    ?

    Ich weiß, dass Gästebücher ein Relikt aus der Vergangenheit und megaout sind, aber bei uns haben sich im Laufe der Zeit über 570 - auch aktuelle Einträge - angesammelt, so dass ich es noch nicht einstampfen möchte.
    Außerdem wäre damit auch das o.g. grundsätzliche Problem nicht gelöst.

    Danke für jede Hilfestellung - Georg

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

    Standard

    PHP-Code:
    use Contao\System;

    $request System::getContainer()->get('request_stack')->getCurrentRequest();

    if (
    'tl_guestbook' === $request->request->get('FORM_SUBMIT')) {
        
    // ...

    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Hallo Spooky,

    vielen Danke für Deine Hilfe, Dein snippet funktioniert leider noch nicht ganz. Ein Test mit
    Code:
    $request = System::getContainer()->get('request_stack')->getCurrentRequest();
    dd($request->request->get('FORM_SUBMIT'));
    ergibt "null"....

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

    Standard

    Wo führst du diesen Code denn überhaupt aus?
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Moin Spooky,

    der Code dient zum Auslesen der einzelnen Felder des Formulars für neue Gästebucheinträge.
    Ich habe das ganze jetzt simpel mit
    PHP-Code:
    Input::post('...'
    gelöst, z.B.
    Code:
     // Add comment
            if (Input::post('FORM_SUBMIT') == 'tl_guestbook' && !$doNotSubmit) {
                $this->addGbEntry();
                // Pending for approval
                if ($this->gb_moderate) {
                    $_SESSION['TL_GUESTBOOKENTRY_ADDED'] = true;
                }
                $this->reload();
            }
    Damit kann ich auch die anderen Formularfelder auslesen und ins Gästebuch wegschreiben ...

    Leider habe ich noch ein anderes Problem:

    Beim Auslesen der Gästebucheinträge aus der Tabelle "tl_guestbook" fliegt mir unter Contao 5.2.4 der Datenbankzugriff um die Ohren ...
    Code:
     /** * Generate module */
        protected function compile() {
            $limit = null;
            $arrComments = array();
            $hasBackendUser = System::getContainer()->get('contao.security.token_checker')->hasBackendUser();
            // Pagination
            if ($this->gb_perPage > 0) {
                $page = Input::get('page') ? Input::get('page') : 1;
                $limit = $this->gb_perPage;
                $offset = ($page - 1) * $this->gb_perPage;
                // Get total number of comments
                $objTotal = $this->Database->prepare("SELECT COUNT(*) AS count FROM tl_guestbook" . (!$hasBackendUser ? " WHERE published=1" : "")) ->execute($this->id);
                // Add pagination menu
                $objPagination = new Pagination($objTotal->count, $this->gb_perPage);
                $this->Template->pagination = $objPagination->generate("\n ");
            }
            // Get all published comments
            $gbEntriesStmt = $this->Database->prepare("SELECT * FROM tl_guestbook" . (!$hasBackendUser ? " WHERE published=1" : "") . " ORDER BY date" . (($this->gb_order == 'descending') ? " DESC" : ""));
            if ($limit) {
                $gbEntriesStmt->limit($limit, $offset);
            }
            $gbEntries = $gbEntriesStmt->execute($this->id);
    Das führt zur Fehlermeldung:
    Code:
    request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\DriverException: "An exception occurred while executing a query: SQLSTATE[HY093]: 
    Invalid parameter number: number of bound variables does not match number of tokens" 
    at /Users/georg/Sites/stina.luetten-dieks.eu/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php line 117 {"exception":"[object]
    Die Tabelle sieht folgendermaßen aus:
    Code:
      // Fields
        'fields' => array (
            'id' => array (
    		'sql'                     => "int(10) unsigned NOT NULL auto_increment"
    	),
            'name' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['name'],
                ...
                'sql'                     => "varchar(128) NOT NULL default ''"
            ),
            'email' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['email'],
                ...
                'sql'                     => "varchar(128) NOT NULL default ''"
            ),
            'place' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['place'],
                ...
                'sql'                     => "varchar(128) NOT NULL default ''"
            ),
            'website' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['website'],
                ...
                'sql'                     => "varchar(128) NOT NULL default ''"
            ),
            'titel' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['titel'],
                ...
                'sql'                     => "varchar(128) NOT NULL default ''"
            ),
            'message' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['message'],
                ...
                'sql'                     => "text NULL"
            ),
            'comment' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['comment'],
               ...
                'sql'                     => "text NULL"
            ),
    	'date' => array (
    	    'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['date'],
                'sql'                     => "int(10) unsigned NOT NULL default '0'"
    	),
    	'tstamp' => array (
      	   'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['tstamp'],
    	
               'sql'                     => "int(10) unsigned NOT NULL default '0'"
    	),
            'published' => array (
                'label'                   => &$GLOBALS['TL_LANG']['tl_guestbook']['published'],
                ...
                'sql'                     => "char(1) NOT NULL default ''"
            )
        )
    Unter Contao 4.13.32 funktioniert das noch einwandfrei. Die Doctrine Bundles liegen doch unter 4.13.32 und 5.2.4 in der gleichen Version vor, daher wundert mich das ein wenig.

    Meine 5.2.4 Experimente laufen lokal unter MAMP Pro mit mysql 5.7.39, die aktive Website läuft bei All-Inkl mit Maria DB 10.5.22. Kann das evtl. der Grund sein?

    Der Code des GB wird den Contaoexperten sicherlich das blanke Grauen ins Gesicht treiben, allerdings stammt es noch aus der Contao 2/3 Welt der Vorsymfonyzeit.
    Habe das ganze vor Jahren mal in ein Contao 4 Bundle umgebaut, der Code ist im wesentlichen aber erhalten geblieben ....

    Bin für jeden Tip dankbar!

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

    Standard

    Du übergibst bei "execute()" einen Parameter, verwendest diesen Parameter in deinen Queries jedoch nicht.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Fan Avatar von Seefahrer
    Registriert seit
    20.12.2012.
    Ort
    Wurster Nordseeküste
    Beiträge
    276

    Standard

    Danke Spooky ... Die Queries stammen noch aus dem Urcode.

    Ich habe
    Code:
    $this->Id
    jetzt gelöscht, und jetzt funktioniert es soweit ...

    ... allerdings erhalte ich jetzt bei Absenden des Formulars für einen neuen Eintrag die Meldung:

    Code:
    Das Request-Token konnte nicht validiert werden.
    und damit wird kein neuer Eintrag abgelegt ...

    Unter 4.13.32 funktioniert das noch, oh je ....


    Tante Edit meint, dass es an der Cache-Einstellung der betreffenden Seite liegt ... habe die separaten Cache-Zeiten abgeschaltet und das Problem scheint gelöst, jetzt läuft das GB unter Contao 5.2.4
    Geändert von Seefahrer (22.10.2023 um 13:46 Uhr)

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

    Standard

    Für POST Requests brauchst du (ggf.) ein gültiges CSRF Token. Siehe auch https://docs.contao.org/dev/framework/request-tokens/
    » sponsor me via GitHub or PayPal or Revolut

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
  •