vBulletin 5.1 - Eigener Hook Einstiegspunkt

  • Vbulletin gibt von sich aus eine Menge an Hook Einstiegspunkten vor, doch wenn man eine Textausgabe an einer bestimmten Stelle und nur in einem Template haben möchte, dann sind die vorhandenen Einstiegspunkte irgendwie unbrauchbar.

    Die vorgegebenen Hooks sind alle in der Datei hinterlegt:
    \vBulletin\core\includes\xml\hooks_vbulletin.xml

    Doch was macht man mit einem Hook wie "header_before_content", wenn man nur eine bestimmt Stelle innerhalb eines Templates möchte und nicht global und pauschal "header_before_content" oder "footer_before_body_end"?

    Laut Anleitung sollte man ja mit {vb:hook test} innerhalb eines Templates auf den Hook "test" zugreifen können. Allerdings kann man da Namen verwenden wie man lustig ist, im Addon Veriablen deklarieren und per register() oder preregister() registrieren, das bringt letztendlich alles nichts. Dieses "{vb:hook test}" bedeutet (frei gesagt, vielleicht liege ich aber auch falsch) nicht "hier den Hook mit dem Namen test einbinden", sondern "Hier ist der Einstiegspunkt mit dem Namen test". Es holt sich also nicht das Template an der Stelle die Daten vom Addon ist bindet sie ein, sondern das Addon nistet sich an der Stelle ein und zeigt die Daten an. Das ist also genau der umgekehrte Weg.

    Legt man im ACP ein neues Addon und dann einen neuen Hook an, dann wird man ja nach dem Einstiegspunkt gefragt und muss dieses auch auswählen. Nur die dortige Auswahl der Einstiegspunkte ist eben von vBulletin vorgegeben und lässt sich mit {vb:hook test} nicht beeinflussen.

    So, was aber bringt das dann überhaupt? Wie kommt man dennoch ans Ziel: Da gibt es wahrscheinlich zig Möglichkeiten. Keine Ahnung, ob mein Weg nun so überhaupt gedacht ist, aber er funktioniert zumindest.

    Dazu legt man im Addon, im Unterordner XML, einfach eine Datei an, die mit "hooks_" beginnt, dann den eindeutigen Namen des Add-Ons enthält und mit ".xml" endet, also z.B. hooks_helloworld.xml

    Darin werden dann die eigenen Einstiegspunkte festgelegt:

    HTML
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    
    <hooks>
        <hooktype type="helloworld">
            <hook>helloworld_hook_1</hook>
            <hook>helloworld_hook_2</hook>
            <hook>helloworld_hook_3</hook>
        </hooktype>
    </hooks>

    Somit gibt es hier also einen neuen Block namens "helloworld", der dann die drei hier festgelegten Hook Einstiegspunkte enthält. Wird das Addon aktiviert, dann sind diese Einstiegspunkte in der Auswahlliste, können dem Hook zugewiesen werden und können auch im Template mit z.B. {vb:hook helloworld_hook_1} verwendet werden!

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Sehr schön. Du scheinst dich ein bisschen mit Hooks auszukennen. Darum habe ich mich hier angemeldet. Leider ist der vB5-Support nicht ideal, um es mal vorsichtig auszudrücken. Ich will meinen ersten Hook erstelen. Ich bin eigentlich PHP-Progger und schreibe sowas normalerweise direkt in das Script. Aber wegen der Updates will ich es lieber auf die von vBulletin gedachte Art machen.

    Ich habe folgendes Problem:

    Ich will eine Grafik an eine bestimmte Stelle im Template onlineuser_details anzeigen lassen, falls ein bestimmter boolscher Wert true ist. Den Wert oder das Image-Tag möchte ich gern an das Template übergeben bzw. dort an einer bestimmten Stelle anzeigen lassen oder nicht. Es genügt, den boolschen Wert einmal beim Login zu setzen. Muss nicht laufend neu geprüft werden.

    Was ich im Netz an brauchbaren Beispielen gefunden habe, kapiere ich mangels Vergleichsmöglichkeiten nicht vollständig. Ich habe ein Beispiel gefunden, dass brauchbar scheint. Und zwar hier: *** URL-Filter ****

    Mein include-PHP-Script soll etwas prüfen. Am Ende enthält die Variable '$bool_ny' true oder false oder einfach etwas content, der im Template eingefügt werden soll. Je nachdem, was einfacher umzusetzen ist. Das Hook-System habe ich selbstverständlich vorher aktiviert.

    Meine zwei Fragen:

    1. Was muss ich dafür im AdminCP tun?
    2. Wie sähe die Anwendung des boolschen Wertes im Template aus?

    Ich habe folgendes getan:

    *** Link veraltet ***

    *** Link veraltet ***


    Eingefügt im Template ist das:

    Code
    <vb:if condition="$bool_ny">
    <img src="image.png">
    </vb:if>

    Mein PHP-Script abe ich zum Testen erstmal klein gehalten:

    PHP
    <?php
    echo true;
    ?>

    Aber das funktioniert leider nicht. Habe ich was falsch gemacht? Ich glaube, ich mache was grundelgendes falsch.

    Mich verwirrt auch die Frage nach dem Einstiegspunkt. Aus der unter AdminCP -> Hooks angebotenen Liste werde ich nicht schlau.

    Mir wäre evtl. auch mit einem vergleichbaren Beispiel sehr geholfen.

  • Hallo,

    also "ein bisschen auskennen" ist weit übertrieben!!! Das Hook-System von vb5 ist die reine Hölle. Aber Du bist schon mal auf das gleiche Problem gestoßen wie ich auch direkt am Anfang. Der Einstigspunkt, der gewählt werden muss. Diese Einstiegspunkte sind fest von VB vorgegeben. Mit denen kannst Du, wenn Du was an eine ganz bestimmte Stelle haben willst, aber nichts anfangen (genauso wie ich damals). Die vorhandenen Einstiegspunkte sind in den Templates ja alles schon fest vorgegeben und in der Regel dann auch auf allen Seiten. Du musst also einen eigenen Einstiegspunkt festlegen, den Du dann entsprechend in der Liste auswählen kannst. Wie ich das gemacht hatte steht oben. Ob das nun allerdings noch so geht, steht in den Sternen, denn mein Test von oben ist fast ein Jahr alt und danach habe ich mit Hooks nie wieder was gemacht. Leider kann ich da auch nicht mehr nachsehen, denn die Scripte sind nicht mehr vorhanden :(

    Bei meinem Versuch damals ging es eigentlich nur darum, die Statistiken auf der Startseite wieder zu haben, so wie bei vb4. Zwischenzeitlich sind die aber ja wieder offiziell in vb5.

    Für Deine Tests wäre es am einfachsten, wenn Du die externe Datei erst mal weg lässt und dann direkt etwas ausgibst mit z.B. "echo 'TEST';". Bei Deiner Auswahl "header_after_body_begin" müsste der Text also direkt nach dem <body>-Tag erscheinen.

    Ansonsten noch so als Anmerkung, was ich noch so im Kopf habe. Variablen, die im Addon definiert werden, also auch Dein $bool_ny, stehen im Template nicht zur Verfügung. Hier müsstest Du also mit "register()" oder "preregister" arbeiten um diese für das Template zu registrieren.

    Aber ich befürchte, Du wirst Dich da letztendlich genauso im Kreis drehen wie ich.

    Bzw, sehe da gerade noch was. Dein Code da oben in der Textarea gehört da gar nicht rein (oder wurde das schon wieder geändert), wenn das die Hook-Argumente sind. Bei denen gehören Definitionen rein, welche Variable aus dem Haupttemplate an welche aus dem Hook-Template übergeben werden.

    Schau Dir mal die Anleitung hier an, mit der hatte ich angefangen, ist nicht schlecht.
    *** Link veraltet ***

    Wenn man aber bedenkt, was das für ein Aufwand ist für ein "Hello World" (selbst ohne die Style-Eigenschaften), dann na danke ....

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Erstmal Danke, dass du so schnell geantwortet hast. Jetzt bin ich etwas klüger. Das mit dem register() hört sich brauchbar an. Ich habe ja an der Stelle bereits ein Image platziert, dass angezeigt wird, falls die Variable $bool_ny "true" ist. Das mit dem Text zum Testen mache ich genauso. Das funktioniert. Nur kapiere ich nicht, wie ich vBulletin diese Variable übergeben kann.

    Wie gesagt: Ich will beim Login die IP mit einer Liste vergleichen und falls die vorhanden ist, ein Image an der Stelle anzeigen lassen. Keine große Sache. Das PHP-Script schreibe ich in 5 Minuten. Aber wie löse ich das Problem mit der Variablen? Ich verstehe den Sinn des Einstiegspunktes zwar jetzt besser, aber da werde ich nichts damit anfangen können. Ich muss eine globale Variable einmal beim Login definieren. Dann habe ich gewonnen. Wie würdest du das lösen? Geht das überhaupt mit einem Hook? Sonst spare ich mir den Murks und gehe auf Scriptsuche.

  • Mit Hooks geht das sicherlich, aber das wird wohl sehr umständlich. Du musst das eigentliche Template bearbeiten, ein Addon erstellen. Einen Hook erstellen und dem das Addon zuweisen, dann brauchste noch ein Template für den Hook und den Einstiegspunkt auch noch, bei dem der Hook eben einsteigt. Wegen den Variablen. Wie gesagt, Du kannst vom normalen Template onlineuser_details Variablen an den Hook bzw. dessen Template übergeben. Nicht aber in die andere Richtung. Das Bild würde dann also auch nicht direkt im onlineuser_details sein, sondern als Fallentscheidung aus dem Addon kommen. Wie nun aber was wo genau, das ist die Frage und da bleibt nur testen übrig. Du willst die IP vom Login. Fraglich ist schon mal, ob die im VB-Object überhaupt mitgeführt wird, oder ob Du da schon im Login-Template eingreifen musst und dort eventuell die IP global definieren musst.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(