Variable als Template " 'body' =>" nutzen?

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
Saint
Mitglied
Beiträge: 1166
Registriert: 09.04.2004 14:06
Wohnort: Hamburg
Kontaktdaten:

Variable als Template " 'body' =>" nutzen?

Beitrag von Saint »

Mahlzeit geschätzte Gemeinde,

hat hier jemand eine Idee wie man bei:

Code: Alles auswählen

$template->set_filenames(array(
'body' => 'tabelle.html')
); 
statt einer Datei eine (bereits gefüllte) Variable anziehen kann? Also z.B.:

Code: Alles auswählen

$template->set_filenames(array(
'body' => $tabelle)
); 
Hintergrund:
Ich ziehe von einer anderen Domain von mir eine Template Datei an:

Code: Alles auswählen

    $tabelle = @file_get_contents('http://www.domain.de/styles/prosilver/template/tabelle.html');
    if(!$tabelle)
    {
         $tabelle='Zur Zeit nicht zu erreichen...';
    }; 
Das funktioniert auch so weit wunderbar, $tabelle ist brav mit dem Template gefüllt.
Nun will ich nur die Tabelle lokal als body mit den restlichen, lokal ausgelesenen, Variablen füllen und dann das ganze Geraffel parsen.

Danke schon mal und allen ein schönes Wochenende!

Gruß

Kevin



*edit*
Um das vorweg zu nehmen:
Mit $template->set_custom_template scheint es in Verbindung mit einer anderen Domain nicht zu laufen. Die Funktion scheint nur für Files lokal außerhalb des Template Verzeichnis gedacht zu sein, aber nicht für Files auf einer anderen Domain. Schade...
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: Variable als Template " 'body' =>" nutzen?

Beitrag von gn#36 »

Das System ist nicht dafür ausgelegt sowas direkt zu machen. Du kannst aber ja das Template von der anderen Domain holen, lokal speichern und dann wie eine lokale Datei weiterbehandeln (sprich auch als Template verwenden). Wenn du das nicht bei jedem Seitenaufruf machen musst sondern nur wenn das Template mal nicht da sein sollte hat das auch deutliche Geschwindigkeitsvorteile, schließlich ist das holen von einem anderen Server noch mal langsamer als alles andere.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
Saint
Mitglied
Beiträge: 1166
Registriert: 09.04.2004 14:06
Wohnort: Hamburg
Kontaktdaten:

Re: Variable als Template " 'body' =>" nutzen?

Beitrag von Saint »

Danke für die Infos!
Tja, dann ist es wohl tatsächlich so, wie ich befürchtet habe, und ich müsste wohl das große Fass aufmachen.
Das aktualisieren des Templates (in diesem Fall ist das Template auch der Datenbestand) könnte man ja einmal am Tag machen.
Mal schauen wie weit meine Energie und Zeit reicht das was zusammen zu basteln... :wink:
Benutzeravatar
Saint
Mitglied
Beiträge: 1166
Registriert: 09.04.2004 14:06
Wohnort: Hamburg
Kontaktdaten:

Re: Variable als Template " 'body' =>" nutzen?

Beitrag von Saint »

So, nun habe ich ein lauffähiges System.
Der Umweg über das schreiben von Files lässt sich nicht vermeiden. Ich beschreibe das mal hier, was ich gemacht habe, vielleicht kann das ja noch jemand gebrauchen, auch wenn es etwas exotisch ist.

Problemstellung:
Im (Master-) Forum existiert eine Tabelle, die auch als Mirror in einer anderen Sprache in einem anderen (Schwester-) phpBB3 Forum laufen soll.
Die Tabelle ist mit Variablen mehrsprachig ausgestattet, der Datenbestand wird direkt im Template eingepflegt (Aktualisierungen finden nicht so häufig statt).
Dabei soll aber sicher gestellt werden, das der Datenbestand konsistent bleibt, also Aktualisierungen im Master automatisch auf den Mirror übertragen werden sollen. Einmal am Tag zieht der Mirror automatisch den aktuellen Datenbestand und legt ihn lokal ab.
Dem Mirror soll fertig geparstes HTML übergeben werden, das er dann nur noch als body einbinden muss.

Lösung - Master:
Eine Kopie der tabelle.php wird erstellt und umbenannt in tabelle_ext.php. Diese Datei ist nur dafür da, vom Mirror aufgerufen zu werden und ihm die Tabelle komplett fertig zu parsen (in verschiedenen Zuständen, je nach Parameter) - allerdings ohne Header und Footer. Dafür soll der Mirror ja seine eigenen nehmen.
Als erstes wird also in der tabelle_ext.php die tabelle_body.html eingelesen, die Includes für Header und Footer entfernt und dann als tabelle_body_ext.html zurück geschrieben (Wichtig: das Verzeichnis, in das die Datei geschrieben werden soll, muss chmod 777 haben!):

Code: Alles auswählen

// Template kopieren
$readpath            = 'styles/prosilver/template/tabelle/';
$writepath           = 'styles/prosilver/template/tabelle/ext/';
$filename            = 'tabelle_body_ext.html';


        $tabelle = @file_get_contents($readpath . 'tabelle_body.html');
            if(!$tabelle)
            {
                 $tabelle='Kann die Tabelle zur Zeit nicht erreichen...';
            };
            
            $tabelle = str_replace("<!-- INCLUDE overall_header.html -->", "", $tabelle);
            $tabelle = str_replace("<!-- INCLUDE overall_footer.html -->", "", $tabelle);            
            
            $handle = fopen($writepath . $filename, "w");
            fwrite($handle, $tabelle);
            fclose($handle); 
