XF1.x <xen:callback> - PHP-Code in XenForo-Templates einbetten

Ein kurzer Überblick darüber, wie man PHP-Code in XenForo-Templates verwenden kann

  1. rellek

    rellek Bekanntes Mitglied

    rellek hat eine neue Ressource erstellt:

    <xen:callback> - PHP-Code in XenForo-Templates einbetten - Ein kurzer Überblick darüber, wie man PHP-Code in XenForo-Templates verwenden kann

    Weitere Informationen zu dieser Ressource...
     
    szymme und Maestro2k5 gefällt das.
  2. Haddawas

    Haddawas Bekanntes Mitglied Lizenzinhaber

    als Parameter lässt sich aber auch ein Array übergeben? (du arbeitest in den Beispielen nur mit Strings)
    wenn man das Array dann verändert zurückgibt, sollten doch nachfolgende Stellen im Template, welche drauf zugreifen, die modifizierte Variante nutzen, oder?
     
  3. rellek

    rellek Bekanntes Mitglied

    Dann hilf mir auf die Sprünge: Wie geht das? In thread_view vor dem <ol hab ichs hiermit versucht:

    Code (Text):
    <xen:callback class="XenDACH_XenCallbackTag_SimpleCallback" method="getArray">{$posts}</xen:callback>
    <ol class="messageList" id="messageList">
    und damit:

    Code (Text):
    <xen:callback class="XenDACH_XenCallbackTag_SimpleCallback" method="getArray">{xen:raw $posts}</xen:callback>
    <ol class="messageList" id="messageList">
    Die Methode getArray sieht so aus:
    PHP:
        public static function getArray($array) {
           
            var_dump($array);
           
        }
    Versuch 1 ("{$posts}") machte eine Fehlermeldung, dass htmlspecialchars einen String und kein Array haben will. Versuch 2 ("{xen:raw $posts}") gab einen String bestehend aus 5 Zeichen aus - nämlich "Array".
     
  4. Haddawas

    Haddawas Bekanntes Mitglied Lizenzinhaber

    das war ja meine Frage, ob ein Array auch geht ;)
    und eben wenn ja, ob/wie es dann gehandhabt wird, in deiner FAQ bist du nur auf die Rückgabe eines Array eingegangen
    weitere Frage, geht mehr als ein Parameter?

    btw vielleicht mit getArray(&$array) ?
     
  5. rellek

    rellek Bekanntes Mitglied

    Gut, dann einigen wir uns auf "wahrscheinlich nicht", jedenfalls ist mir bislang kein Weg bekannt, mit dem es geht. &$array brachte die Fehlermeldung, dass man einen String die Funktion gerne eine Referenz hätte, aber einen Wert bekommt.

    Was man machen kann, ist die Funktion um das Attribute params erweitern. Dann benötigt man einen zweiten Parameter in der Klasse. Damit kann man dann auch auf Arrays zugreifen - aber nur lesend. Auch hier hilft es nicht, das Array als Referenz haben zu wollen, weil nunmal nur ein Wert übergeben wird.

    Die Funktion sähe dann so aus (Achtung, das kann den Browser einfrieren lassen):
    PHP:
    public static function getArray($content, $params) {
         return var_dump($params, 1);
    }
    und der Template-Aufruf so:
    Code (Text):
    <xen:callback class="XenDACH_XenCallbackTag_SimpleCallback" method="getArray" params="{xen:raw $posts}">Hier gibts ohnehin nur Text</xen:callback>
    Auf die Weise kannst du dann auch mehrere eigene Parameter angeben, die du mit {xen:array} zusammenbauen kannst. Aber auch hier gilt: Die gibt es in der Klasse nur lesend.
     
  6. Haddawas

    Haddawas Bekanntes Mitglied Lizenzinhaber

    ok, danke
     
  7. tocheli

    tocheli Aktives Mitglied Lizenzinhaber

    hmm, ich möchte ein banner einblenden. den html code zum darstellen des banners generiere ich mit einer php funktion aus der db. das funktioniert. mit test programm sieht der erzeugte code so aus:
    Code (Text):
    <div id="logo"><a target="_blank" href="http://www.maximum-surf.de"><img src="http://www.surfbasar.ch/forum/data/hite/images/65_88_maximum-surf2_468x60.gif" alt="Klick auf das Banner um zu der Homepage zu gelangen" title="Klick auf das Banner um zu der Homepage zu gelangen" border="0" width="468" height="58"></a></div>
    den aufruf mach ich im template "footer":
    Code (Text):
    <xen:callback class="HiTe_SimpleCallback" method="getSimpleOutput">XenForo ist cool</xen:callback>
    wenn ich im browser den quelltext der forumsseite anschaue ist der bannercode wie gewollt eingefügt. Das sieht so aus:
    Code (Text):
    <div class="footer">
        <div class="pageWidth">
            <div class="pageContent">
            <div id="logo"><a target="_blank" href="http://www.maximum-surf.de"><img src="http://www.surfbasar.ch/forum/data/hite/images/65_88_maximum-surf2_468x60.gif" alt="Klick auf das Banner um zu der Homepage zu gelangen" title="Klick auf das Banner um zu der Homepage zu gelangen" border="0" width="468" height="58"></a></div>
           
                <dl class="choosers">
               
                        <dt>Style</dt>
                        <dd><a href="misc/style?redirect=%2Fforum%2F" class="OverlayTrigger Tooltip" title="Style auswählen" rel="nofollow">xenFoogle</a></dd>
     
    soweit so gut, funktioniert tipptopp, wie in der anleitung von rellek.
    nur leider wird das banner nicht angezeigt.
    hab ich was vergessen?
     
  8. tocheli

    tocheli Aktives Mitglied Lizenzinhaber

    oh mannoooo. adblock plus war das problem....
    das banner war wohl auf dem adblock plus index.
    adblock plus deaktiviert und funktioniert tipptopp!
    sorry für die störung!!!
     
    pjfry gefällt das.
  9. Stefan

    Stefan Bekanntes Mitglied Lizenzinhaber

    Wie kann ich denn dem PHP-Script die aktuelle User-ID mitgeben? Weil so gehts leider nicht:

    <xen:callback class="XenDACH_XenCallbackTag_SimpleCallback" method="getSimpleOutput">{$user.user_id}</xen:callback>

    bzw. wie muss ich dann in de PHP-Datei darauf zugreifen (weil so klappt es nicht public static function getSimpleOutput($user_id) {
    ... )? Danke für jeden Tipp!

    Und gibt es noch ein Tipp, wie ich auf die Datenbank per PHP zugreifen kann, ohne großartig eine neue Datenbank per mysql_connect zu verbinden?
     
  10. ragtek

    ragtek Gast

    Zugriff auf den AKTUELLEN Benutzer hat man IMMER über
    PHP:

    XenForo_Visitor::getInstance();
     
    Und das Db Objekt bekommt man über
    PHP:

    XenForo_Application::getDb();
     
     
    McAtze gefällt das.
  11. Stefan

    Stefan Bekanntes Mitglied Lizenzinhaber

    Und wie müsste dann eine einfache Datenbankabfrage aussehen? Weil das geht schon mal nicht:

    PHP:
    XenForo_Application::getDb();
            $test = mysql_query("select * from xenforo2.xf_user_field_value") or die ('Fehler');    
    Muss ich erst eine xenforo Datei einbetten oder wo bekomme ich dafür eine Anleitung? Sorry bin da noch nicht so fit drin, wird aber hoffentlich bald :)
     
  12. ragtek

    ragtek Gast

  13. Stefan

    Stefan Bekanntes Mitglied Lizenzinhaber

    Klasse, so gehts! DANKE!
     
  14. MFT

    MFT Aktives Mitglied Lizenzinhaber

    Hallo und vielen Dank für das Tutorial,
    ich konnte mir damit nun ein einfaches Script ins Template holen. Aber nun weiß ich nicht weiter, wie bekomme ich innerhalb des Scriptes Zugriff auf Variablen aus XEN. Zum Beispiel:
    PHP:
    <xen:if is="{$forum.parent_node_id} == x">
    This content will show in forums of parent x?
    </xen:if>
    Wie bekomme ich es hin in dem Script zu wissen in welchem Forum ich mich befinde?

    Vielen Dank
     
  15. MFT

    MFT Aktives Mitglied Lizenzinhaber

    Hallo,
    ich hab weiteren Fortschritt zu vermelden :happy:
    Ob angemeldet lässt sich so herausfinden:
    Code (Text):
    if ( XenForo_Visitor::getInstance()->getUserId() ) {
            $output = '<!-- REGISTRIERT -->';
            return $output;
           } else {
            $output = '<!-- GAST -->';
            return $output;
           }
    Ebenso müsste es doch was geben um zu bestimmen in welchem Forum ich bin?
     
  16. otto

    otto Bekanntes Mitglied Lizenzinhaber

    XF Version:
    2.2.10 PL1
    XF Instanz:
    Hosting
    PHP-Version:
    8.2.x
    MySQL/MariaDB:
    10.3.x
    Provider/Hoster:
    Strato/Hetzner
    Schon mal die Conditionals näher betrachtet? Ich weiß ja nicht was genau du vor hast, aber ich denke die könnten deine Lösung sein.
     
  17. MFT

    MFT Aktives Mitglied Lizenzinhaber

    Hm, damit sind doch die gemeint "xen:if is="?
    Na die gehen doch nicht in einer per xen:callback class= in library abgelegten, includierten PHP?
    Ich muss da leider diverses Zeug in klassischem PHP ausführen (Cookie setzen, abfragen, in bestimmten Foren bestimmte Werbung ausspielen usw.) Ads Manager haben wir probiert nützt uns in dem speziellem Fall aber leider dort nichts.
    Genau hängt es also daran das ich das:
    Code (Text):
    <xen:if is="in_array({$forum.node_id}, array(x, y, z))">
    if is="{$forum.parent_node_id} == x"
    in PHP benötige, in der Art ;)
    Code (Text):
    if ( XenForo_Forums::getID()->getForumId() ) {
    muss doch möglich sein :)
     
  18. MFT

    MFT Aktives Mitglied Lizenzinhaber

    Hallo noch mal,
    vielleicht hilfts, so war das ganze in vBulletin:
    Code (Text):
    $forumIDs_2 = array(44,171,172,174,175,179,287);
    foreach($forumIDs_2 AS $forumID) {
        if($GLOBALS['threadinfo']['forumid'] == $forumID OR $GLOBALS['foruminfo']['forumid'] == $forumID) {
    $ad_vod = '<img src="......>';
    return $ad_vod;
        }
    }
    also suche ich dies für Xen:
    $GLOBALS['threadinfo']['forumid'] und $GLOBALS['foruminfo']['forumid']
     
  19. McAtze

    McAtze Administrator Lizenzinhaber

    XF Version:
    2.2.9
    XF Instanz:
    Hosting
    PHP-Version:
    8.0.x
    Provider/Hoster:
    NetCup
    Und kannst du in Worte fassen was du erwartest? Oder kurz gesagt eine Leistungsbeschreibung. Damit können dir eventuell andere, leichtere, Wege aufgezeigt werden.
     
  20. MFT

    MFT Aktives Mitglied Lizenzinhaber

    Ok, geht los:
    1. alles gilt nur für Gäste
    2. bestimmte Forenübersichtsseiten und Threads bekommen in der Sidebar bestimmte verschiedene Werbung ausgespielt, je Nach Themengebiet (ca.15 also W1-W15)
    3. alle anderen bekommen eine andere Werbung ausgespielt (W16), aber nur wenn (s.u. bei 4.) Cookie nicht da
    4. beim 1. Besuch bekommt jeder Gast einen Cookie
    5. ist der in 4 erwähnte Cookie vorhanden wird W17 ausgegeben

    IMHO brauch ich dazu PHP und das geht nicht in den Templates, falls es auch in Templates ginge Cookies zu setzen und abzufragen wäre das natürlich auch ne Möglichkeit....
     
    Masetrix gefällt das.
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden