MetaModels Workshop in Berlin
Ergebnis 1 bis 12 von 12

Thema: Mit dem Hook "prepareFormData" ein Formular-Feld hinzufügen

  1. #1
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard Mit dem Hook "prepareFormData" ein Formular-Feld hinzufügen

    Hallo,

    ich bitte um euren Rat bei folgender Sache:

    Ich möchte mit dem Hook "prepareFormData" vor dem Versenden eines E-Mail-Kontaktformulars ein Feld zum Formular hinzufügen.

    Mein bisheriger Ansatz:

    In der "config.php" meines Modules:
    Code:
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('MyClass', 'myPrepareFormData');
    In der Datei "MyClass.php":
    Code:
    <?php
    
    namespace Contao;
    
    class MyClass
    {
    
        public function myPrepareFormData($arrSubmitted,$arrLabels,$arrFields,$objForm)
        {
    
             $arrSubmitted['deadline'] = strtotime('+1 hour', $arrSubmitted['tstamp']);
    
             $text = "";
             foreach ($arrSubmitted as $key => $value) {
    	    $text .= $key.": ".$value."\n";
             }
             $email = new \Email(); 
             $email->subject = 'Nachricht per Website-Kontaktformular'; 
             $email->text = $text; 
             $email->sendTo('meinemail@mail.com');  
        }
    }
    Diese Lösung funktioniert grundsätzlich.
    Jedoch darf der Redakteur im Contao-Backend beim Formular die Checkbox "Per E-Mail versenden" nicht aktivieren –
    da die Mail ja im Hook versendet wird.

    ... gibt es keinen Hook der bereits vor dem Versenden des Formulars per E-Mail eingreift?
    ... und würdet ihr das generell auch so lösen wie ich es gemacht habe, oder geht das eleganter?

    Vielen Dank im Voraus für eure Tipps!

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.553
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von thesweetg Beitrag anzeigen
    ... gibt es keinen Hook der bereits vor dem Versenden des Formulars per E-Mail eingreift?
    Ja, prepareFormData .

    Mach einfach
    PHP-Code:
    $objForm->sendViaEmail false
    in deinem Hook.

  3. #3
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Danke – das ist clever.

    Nun bin ich auf ein weiteres Problem gestoßen:
    Ich möchte in der Hook-Methode eine Datenbankabfrage ausführen.

    Ein einfaches
    Code:
    $this->import('Database');
    in der Methode reicht da nicht – das erzeugt einen Fehler.
    Ich nehme an ich muss mit der Hook-Klasse eine Contao-Klasse erweitern.
    Etwa so in der Art:
    Code:
    class MyClass extends \Contao
    ... liefert jedoch leider auch einen Fehler

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.553
    User beschenken
    Wunschliste

    Standard

    Wir können nicht helfen, wenn du nicht schreibst, was für ein Fehler überhaupt aufttritt.

  5. #5
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Es erscheint die Standard-Contao-Fehlerseite im Frontend.

    Unter "var/logs" steht dann folgendes:
    Code:
    [2019-05-22 16:34:03] request.INFO: Matched route "contao_frontend". {"route":"contao_frontend","route_parameters":{"_token_check":true,"_controller":"Contao\\CoreBundle\\Controller\\FrontendController::indexAction","_scope":"frontend","alias":"assistent/template1-kopie","_route":"contao_frontend"},"request_uri":"http://huebscher/assistent/template1-kopie?s1=a&s2=t","method":"POST"} []
    [2019-05-22 16:34:03] security.INFO: Attempting SimplePreAuthentication. {"key":"frontend","authenticator":"Contao\\CoreBundle\\Security\\ContaoAuthenticator"} []
    [2019-05-22 16:34:04] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\ClassNotFoundException(code: 0): Attempted to load class \"Contao\" from the global namespace.\nDid you forget a \"use\" statement? at /Users/lissabon/Dropbox/Themes/huebscher/system/modules/assistant/modules/HuebscherFormHooks.php:10)"} []
    ... brauch ich ein "use"-Statement?

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.553
    User beschenken
    Wunschliste

    Standard

    Was für ein Fehler passiert bei
    PHP-Code:
    $this->import('Database'); 
    ?

  7. #7
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Die Klasse hier:
    Code:
    <?php
    
    namespace Contao;
    
    class MyClass
    {
        public function myPrepareFormData($arrSubmitted,$arrLabels,$arrFields,$objForm)
        {
             $this->import('Database'); 
        }
    }
    ... führt zur Fehlermeldung "Es ist ein Fehler aufgetreten" im Frontend.

    In der Log-Datei steht dann folgendes:
    Code:
    [2019-05-23 10:03:59] request.INFO: Matched route "contao_frontend". {"route":"contao_frontend","route_parameters":{"_token_check":true,"_controller":"Contao\\CoreBundle\\Controller\\FrontendController::indexAction","_scope":"frontend","alias":"assistent/template1-kopie","_route":"contao_frontend"},"request_uri":"http://huebscher/assistent/template1-kopie?s1=a&s2=t","method":"POST"} []
    [2019-05-23 10:03:59] security.INFO: Attempting SimplePreAuthentication. {"key":"frontend","authenticator":"Contao\\CoreBundle\\Security\\ContaoAuthenticator"} []
    [2019-05-23 10:03:59] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\UndefinedMethodException(code: 0): Attempted to call an undefined method named \"import\" of class \"Contao\\HuebscherFormHooks\". at /Users/lissabon/Dropbox/Themes/huebscher/system/modules/assistant/modules/HuebscherFormHooks.php:18)"} []
    Wenn ich in der obigen Klasse das "$this->import('Database');" weglasse, taucht der Fehler nicht mehr auf.

  8. #8
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Der Versuch hier:
    Code:
    <?php
    
    namespace Contao;
    
    class MyClass  extends \Contao
    {
        public function myPrepareFormData($arrSubmitted,$arrLabels,$arrFields,$objForm)
        {
             $this->import('Database'); 
        }
    }
    ... führt zu folgendem Fehler:
    Code:
    [2019-05-23 10:09:31] request.INFO: Matched route "contao_frontend". {"route":"contao_frontend","route_parameters":{"_token_check":true,"_controller":"Contao\\CoreBundle\\Controller\\FrontendController::indexAction","_scope":"frontend","alias":"assistent/template1-kopie","_route":"contao_frontend"},"request_uri":"http://huebscher/assistent/template1-kopie?s1=a&s2=t","method":"POST"} []
    [2019-05-23 10:09:31] security.INFO: Attempting SimplePreAuthentication. {"key":"frontend","authenticator":"Contao\\CoreBundle\\Security\\ContaoAuthenticator"} []
    [2019-05-23 10:09:31] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\ClassNotFoundException(code: 0): Attempted to load class \"Contao\" from the global namespace.\nDid you forget a \"use\" statement? at /Users/lissabon/Dropbox/Themes/huebscher/system/modules/assistant/modules/HuebscherFormHooks.php:10)"} []

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.553
    User beschenken
    Wunschliste

    Standard

    "Contao" ist keine Klasse, nur ein Namespace.

    Die Funktion "import" ist in der Klasse \Contao\System definiert. Also wenn dann müsstest du zumindest von dieser Klasse extenden.

    Der korrekte Weg wäre aber die Datenbankverbindung per Dependency Injection zu holen.

  10. #10
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    OK, danke für die Erklärung.

    Mit:
    Code:
    <?php
    
    namespace Contao;
    
    class MyClass  extends Backend
    {
        public function myPrepareFormData($arrSubmitted,$arrLabels,$arrFields,$objForm)
        {
             $this->import('Database'); 
        }
    }
    ... funktionierts jetzt.

    Wie das mit der Dependency Injection funktioniert, versteh ich leider noch nicht ganz.
    Muss mich da erst einlesen

  11. #11
    Contao-Nutzer
    Registriert seit
    22.06.2017.
    Beiträge
    181

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    "Contao" ist keine Klasse, nur ein Namespace.

    Die Funktion "import" ist in der Klasse \Contao\System definiert. Also wenn dann müsstest du zumindest von dieser Klasse extenden.

    Der korrekte Weg wäre aber die Datenbankverbindung per Dependency Injection zu holen.
    Wie wäre der von Dir vorgeschlagene Weg mittels DI?

  12. #12
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    446

    Standard mp_forms und neues Feld für die Zusammenfassung vorm Absenden

    Ich weiß, dass hier etwas anderes behandelt wird, trotzdem wage ich zu fragen.

    Ich brauche ein Feld, um die in der Sitzung gespeicherten Daten auf der letzten Seite vorm Absenden auszugeben. Die Diskussion dazu findet ihr hier.

    Ich möchte fragen, ob jemand vielleicht einen Ansatz weiß und beschreiben könnte?

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
  •