Globale Template-Variable?

  • Hallo,


    wie kann ich es bewerkstelligen, dass auf jeder (!) Seite eine bestimmte Datei mit eingebunden wird, ohne dass Update-Gefährdete Dateien geändert werden?
    Es geht darum, dass eine Template-Variable global zur Verfügung stehen muss.


    Danek vorab für eure Infos.

  • Hallo bonuscommunity,


    wenn es nur darum geht, dass eine Template-Variable verfügbar ist, also definiert werden soll, könntest Du auf shouldDisplay@StructuredTemplate einen EventListener setzen, der dem Template die Variable via WCF::getTemplate()->assign() (oder auch $eventObj->assign()) zuweist.

  • Es geht darum, dass eine Template-Variable global zur Verfügung stehen muss.

    Das kannst du mit einer Option realisieren. Die kannst du via ACP oder Option Klasse ändern und dann in allen Templates ansprechen.

  • Gut, es ist bereits ein Paket vorhanden, wo ich etwas ändern möchte.


    SQL
    INSERT INTO `wcf1_event_listener` (`listenerID`, `packageID`, `environment`, `eventClassName`, `eventName`, `listenerClassFile`, `inherit`, `niceValue`) VALUES
    (374, 133, 'user', 'StructuredTemplate', 'shouldDisplay', 'lib/system/event/listener/StructuredTemplateFacebookListener.class.php', 0, 0);


    Aber der Eventlistener wird nicht aufgerufen, aus welchem Grund auch immer. Muss man das noch wo anders definieren, damit er aufgerufen wird?

  • Wieso willst du per SQL einen Eventlistener einfügen? Dafür gibt es das Eventlistener-PIP ;)

    "A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP" — Leonard Nimoy

  • Das ist auf viele Arten problematisch:

    • Du setzt von Hand eine listenerID, dies wird von der Datenbank automatisch übernommen ("AUTO_INCREMENT")
    • Eventlistener sollten immer mit der korrekten packageID des Paketes ausgestattet werden, da diesen auch mitliefert
    • Bei einer Deinstallation des Plugins wird der Eintrag u.U. nicht korrekt entfernt (s.oben)


    Wenn du das Paket später einmal wieder installieren möchtest, fehlt dir der Eventlistener. Und Nein, man erinnert sich nicht mehr an so scheinbar unbedeutende Dinge, die vor 3 Monaten oder länger waren ;)

    Alexander Ebert
    Senior Developer WoltLab® GmbH

  • ID wurde automatisch vergeben und richtige Paket-ID ist auch angegeben.
    Ich werde es gleich mal mit dem Evenlistener-PIP probieren, aber mal sehen, ob es dann klappt.

  • Hallo bonuscommunity,


    [...] aber mal sehen, ob es dann klappt.

    Ich nehme an, dass Du, als Du den EventListener einfach nur in die Datenbank eingefügt hast, nicht auch noch die enstprechende Cache-Datei gelöcht hast, was aber nötig gewesen wäre, da die Eventlistener gecacht werden. Aber das PIP ist dafür je gedacht und erspart Dir zusätzlich dann auch noch das Cache-Löschen - neben allen anderen Vorteilen ;).

  • Achso, okay. Aber ich finde es dauert länger, die gnazen Archive zusammen zu stellen, als das kurz in der Datenbank zu machen.


    *edit*
    Also, installiert ... Datie vorhanden, Eintrag in der DB-Tabelle vorhanden, jedoch wird der Listener nicht angesprochen?


  • Achso, okay. Aber ich finde es dauert länger, die gnazen Archive zusammen zu stellen, als das kurz in der Datenbank zu machen.


    Dennoch ändert es nichts an der Tatsache, dass es "falsch" ist, etwas manuell zu ändern.

  • Mh, kein Aufruf des Listeners.



    Sollte ja auch richtig sein, oder? Steht ja dann richtig in der Datenbank und File ist auch da.

  • Hallo bonuscommunity,


    hast Du denn mal eine Testausgabe vor der Überprüfung der Options (MODULE_FACEBOOK, FACEBOOK_APPID und FACEBOOK_SECRET) versucht? Vielleicht liegt es ja daran.

  • Hab's, hatte blöderweise im <plugin> was falsches stehen.


    Aber welche Methode wird denn bei jedem Seitenaufruf eingelesen? Sozusagen readData() generell.


    Gibt es darüber eine Übersicht oder so etwas? Die auf woltlab-wiki ist ja sehr bescheiden.

  • shouldDisplay@StructuredTemplate wird *immer* aufgerufen! Wie bereits erwähnt, entferne "<inherit>1</inherit>" und es sollte einwandfrei funktionieren.

    Alexander Ebert
    Senior Developer WoltLab® GmbH

  • Ja, es geht mir aber mittlerweile um:


    Es wird ein Facebook-Login z.Zt. nur bei readData@UserLogin ausgeführt, jedoch sollte dies auf jeder Seite möglich sein.


    Danke für die bisherige Hilfe ;).

  • Wieso auf jeder Seite? Nimm die Quick-Loginbox (s. unten) raus und belass den Login auf der Loginseite.


    • Suche in "header.tpl" nach
      id="loginButton"


    • Ersetze es durch
      id="loginButtonNone"


    • Speichere das Template in einer eigenen Templategruppe, da sonst die Änderung bei einem Update weg sein könnte oder ein Update nicht richtig ausgeführt werden kann