Wie HOOKS anlegen unter Contao 4?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • juju
    Contao-Fan
    • 02.09.2009
    • 307

    #1

    4.4.x 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
  • fiedsch
    Contao-Urgestein
    • 09.07.2009
    • 3074

    #2
    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

    Kommentar

    • juju
      Contao-Fan
      • 02.09.2009
      • 307

      #3
      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

      Kommentar

      • juju
        Contao-Fan
        • 02.09.2009
        • 307

        #4
        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

        Kommentar

        • fiedsch
          Contao-Urgestein
          • 09.07.2009
          • 3074

          #5
          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

          Kommentar

          • juju
            Contao-Fan
            • 02.09.2009
            • 307

            #6
            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

            Kommentar

            • juju
              Contao-Fan
              • 02.09.2009
              • 307

              #7
              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

              Kommentar

              • juju
                Contao-Fan
                • 02.09.2009
                • 307

                #8
                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,[B][COLOR="#FF0000"]$arrFields,[/COLOR][/B]$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

                Kommentar

                • juju
                  Contao-Fan
                  • 02.09.2009
                  • 307

                  #9
                  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

                  Kommentar

                  • folkfreund
                    Contao-Urgestein
                    • 09.04.2010
                    • 1928

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

                    Ich hab selbst aber auch noch nicht damit experimentiert.

                    Kommentar

                    • juju
                      Contao-Fan
                      • 02.09.2009
                      • 307

                      #11
                      Hallo folkfreund,

                      danke für Deine Antwort!

                      Sehe ich mir an

                      Viele Grüße
                      juju

                      Kommentar

                      • fiedsch
                        Contao-Urgestein
                        • 09.07.2009
                        • 3074

                        #12
                        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.
                        Zuletzt geändert von fiedsch; 14.04.2019, 15:56.
                        Contao-Community-Treff Bayern: http://www.contao-bayern.de

                        Kommentar

                        • juju
                          Contao-Fan
                          • 02.09.2009
                          • 307

                          #13
                          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

                          Kommentar

                          • fiedsch
                            Contao-Urgestein
                            • 09.07.2009
                            • 3074

                            #14
                            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

                            Kommentar

                            Lädt...