Nun marschiert die tabelle_ext.php weiter durch den Code und bereitet die Tabelle je nach aufgerufenen Parametern auf.
Zum Schluss wird alles mit dem gerade generierten Template geparst und steht dem Mirror als pures HTML ohne Header und Footer zur Verfügung:

Code: Alles auswählen

$template->set_filenames(array(
'body' => 'tabelle/ext/tabelle_body_ext.html')
); 
Mirror:
Der Mirror muss nun drei Aufgaben erfüllen: Das geparste Template ziehen, dafür sorgen das er das nur alle 24 Stunden macht und die Includes für Header und Footer wieder hinzu fügen. Die Funktion der tabelle.php auf dem Mirror im Überblick:

Code: Alles auswählen

$now                = time(); // Die aktuelle Zeit wird als UNIX Timestamp ermittelt
$mypath                = 'styles/prosilver/template/tabelle/'; //Pfad zu den Dateien (Verzeichnis tabelle muss wieder auf 777 sein!)
$filename            = 'tabelle_body.html'; // Unser lokaler Template Name
$file_time            = 'timestamp.php'; // Die Datei, in die der Timestamp für die Aktualisierung geschrieben werden soll
$var_time            = '$timestamp'; // Variable für den Timestamp
$header                = '<!-- INCLUDE overall_header.html -->'; /Um die Includes wieder zum body hinzu zu fügen
$footer                = '<!-- INCLUDE overall_footer.html -->'; 

// Nun können wir cachen
include($phpbb_root_path . 'styles/prosilver/template/tabelle/timestamp.' . $phpEx); // Datei anziehen, um den Zeitpunkt der letzten Aktualisierung zu bekommen ($timestamp)

if ($now > $timestamp +  86400) // Abfrage ob die letzte Aktualisierung länger als einen Tag her ist: 86400 = 60sek x 60min x 24std = 1 Tag 
// Wenn ja, wird nun in $timestamp die aktuelle Uhrzeit geschrieben und das Template neu vom Master gezogen
{
// aktuellen timestamp in timestamp.php schreiben
    $timestamp = ("<?php 
    $var_time = $now
    ?>");
        $handle = fopen($mypath . $file_time, "w");
        fwrite($handle, $timestamp);
        fclose($handle);

// body vom Masterforum ziehen, Header / Footer includes hinzu und lokal abspeichern
        $tabelle = @file_get_contents('http://www.domain.de/tabelle_ext.php');
            if(!$tabelle)
            {
                 $tabelle='Kann die Tabelle zur Zeit nicht erreichen...';
            };
            $tabelle = $header . $tabelle . $footer; // Header und Footer hinzu fügen
            $handle = fopen($mypath . $filename, "w");
            fwrite($handle, $tabelle);
            fclose($handle);
}
Die einzelnen Schritte habe ich mal einkommentiert.
Also: es wird die aktuelle Uhrzeit ermittelt ($now) und mit dem Zeitpunkt der letzten Aktualisierung abgeglichen ($timestamp in der timestamp.php), ob sie schon länger als 24 Stunden her ist.
Wenn ja wird der aktuelle Timestamp in die timestamp.php geschrieben, das Template neu gezogen, Header und Footer Includes hinzu gefügt und dann lokal als tabelle_body.html gespeichert.

Anfangs hatte ich auch eine Abfrage drin, ob die Dateien existieren mit if ( !file_exists($file_time)), habe sie aber wieder raus genommen.
Nun kommt zwar eine Fehlermeldung, sollten die Dateien nicht vorhanden sein, aber die Dateien werden angelegt und beim nächsten refresh ist die Meldung weg. Diese Situation gibt es ja auch nur, wenn man das Script das erste Mal laufen lässt (oder eine Aktualisierung erzwingen möchte).

Ergebnis:
Damit man sich besser etwas darunter vorstellen kann:
Dies ist die Master Tabelle: http://www.harmony-remote-forum.de/harmony_compare.php
Hier ist der Mirror in einem holländischen Forum: http://www.harmony-forum.nl/harmony_compare.php
Und hier ist die Datei, die den body fertig für den Mirror parst: http://www.harmony-remote-forum.de/harm ... re_ext.php

Füge ich nun ein neues Modell hinzu oder nehme andere Änderungen vor, bekommt das holländische Forum diese Änderungen automatisch innerhalb von 24 Stunden übermittelt, ohne das der holländische Admin was machen muss.

Die ganzen Switches für die Sortierung, Sprache etc habe ich in dieser Beschreibung weg gelassen, das ist ein anderes Thema.

Es sind natürlich auch andere Anwendungszwecke denkbar, wie z.B bestimmte Posts, Inhalte irgendwelcher Mods, etc in einem anderen Forum gesondert ausgeben lassen.

Sollte jemand das hier Beschriebene gebrauchen können, lasst es mich wissen - würde mich interessieren was damit so angestellt wird. :wink:

Gruß

Kevin
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“