Contao-Camp 2024
Ergebnis 1 bis 14 von 14

Thema: Wie HOOKS anlegen unter Contao 4?

  1. #1
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Frage Wie HOOKS anlegen unter Contao 4?

    Hallo,

    ich versuche seit Tagen eine Antwort oder eine Beschreibung zu finden, wie und wo genau HOOKS unter Contao 4.4 angelegt werden müssen. Ich habe einen funktionierenden HOOK in Contao 3.5.38 und möchte diesen nun in die 4.4.38 übernehmen.

    Die alte (funktionierende) Struktur ist ja:
    Code:
    system/modules/modulname/config/autoload.php
    system/modules/modulname/config/config.php
    system/modules/modulname/MeineKlasse.php
    ... und funktioniert so offensichtlich nicht mehr.

    In der config.php steht folgendes:
    Code:
    // config.php
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('MeineKlasse.php', 'myPrepareFormData');
    und in der MeineKlasse.php:
    Code:
    // MeineKlasse.php
    ...
    
    namespace contao
    
    class myPrepareFormData($arrSubmitted,$arrLabels,$objForm)
    {
        ... mein code, um je nach Auswahl in einem select an verschiedene Empfänger zu verschicken ...
    }
    Ich würde mich freuen, wenn mir jemand einen Hinweis gäbe, ob und wie das nach /src/ oder /src/AppBundle/ oder /app/Resources/contao/ o.ä. muss und welche Dateien notwendig sind - Löschen des Prod-Caches ist natürlich klar . Gern auch einen Link zu einem Dokument, indem ich das selbst erlesen kann. Diverse Forums-Beiträge, Folien und Videos haben mir leider nicht weiter geholfen.

    Danke und viele Grüße
    juju

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

    Standard

    Zitat Zitat von juju Beitrag anzeigen
    Hallo,

    ich versuche seit Tagen eine Antwort oder eine Beschreibung zu finden, wie und wo genau HOOKS unter Contao 4.4 angelegt werden müssen. Ich habe einen funktionierenden HOOK in Contao 3.5.38 und möchte diesen nun in die 4.4.38 übernehmen.
    Da war aber zum Teil auch unter Contao 3.x schon manches "falsch":


    In der config.php steht folgendes:
    Code:
    // config.php
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('MeineKlasse.php', 'myPrepareFormData');
    Das sollte

    PHP-Code:
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('MeineKlasse''myPrepareFormData'); 
    sein. Angegeben wird nicht der Name der PHP-Datei (MeineKlasse.php) sondern der Klassenname (MeineKlasse; ggf. noch um den Namespace erweitert)


    und in der MeineKlasse.php:
    Code:
    // MeineKlasse.php
    ...
    
    namespace contao
    class myPrepareFormData($arrSubmitted,$arrLabels,$objForm)
    {
        ... mein code, um je nach Auswahl in einem select an verschiedene Empfänger zu verschicken ...
    }
    Der Namespace wäre Contao (mit großem C) und myPrepareFormData ist die function. Die class müsste MeineKlasse gewesen sein.

    Ich nehme an, die Fehler sind entstanden, als Du Deinen Code für den Forumpost zusammengestellt hast. Ohne den wirklichen Code wir es aber schwer, Dir zu sagen, was Du ändern musst.

    Prinzipiell sollten Contao 3 Module unter Contao 4 noch funktionieren, wenn man sie (wie Du) unter system/modules bereitstellt.

    Danach den Cache neu aufbauen hast Du nicht vergessen?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Danke für Deine Antwort.

    Das mit der Klasse und dem ".php" in der config.php ist mir auch grad aufgefallen und war per Hand in den Post geschrieben und nicht direkt aus den Dateien kopiert - sorry.

    Es heißt natürlich
    Code:
    //config.php
    $GLOBALS['TL_HOOKS']['prepareFormData'][] = array('MeineKlasse', 'myPrepareFormData');
    und
    Code:
    // MeineKlasse.php
    ...
    
    namespace Contao
    
    class MeineKlasse
    {
         public function myPrepareFormData($arrSubmitted,$arrLabels,$objForm)
        {
            ... mein code, um je nach Auswahl in einem select an verschiedene Empfänger zu verschicken ...
        }
    }
    In den echten Dateien stimmte das schon alles.

    Und ja, der Cache (nicht der Seitencache) ist neu aufgebaut. Trotzdem keine Reaktion.

    Danke und Grüße
    juju

  4. #4
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Und hier der Vollständigkeit halber auch nochmal der ganze code aus der MeineKlasse.php, obwohl der ja wie gesagt im alten System funktioniert.
    Code:
    // MeineKlasse.php
    
    namespace Contao;
    
    class MeineKlasse
    {
    
        public function myPrepareFormData($arrSubmitted,$arrLabels,$objForm)
        {
            // forms to be used
            if($objForm->id == 5 || $objForm->id == 6)
            {
                // send mail depending on selection
                switch ($arrSubmitted['type'])
                {
                    case '1': $objForm->subject = "Betreff 1";
                                 $objForm->recipient = 'empfaenger1@domain.de';
                                 break;
                                                    
                    case '2': $objForm->subject = "Betreff 2";
                                 $objForm->recipient = 'empfaenger2@domain.de';
                                 break;
                                                    
                    case '3': $objForm->subject = "Betreff 3";
                                 $objForm->recipient = 'empfaenger3@domain.de';
                                 break;
                }
    
            }        
            
        }
    }
    Die Module aus der 3.5. werden in /mein-contao-ordner/system/modules/ gelegt, richtig? Nicht in /mein-contao-ordner/web/system/modules/

    Danke und Grüße
    juju

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

    Standard

    Das schaut auf den ersten Blick soweit richtig aus. "funktioniert nicht" heißt: es werden keine E-Mails verschickt?

    Das könnte mehrere Gründe haben.

    Hast Du schon einmal probiert, in der myPrepareFormData() noch außerhalb des if() ein System::log() einzubauen, um zu sehen, ob die myPrepareFormData() überhaupt aufgerufen wird? Vielleicht passt ja alles, aber in deiner neuen Installation sind die IDs (5 und 6 im Beispiel anders -- z.B. weil Du Formulare neu anlelegt hast).
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  6. #6
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Doch, das Kontaktformular wird an den im Formulargenerator eingestellten (Standard-)Empfänger gesendet und der HOOK greift nicht, um gemäß Auswahl an abweichende Empfänger zu versenden.

    Ich habe zwar an den Formularen nichts geändert, aber das mit dem logging ist ein guter Tipp. Werde ich gleich testen und mich zurück melden.

    Tausend Dank schon mal und Grüße
    juju

  7. #7
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    OK. Das bringt mich schon mal einen Schritt weiter

    $objForm liefert offensichtlich weder eine id, noch lässt sich dadurch der Betreff oder der Empfänger vor dem Versenden ändern.

    Werde weiter forschen, wie ich das unter 4.4 so zum Laufen bekomme wie unter der 3.5.

    Oder hättest Du noch so einen wertvollen Tipp?

    Danke und Grüße
    juju

  8. #8
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Noch ein wenig Recherche und es stellte sich heraus, dass der prepareFormData-Hook jetzt 4 statt 3 Parameter besitzt. Mein Code muss daher wie folgt lauten:
    Code:
    // MeineKlasse.php
    
    namespace Contao;
    
    class MeineKlasse
    {
    
        public function myPrepareFormData($arrSubmitted,$arrLabels,$arrFields,$objForm)
        {
            // forms to be used
            if($objForm->id == 5 || $objForm->id == 6)
            {
                // send mail depending on selection
                switch ($arrSubmitted['type'])
                {
                    case '1': $objForm->subject = "Betreff 1";
                                 $objForm->recipient = 'empfaenger1@domain.de';
                                 break;
                                                    
                    case '2': $objForm->subject = "Betreff 2";
                                 $objForm->recipient = 'empfaenger2@domain.de';
                                 break;
                                                    
                    case '3': $objForm->subject = "Betreff 3";
                                 $objForm->recipient = 'empfaenger3@domain.de';
                                 break;
                }
    
            }        
            
        }
    }
    Ich bin Dir sehr dankbar für Deine samstägliche Hilfe!

    Ein schönes Wochenende
    juju

  9. #9
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Nachdem mein akutes Problem gelöst ist, würde mich ja doch noch die Überschrift dieses Posts interessieren. Auch wenn 3.5er Module weiterhin unter der 4.4 funktionieren, möchte ich ja gern zukunftssicher arbeiten und die neuen Strukturen der 4er Version lernen und verwenden.

    Hat jemand einen Tipp, wo ich eine Doku oder Beispiele dazu finde, wie, wo und welche Dateien unter Contao 4 angelegt werden müssen? Ich hab leider nichts konkretes dazu finden können.

    Muss ich evtl. den Ordner /src/AppBundle/ anlegen, dort die config.php wie gehabt in einen Unterordner /config/ legen und die Klasse entweder direkt in /src/AppBundle/ oder einen eigenen Unterordner /classes/? Brauche ich eine autoload.php?

    Danke und viele Grüße
    juju

  10. #10
    Contao-Urgestein Avatar von folkfreund
    Registriert seit
    09.04.2010.
    Beiträge
    1.928

    Standard

    Vielleicht hilft dir das Contao4DummyBundle weiter: https://github.com/Sioweb/Contao4DummyBundle

    Ich hab selbst aber auch noch nicht damit experimentiert.

  11. #11
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo folkfreund,

    danke für Deine Antwort!

    Sehe ich mir an

    Viele Grüße
    juju

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

    Standard

    Das betrifft aber die Erstellung eines eigenen Bundles, welches über composer installiert werden würde.

    Wenn es Dir "nur" um Änderungen für eine Contao-Installation geht ist für Dich das hier evtl. interessanter: https://gist.github.com/joergmoldenh...02760e4506b86a

    Der Namespace Acme\TestBundle in Jörgs Beispiel kann natürlich auch AppBundle sein, womit wir bei Deiner Frage aus #9 wären.

    Edit: src/Acme/TestBundle/Elements, src/Acme/TestBundle/Resources/contao/templates und src/Acme/TestBundle/Resources/contao/languages würdest Du bei Deiner Hook-Fragestellung auch nicht benötigen. Dafür dann vielleicht einen Ordner src/Acme/TestBundle/Hooks in dem die MeineKlasse.php leiegen könnte, die dann im namespace Acme\TestBundle\Hooks wäre.
    Geändert von fiedsch (14.04.2019 um 15:56 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  13. #13
    Contao-Fan
    Registriert seit
    02.09.2009.
    Beiträge
    307

    Standard

    Hallo Fiedsch,

    bzgl. des Hooks geht es mir nur um Änderungen an Contao. Also werd ich mir auch Jörgs Beispiel ansehen.

    Ursprünglich wäre ich ja davon ausgegangen, dass sowas in /app/Resources/contao/ gehört.

    Danke und Grüße
    juju

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

    Standard

    Zitat Zitat von juju Beitrag anzeigen
    Ursprünglich wäre ich ja davon ausgegangen, dass sowas in /app/Resources/contao/ gehört.
    Das sollte auch gehen, aber das wäre wohl der "Legacy-Weg" Contao 3 Code unter Contao 4 zu unterstützen. Mit dem oben angesprochenen Weg bist Du schon einen Schritt weiter in Richtung "Contao 4 Style". (Wie Du siehst, viele Anführungszeichen in meiner Erklärung, also wahrscheinlich begrifflich nicht ganz korrekt).
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

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
  •