wie bekomme ich Hooks zum laufen??

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • MHuettmann
    Contao-Nutzer
    • 14.08.2009
    • 25

    #1

    wie bekomme ich Hooks zum laufen??

    Ich versuche nun schon eine ganze Weile, wie ich einen Hook benutzen kann?
    Bin da einfach zu doof dazu!
    Ich habe in der localconfig
    PHP-Code:
    $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('MyClass', 'getPageIdFromUrl');[ 
    
    eingefügt.
    Wo muß ich denn nun das MyClass.php anlegen und wie verändere ich darin den Namen der xy.html seite je nachdem von welcher Subdomain aus die Seite aufgerufen wird.
    Schnelle Hilfe wäre sehr willkommen!
  • BugBuster
    Wandelndes Contao-Lexikon
    • 15.06.2009
    • 10679

    #2
    Die MyClass.php muss in dein Modulverzeichnis.
    Ich selber habe mit diesem Hook noch nicht gearbeitet, aus der kurzen Beschreibung im Wiki kann ich nicht erkennen was genau da nun mit möglich ist.

    Ich würde mir daher den Inhalt von $arrFragments mal ansehen.
    Ich vermute mal, das du für deinen Zweck einen Teil des Arrays ersetzen müsstest.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

    Kommentar

    • MHuettmann
      Contao-Nutzer
      • 14.08.2009
      • 25

      #3
      Danke für den Hinweis.
      Selbst wenn ich in der Funktion nichts mache und sie so belasse wie in der Beschreibung des Developer-Handbuchs bekomme ich dann den Fehler
      Class 'MyClass' not found in system/libraries/system.php on line 144.

      Da hab ich aber gar nichts mit zu tun gehabt bis jetzt. Muß ich da noch irgendwo etwas definieren?

      Gibt es nicht irgendwo eine allgemeine Beschreibung wie so etwas gemacht werden muß. Ich habe nach langer Suche in Foren und Handbuch nichts gefunden!

      Kommentar

      • Antipitch
        Contao-Nutzer
        • 22.06.2009
        • 217

        #4
        <?php echo 'Begrüßung'; ?>
        wie BugBuster schon sagte, musst du ein Verzeichnis im Ordner root > system > modules anlegen (z.B. "myclass"), darin muss die Datei MyClass.php gespeichert sein. Und in der Datei muss sich natürlich auch eine entsprechende Klasse befinden (die eine TL Klasse erweitern kann/ sollte, deren Methoden du brauchst) und darin eine (public) Function wie im Wiki beschrieben.

        Bespiel MyClass.php:
        PHP-Code:
        <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
        
        class MyClass extends Backend // oder Frontend oder was immer
        {
            public function getPageIdFromUrl($arrFragments)
            {
                // irgendwas machen und dann Array unverändert oder manipuliert zurückgeben
                return array_unique($arrFragments);
            }
        }
        
        ?>

        Außerdem legst du in dem Modulverzeichnis ein weiteres Verzeichnis "config" an, in dem speicherst du eine Datei config.php. Die braucht nichts zu enthalten außer der Registrierung deiner Klasse.

        Beispiel config.php
        PHP-Code:
        <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
        
        $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('MyClass', 'getPageIdFromUrl');
        
        ?>

        Allet klar?


        cheers
        Antipitch
        "Some people, when confronted with a problem, think 'I know, I’ll use regular expressions.' Now they have two problems." Jamie Zawinski

        Kommentar

        • MHuettmann
          Contao-Nutzer
          • 14.08.2009
          • 25

          #5
          Danke Antipitch,
          das hat mich denke ich ein bißchen weiter gebracht.
          Leider bin ich zu unerfahren um es wirklich zum Laufen zu bringen.
          Er greift offensichtlich nun darauf zu, aber obwohl ich in der function nichts verändere und $arrFragments genauso zurückgebe wie ich ihn erhalte bekomme ich ständig die Fehlermeldung
          Cannot modify header information - headers already sent by (output started... config/config.php) in ... system/libraries/Template.php on line 174
          dort steht
          PHP-Code:
          header('Content-Type: ' . $this->strContentType . '; charset=' . $GLOBALS['TL_CONFIG']['characterSet']);
                  echo $this->strBuffer; 
          
          Das hat meines erachtens aber gar nichts damit zu tun, oder?
          Die config-Angaben mit der Globals['TL_HOOK'] definition, sind genau wie Du sie angegeben hast, bzw. sie ja auch in dem Dev-Handbuch angegeben sind übernommen worden.
          Laut meinem Verständnis will ich den Header ja noch gar nicht verändern, denn in der Funktion wird bisher nichts gemacht.
          Hast Du mir noch einen guten Tip?
          Gibt es evtl. eine einfachere Methode eine Kontakt-Seite, individuell zu gestalten, je nachdem von welcher Subdomain die Site aufgerufen wird? Sie dazu auch meine Anfrage individuelle Kontaktseite je nach Subdomain! auf die ich leider bisher keinen Response bekam.

          Sorry, hab noch was wichtiges vergessen: Fehler Declaration of MyClass getPageIdFrontUrl() should be compatible with that of Frontend getPageIdFrontUrl.
          außer der Definition der Funktion und rückgabe des $arrFragments steht aber in der Klasse gar nichts drin bis jetzt, so was fehlt denn da um compatible zu sein?
          Ich hoffe die Fragen sind nicht zu nervig!

          Danke!
          Gruß MHüttmann
          Zuletzt geändert von MHuettmann; 19.08.2009, 12:36.

          Kommentar

          • BugBuster
            Wandelndes Contao-Lexikon
            • 15.06.2009
            • 10679

            #6
            Cannot modify header information
            Hier wurde durch ein Fehler eine Ausgabe produziert bevor die Header Informationen zum Browser gesendet wurden, was bei TL ja erst dann passiert wenn die gesamte Seite generiert wurde.
            Ist damit also ein Folgefehler.

            Bei solch einer Meldung ist die Fehlermeldung davor / danach wichtig (weiß grad nicht wo die auftaucht).
            Grüße, BugBuster
            "view source" is your guide.
            Danke an alle Amazon Wunschlisten Erfüller

            Kommentar

            • BugBuster
              Wandelndes Contao-Lexikon
              • 15.06.2009
              • 10679

              #7
              Fehler Declaration of MyClass getPageIdFrontUrl() should be compatible with that of Frontend getPageIdFrontUrl.
              Ah, das habe ich gemeint.
              Nenne deine Funktin um, zb. "MygetPageIdFromUrl"
              und passe den neuen Namen auch in der config an.
              Grüße, BugBuster
              "view source" is your guide.
              Danke an alle Amazon Wunschlisten Erfüller

              Kommentar

              • MHuettmann
                Contao-Nutzer
                • 14.08.2009
                • 25

                #8
                Danke BugBuster,
                ich hab mit Deinem Hinweis und auch durch ändern des class MyClass extends auf Controller, statt Frontend den Fehler mit der kompatibilität gehandhabt. Aber egal auf welche weise ich es versuche der cannot modify header information - Fehler bleibt.
                Die Funktion arbeitet auch ohne Fehler und ändert das entsprechende arrFragment auch richtig um und gibt die Ausgabe korrekt zurück.
                Es wird auch, allerdings ohne korrekte Formatierung der richtige Inhalt wiedergegeben. Übersehe ich da etwas oder stimmt mein Denkansatz nicht.

                Ich habe eine normale Kontakt-Seite (kontakt.html laut Browser-URL), die über das Menü angesteuert wird.
                Wenn man nun über eine Subdomain auf die Site gekommen ist, soll beim klick auf Kontakt eine Seite xykontakt.html aufgerufen werden, wobei xy dem subdomain-Namen entspricht.
                Im Backend habe ich eine xykontakt - Seite angelegt und vom Menü versteckt.
                Durch die getPageIdformUrl verändere ich nun das kontakt in xykontakt.
                Die URL die im Browser angezeigt wird ändert sich nicht, aber der Inhalt entspricht der xykontakt-Seite, was wie gewünscht erfolgt. Dummerweise ist es aber nicht korrekt formatiert, da der oben erwähnte Fehler noch auftritt.
                Das gleiche passiert übrigens auch auf allen anderen Seiten, auch wenn über meine funktion gar nicht eingegriffen wird.
                Dummerweise gibt es auch keine Fehlermeldung mehr vor/nach der erwähnten.
                Was mache ich nun?

                Danke für die Mühe
                MHüttmann

                Kommentar

                • Antipitch
                  Contao-Nutzer
                  • 22.06.2009
                  • 217

                  #9
                  Moin,
                  poste hier mal deine Klasse (die komplette Datei).


                  cheers
                  Antipitch
                  "Some people, when confronted with a problem, think 'I know, I’ll use regular expressions.' Now they have two problems." Jamie Zawinski

                  Kommentar

                  • MHuettmann
                    Contao-Nutzer
                    • 14.08.2009
                    • 25

                    #10
                    Hier ist sie:
                    PHP-Code:
                    <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
                    
                    
                    class MyClass extends Controller // oder Frontend oder was immer 
                    { 
                        public function getPageIdFromUrl($arrFragments) 
                        { 
                    
                    //        print_r ($arrFragments);
                            $key = array_search('kontakt', $arrFragments);
                    //        echo "key= ".$key;
                            if ($key >= 0)
                              {
                                $subtemp = $this->Environment->host; 
                                   $pos = strpos($subtemp, "buon-acqua");
                                if ($pos > 0)
                                  {    
                                       $subdomain = substr($subtemp,0,$pos-1); 
                                  }
                                  else
                                  {
                                    $subdomain = "www";
                                  }    
                    //                echo "subtemp= ".$subtemp;
                    //                echo "subdomain= ".$subdomain;
                                $arrFragments[$key] = $subdomain.'kontakt'; 
                              }
                    //         print_r ($arrFragments);
                            return array_unique($arrFragments); 
                        } 
                    } 
                    
                    ?>

                    Kommentar

                    • BugBuster
                      Wandelndes Contao-Lexikon
                      • 15.06.2009
                      • 10679

                      #11
                      Und nochmal. Teste mal bitte:
                      Ändere diese Zeile in:
                      PHP-Code:
                      public function getMyPageIdFromUrl($arrFragments) 
                      
                      und in der config.php
                      PHP-Code:
                      $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('MyClass', 'getMyPageIdFromUrl'); 
                      
                      Grüße, BugBuster
                      "view source" is your guide.
                      Danke an alle Amazon Wunschlisten Erfüller

                      Kommentar

                      • MHuettmann
                        Contao-Nutzer
                        • 14.08.2009
                        • 25

                        #12
                        hallo BugBuster,
                        habe ich gemacht, aber das macht keinen Unterschied.

                        Was ich inzwischen auch rausgefunden habe und mich noch mehr verwirrt ist, wenn ich im Backend Fehlermeldungen einblenden aktiviere, dann wird die Funktion korrekt ausgeführt und die Seite auch mit dem richtigen Inhalt dargestellt, wie gewünscht, aber es erscheint der oben beschriebene Fehler und die Formatierung ist flöten und auch im Backend hab ich keine Chance mehr eine korrekte Seite zu bekommen.
                        Wenn ich das Fehlermeldungen einblenden deaktiviere, dann bekomme ich meine Website korrekt dargestellt, aber die Funktion scheint nur einmal zu greifen und die richtige Kontaktseite wird angezeigt, danach nicht wie-der.
                        Das wird für mich immer misteriöser, statt verständlicher.
                        Ist dieser Hook nicht die richtige Stelle für diese Aktion? Aber wenn nicht, wie kann ich sonst, das oben beschriebene Problem lösen?
                        Danke, daß Ihr noch mit macht!
                        Zuletzt geändert von MHuettmann; 19.08.2009, 20:03.

                        Kommentar

                        • MHuettmann
                          Contao-Nutzer
                          • 14.08.2009
                          • 25

                          #13

                          Danke an alle die mir geholfen haben.
                          Letztendlich, hat sich der Fehler als ein nicht sichtbares etwas nach dem ?> in der config.php herausgestellt. Als ich dies gelöscht habe, war der Fehler weg.
                          Ich habe aber gelernt, wie man Hooks benutzt und welche Variationsmöglichkeiten es gibt.
                          Es klappt sowohl mit dem Original-Name getPageIdfromUrl, als extend von Controller oder Frontend, wie auch mit mygetPageIdfromUrl.

                          Noch mal danke für Eure Hilfe, habe einiges gelernt und denke weiterhin, daß ich mich mit Typolight für das richtige CMS entschieden habe.

                          Liebe Grüße
                          MHuettmann

                          Kommentar

                          • Antipitch
                            Contao-Nutzer
                            • 22.06.2009
                            • 217

                            #14
                            Hi MHuettmann,
                            dergleichen hatte ich mir schon gedacht (deshalb meine Bitte die ganze Datei zu posten ;-).

                            Ich würde denken, dass solche Vorhaben wie (grob geahnt) deines tendenziell besser über DNS Einträge, Startpunkte etc. regelbar sind, aber es gibt ja mitunter spezielle Anforderungen und das
                            habe einiges gelernt und denke weiterhin, daß ich mich mit Typolight für das richtige CMS entschieden habe.
                            ist doch wenigstens mal'n vernünftiger Abschluss für einen Thread.


                            cheers
                            Antipitch
                            "Some people, when confronted with a problem, think 'I know, I’ll use regular expressions.' Now they have two problems." Jamie Zawinski

                            Kommentar

                            Lädt...