Externe HTML-Seiten ins XenForo einbinden

Boothby

Bekanntes Mitglied
Lizenzinhaber
Registriert
11. Dez. 2010
Beiträge
359
Punkte
128
Andere HTML-Seiten in PHP-Dateien einzubinden, egal ob von fremden oder vom eigenen Server ist eigentlich ganz einfach. Hierzu bietet PHP mehrere Möglichkeiten, z.B. per require(), file_get_contents() und weitere.

Ein Beispiel
Code:
<div>
<?php
require("/pfad/zu/meiner/datei.html");
?>
</div>

Angenommen ihr wollt eine beliebige HTML-Seite ins XenForo einbinden, dann funktionieren obere Möglichkeiten nicht mehr. XenForo bringt aber einige Werkzeuge mit, um dies dennoch zu realisieren. Eine sehr einfache Möglichkeit besteht darin, dies über eigene Seiten zu realisieren.


Hierzu ist es erforderlich eine neue eignene Seite anzulegen, wie ragtek hier beschrieb. Durch das Plugin-System ist es möglich, beim Laden der Seite entsprechenden PHP- Code auszuführen, der dann auch externe HTML-Seiten auslesen und weiter verarbeiten kann.


Unter Inhalt des Template (HTML): definiert ihr einen Container, in welchem die HTML-Seite dargestellt werden soll.
HTML:
<div class="baseHtml messageText">
{xen:raw $myContent}
</div>

{xen:raw $myContent} ist eine Variable, die später mit dem Inhalt der HTML-Seite befüllt und im Container ausgeben werden soll.

Nun müsst ihr noch eine Callback-Methode eingeben, die unseren Code zum Auslesen des Inhalts der HTML-Datei ausführt. Es wird hierbei die Eingabe einer Klassenbezeichnung und einer Methode derselben Klasse erwartet. Diese Klasse und Methode müsst ihr aber vor Bestätigung der Seite durch Klick auf "Seite speichern" noch anlegen.

Klasse und Methode müssen nach dem Schema Klassename :: Methodenname in die entsprechenden Formularfelder eingetragen werden.

Als Beispiel möchte ich die Klasse XenForo_Pages_myPageID und die Methode includeFile nennen. Diese Klasse müsst ihr jetzt in eine PHP-Datei speichern. hierzu legt ihr eine neue PHP-Datei im Verzeichnies <xenforo>/library/XenForo/Pages/ an und bezeichnet diese als myPageID.php
Das Unterverzeichnis Pages existiert nicht in der Standardinstallation und muß deshalb zuvor angelegt werden. Verzeichnis-Struktur und Dateiname folgen hierbei der Namenskonvention von XenForo für Klassenbezeichnungen, damit die Klasse automatisch gefunden und geladen wird. Klassen sollen sich demnach in einem Unterverzeichnis von <xenforo>/library/ befinden und Klassenbezeichnung und Dateipfad passen dann ab dort zusammen. Siehe hierzu:

Dateipfad: <xenforo>/library/XenForo/Pages/myPageID.php
Klassenname: XenForo_Pages_myPageID


Der Inhalt der myPageID.php sieht dann wie folgt aus:

PHP:
<?php
class XenForo_Pages_myPageID
{
    public static function  includeFile(XenForo_ControllerPublic_Abstract $controller,  XenForo_ControllerResponse_Abstract &$response)
    {
        ob_start();
        require("/pfad/zu/meiner/datei.html");
        $myContent = ob_get_contents();
        ob_end_clean();

        $params = array(
            'myContent'  => $myContent
        );

        $response->params = array_merge(
            $response->params,
            $params
        );
    }
}

Zum Abschluß bestätigt ihr noch das Anlegen der neuen Seite im ACP durch Klick auf "Seite speichern"
 
Danke für das Abnehmen, da ich noch nicht dazu gekommen bin:)


Ein Extrahinweis noch:
Man muss nicht den HTML Code in das für ihn bestimmte Feld einfügen.
Man kann auch eigene Templates verwenden.

Also einfach den Code von oben nehmen und dazu noch $response->templateName setzen.
PHP:
       $response->params['foo'] = $bazModel->getFoo();


        $response->params['ragtek'] = 'hier steht was anderes drinn';

// nun das Template setzen
        $response->templateName = 'mein_demo_template';


Kier's Demoseiten Code gibt es hier zu sehen: http://xenforo.com/community/threads/code-from-have-you-seen-videos.7236/#post-102266
 
hi ich habe ein Problem wenn ich includeFile als Methode angebe dann sagt er mir:

Folgende Fehler sind aufgetreten:

Bitte gib eine gültige Callback-Methode ein.

außerdem gibt es eine möglichkeit diese seite dann oben in die Navigation zu bringen?
 
