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.
Gruß
Kevin