Ressourcen-Icon

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

rellek

Bekanntes Mitglied
Registriert
20. März 2011
Beiträge
477
Punkte
133
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

In XenForo 1.2 ist ein neuer Template-Tag hinzugekommen, der für vielerlei Anwendungszwecke recht nützlich sein kann. Sein Name ist <xen:callback> und er ermöglicht das Ausführen von beliebigem PHP-Code.

Syntax
Der Syntax des <xen:callback>-Aufrufs gestaltet sich folgendermassen:
Code:
<xen:callback class="Klassen_Name" method="methodenName">(optional: ) Parameter</xen:callback>

"Klassen_Name" ist dabei der Name der Klasse, die verwendet werden soll. Wie ein Klassenname aufgebaut...

Weitere Informationen zu dieser Ressource...
 
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?
 
Dann hilf mir auf die Sprünge: Wie geht das? In thread_view vor dem <ol hab ichs hiermit versucht:

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

und damit:

Code:
<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".
 
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) ?
 
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:
<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.
 
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:
<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:
<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:
<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?
 
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!!!
 
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?
 
Zugriff auf den AKTUELLEN Benutzer hat man IMMER über
PHP:
XenForo_Visitor::getInstance();

Und das Db Objekt bekommt man über
PHP:
XenForo_Application::getDb();
 
Zugriff auf den AKTUELLEN Benutzer hat man IMMER über
PHP:
XenForo_Visitor::getInstance();

Und das Db Objekt bekommt man über
PHP:
XenForo_Application::getDb();

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 :)
 
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
 
Hallo,
ich hab weiteren Fortschritt zu vermelden :happy:
Ob angemeldet lässt sich so herausfinden:
Code:
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?
 
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.
 
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:
<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:
if ( XenForo_Forums::getID()->getForumId() ) {
muss doch möglich sein :)
 
Hallo noch mal,
vielleicht hilfts, so war das ganze in vBulletin:
Code:
$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']
 
Und kannst du in Worte fassen was du erwartest? Oder kurz gesagt eine Leistungsbeschreibung. Damit können dir eventuell andere, leichtere, Wege aufgezeigt werden.
 
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....
 
Zurück
Oben