habe ich der sagt mr aber der befehl includeFile wäre falsch
XenForo_Pages_map.php ist meine datei
diese liegt im ordner
<xenforo>/library/XenForo/Pages/map.php

denn ich müsste diese seite irgendwie in die navigation brigen
 
Wenn der Dateiname <xenforo>/library/XenForo/Pages/map.php lautet dann muß der Klassenname wie folgt lauten:

Code:
XenForo_Pages_map

Die Klasse sähe dann (verkürzt) so aus:

PHP:
class XenForo_Pages_map
{
// hier der ganze code
}
 
Vielen dank für die schnellen und guten Antworten

ok jetzt hab ich eine weiße seite,
require("/pfad/zu/meiner/datei.html");
wo muss denn der pfad hin zum XenForo root verzeichniss?
oder relativ zur domain?
 
Du kannst den Pfad absolut oder relativ abgeben, das bleibt dir überlassen. Bei fremden Servern würdest du die URL angeben.

Noch etwas. Wenn es eine reine HTML-Datei ist, dann könntest du sie auch mittels file_get_contents() auslesen.

Wenn deine Datei z.B. in deinem Recourcen-Verzeichnis liegt, das sich im gleichen Ober-Verzeichnis wie xenforo selbst befindet, dann sähe der code wie folgt aus.
PHP:
<?php
class XenForo_Pages_map
{
    public static function  includeFile(XenForo_ControllerPublic_Abstract $controller,  XenForo_ControllerResponse_Abstract &$response)
    {
        $myContent = file_get_contents("../../../../Recources/map.html");
        $params = array(
            'myContent'  => $myContent
        );

        $response->params = array_merge(
            $response->params,
            $params
        );
    }
}

Ich hoffe mal, ich habe den relativen Pfad im Beispiel richtig angegeben. ;)
 
naja am liebsten wäre mir wenn ich der html datei einen php hintergrund geben könnte^^

die datei würde ich gerne im gleichen ordner haben wie die map.php wenn das ginge
ebenso kann man in die map.php weiteren php code einbauen oder ergibt das fehler?
da ich gerne das gemacht hätte

PHP:
<?php
error_reporting(0);

    $ip1 =  '78.46.97.217';
    $up =  'color="#009900"';
    $down = 'color="#FF0000"';

$build = fsockopen('78.47.47.179','25566',$errno,$errstr,10);
if(!$build)
{
    $build = $down;
    }else{
    $build = $up;
    fclose($fp);
}
$rp = fsockopen('78.47.47.180','25566',$errno,$errstr,10);
if(!$rp)
{
    $rp = $down;
    }else{
    $rp = $up;
    fclose($fp);
}

?>

HTML:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td align="center"><font size="5">Build Server</font></td>
  </tr>
  <tr>
    <td align="center"><font size="5" $build>Server IP: 78.47.47.179:25566</font></td>
  </tr>
  <tr>
    <td align="center"><iframe style="border:none;" width="770" height="800" src="http://78.47.47.179:8123/"></iframe></td>
  </tr>
  <tr>
    <td align="center">&nbsp;</td>
  </tr>
  <tr>
    <td align="center"><font size="5">Roleplay Server</font></td>
  </tr>
  <tr>
    <td align="center"><font size="5" $rp>Server IP: 78.47.47.180:25566</font></td>
  </tr>
  <tr>
    <td align="center"><iframe style="border:none;" width="770" height="800" src="http://78.47.47.180:8123/"></iframe></td>
  </tr>
</table>

es ist eine seite in der eine map von einem Minecraft server angezeigt wird, bzw 2 maps
von jeweils einem server, weiß nicht ob jemand Minecraft kennt xD

und die IP Adresse ist jeweils rot oder grün je nachdem ob der Server online oder offline ist
 
Das würde ich dann vollkommen anders, und zwar wie folgt machen:

Als Template gibts du den o.g. HTML-Teil ein. Die externe Datei würde ich dann gar nicht mehr laden sondern alles über die Klassen-Methode auslesen und an das $params-Array zurückgeben.

Die Variablen, z.B. $build und $rp müssen im Template anders notiert werden und zwar:
Code:
 {xen:raw $build}    {xen:raw $rp}
Das sieht dann so aus:
HTML:
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td align="center"><font size="5">Build Server</font></td>
  </tr>
  <tr>
    <td align="center"><font size="5" {xen:raw $build}>Server IP: 78.47.47.179:25566</font></td>
  </tr>
  <tr>
    <td align="center"><iframe style="border:none;" width="770" height="800" src="http://78.47.47.179:8123/"></iframe></td>
  </tr>
  <tr>
    <td align="center">&nbsp;</td>
  </tr>
  <tr>
    <td align="center"><font size="5">Roleplay Server</font></td>
  </tr>
  <tr>
    <td align="center"><font size="5" {xen:raw $rp}>Server IP: 78.47.47.180:25566</font></td>
  </tr>
  <tr>
    <td align="center"><iframe style="border:none;" width="770" height="800" src="http://78.47.47.180:8123/"></iframe></td>
  </tr>
</table>

Und aus dem Params-Array wird dann:
Code:
        $params = array(
            'build'  => $build,
            'rp' => $rp
        );

Die vollständige klasse sieht dann wie folgt aus. Ich habe den Methoden-Namen angepasst und in getMap geändert. ;)

PHP:
<?php

class XenForo_Pages_map
{
    public static function  getMap(XenForo_ControllerPublic_Abstract $controller,  XenForo_ControllerResponse_Abstract &$response)
    {
        $ip1 =  '78.46.97.217';
        $up =  'color="#009900"';
        $down = 'color="#FF0000"';
        $fp = null;

        $fp = fsockopen('78.47.47.179','25566',$errno,$errstr,10);
        if(!$fp)
        {
            $build = $down;
        }else{
            $build = $up;
            fclose($fp);
        }
        $fp = null; 
        
        $fp = fsockopen('78.47.47.180','25566',$errno,$errstr,10);
        if(!$fp)
        {
            $rp = $down;
        }else{
            $rp = $up;
            fclose($fp);
        }
        unset($fp);
        
        $params = array(
            'build'  => $build,
            'rp'     => $rp
        );

        $response->params = array_merge(
            $response->params,
            $params
        );
    }
}

Wahrscheinlich müßte man jetzt noch ein Bisschen Fehler-Behandlung hinzufügen, falls der Server nicht geöffnet werden kann und so.
 
ok hab das noch nicht ganz verstanden, wie soll ich das mit den params Array machen wo trage ich das jetzt ein?
 
Hatte meinen Post noch ergänzt.
 
ok vielen dank nochmals dass du dir mit mir soviel Arbeit machst :)

habe jetzt als PHP-Callback-Methode:
XenForo_Pages_map :: getMap

und deinen code kopiert

dann bekomme ich den error:

Folgende Fehler sind aufgetreten

The server responded with an error. The error message is in the JavaScript console.
 
So, ich habe deinen obigen Code etwas korrigiert.

Nun kommt aber folgender Fehler:

Code:
fsockopen() [function.fsockopen]: unable to connect to 78.47.47.180:25566 (Connection refused)
Da scheint was mit den Ports nicht zu stimmen.
 
komisch weil da geht es
http://anzahcraft.de/index.php?site=map

Code:
Server Error

fsockopen() [function.fsockopen]: unable to connect to 78.47.47.180:25566 (Connection refused)

    XenForo_Application::handlePhpError() in XenForo/Pages/map.php at line 22
    XenForo_Pages_map::getMap() in XenForo/ControllerPublic/Page.php at line 46
    XenForo_ControllerPublic_Page->actionIndex() in XenForo/FrontController.php at line 310
    XenForo_FrontController->dispatch() in XenForo/FrontController.php at line 132
    XenForo_FrontController->run() in /var/www/web120088/html/XenForo/index.php at line 15
 
Also wenn ich alle fsockopen-Zeilen auskommentiere, dann klappt es. D.h. der Xenforo-Teil funktioniert.

Probier mal folgenden Code, dann werden Fehlermeldungen deaktiviert (duch die @ vor fsockopen)

Code:
<?php

class XenForo_Pages_map
{

    public static function  getMap(XenForo_ControllerPublic_Abstract $controller,  XenForo_ControllerResponse_Abstract &$response)
    {
        $ip1 =  '78.46.97.217';
        $up =  'color="#009900"';
        $down = 'color="#FF0000"';

        $fp = @fsockopen('78.47.47.179','25566',$errno,$errstr,10);
        if(!$fp)
        {
            $build = $down;
        }else{
            $build = $up;
            fclose($fp);
        }

        $fp = @fsockopen('78.47.47.180','25566',$errno,$errstr,10);
        if(!$fp)
        {
            $rp = $down;
        }else{
            $rp = $up;
            fclose($fp);
        }

        $params = array(
            'build'  => $build,
            'rp'     => $rp
        );

        $response->params = array_merge(
            $response->params,
            $params
        );
    }

}
 
lol so gehts xD
vielen dank nochmals für deine zeit
kann man das noch ins Menü bekommen?
 
ja ok nur ich raff das net aus
1. Create your classfile in the xenforo directory. I named it ragtekTab
kann ich das teil wieder in den Pages ordner packen?

2. Create a Code Event Listener which "listens" to navigation tab
was meint der damit?
 
Leider kann man die Navigation nicht wirklich einfach ändern.

Entweder Template anpassen, oder per Event Listener die Navi erweitern

ABER ANGEBLICh wird in 2 Wochen ein Navbar Manager fertiggestellt;)
 
Zurück
Oben