[jQuery] Theme Update Notification System für phpBB

Zoker

Lt. Junior Grade
Registriert
Okt. 2013
Beiträge
322
Hallo zusammen,

Ich baue gerade ein Theme für phpBB und da das System keine Update Notifications unterstützt, würde ich gerne selber eines bauen.

Dafür habe ich ein div mit einer Nachricht erstellt, die besagt, dass ein Update verfügbar ist.
Dieses div ist by default auf display:none gestellt.

Nun möchte ich irgendwie überprüfen, ob die aktuelle Version die neuste ist oder nicht. Dazu sollen per jQuery zwei Werte verglichen werden: Einmal die aktuellste Version, die verfügbar ist und einmal die aktuell installierte Version.

Nun meine Frage:
Wie mache ich das am besten?

In der style.cfg Datei gibt es eine Zeile, die wie folg aussieht:
HTML:
version = 0.9
Sie beschreibt die aktuelle Version des Themes.

Kann ich die irgendwie verwenden?

Vielen Dank
Zoker
 
Problematisch dürfte sein, dass du den Wert aus einer Datei nicht mit JS direkt auslesen kannst.
Als erstes würde ich an deiner Stelle mal klären, ob phpBB nicht schon so "advanced" ist, dass es die installierte Version des Themes als globale Variable ausgibt.

Falls das nicht der Fall ist, könntest du ein kleines PHP-Skript schreiben, das etwa so aussieht (angenommen, in der style.cfg steht nur der Wert für die Theme-Version):
PHP:
<?php
  $config = explode('=', file_get_contents('style.cfg'));
  $version = trim($config[1]);
  echo $version;
?>
In $version steht dann '0.9'. Dieses Ergebnis wird ausgegeben und kann z.B. mit einem $.ajax von jQuery abgefragt werden:
Code:
$.ajax('config.php').success(function (data) {
  var version = data;
});
(Code ungetestet, kann sein, dass du speziell beim ajax noch nacharbeiten müsstest.)
 
Das Problem ist, dass phpBB von haus aus kein php in den theme Dateien zulässt.
Das müssten die User selbst aktivieren und mindert die Sicherheit, das möchte ich eigentlich nicht.

Gibt es noch eine Möglichkeit eine Variable im Header Bereich der Seite unterzubringen?

siebling schrieb:
Theoretisch könnte man mit cURL oder ähnlichen Geschichten die Downloadseite von phpbb.com einmal am Tag abfragen (cronjob) und auf Änderungen prüfen. Das Resultat mit der eigenen Version abgleichen und ggfs. eine Meldung erzeugen, dass eine neue Version verfügbar ist.
Es geht mir nicht darum, die aktuellste phpBB Version abzugleichen, sondern die aktuellste Version meines Themes, dass ich erstellt habe.

Als Vergleichsquelle könnte ich jegliche Art von Datei auf meinem Webspace erstellen, das wäre als kein Problem.
 
Zuletzt bearbeitet:
Zoker schrieb:
Das Problem ist, dass phpBB von haus aus kein php in den theme Dateien zulässt.
Das müssten die User selbst aktivieren und mindert die Sicherheit, das möchte ich eigentlich nicht.

Gibt es noch eine Möglichkeit eine Variable im Header Bereich der Seite unterzubringen?


Es geht mir nicht darum, die aktuellste phpBB Version abzugleichen, sondern die aktuellste Version meines Themes, dass ich erstellt habe.

Hab es jetzt auch kapiert ;)
 
Ok :p
Und hast du irgendwelche Lösungsvorschläge? :)
 
siebling schrieb:
Theoretisch könnte man mit cURL oder ähnlichen Geschichten die Downloadseite von phpbb.com einmal am Tag abfragen (cronjob) und auf Änderungen prüfen. Das Resultat mit der eigenen Version abgleichen und ggfs. eine Meldung erzeugen, dass eine neue Version verfügbar ist.
Ich glaub, es geht nicht um phpBB selbst, sondern um sein eigenes Theme.
Zoker schrieb:
Das Problem ist, dass phpBB von haus aus kein php in den theme Dateien zulässt.
Das müssten die User selbst aktivieren und mindert die Sicherheit, das möchte ich eigentlich nicht.

Gibt es noch eine Möglichkeit eine Variable im Header Bereich der Seite unterzubringen?
Du könntest auch, gesetzt den Fall, dass dein Theme auf die Datei zugreifen darf, die Datei style.cfg direkt mit einem $.ajax abfragen:
Code:
$.ajax('style.cfg').success(function (data) {
  var styleCfg = data;
  
  var version = (styleCfg.split('=')[1]).trim(); // enthält jetzt "0.9"
});
 
Ich glaube nicht, dass die Ermittlung der lokalen Version das große Problem darstellen wird. Das geht mit deinem Beispiel ja vermutlich bereits recht einfach. Viel schwieriger dürfte die Abfrage vom lokalen Forum in Richtung Theme-Anbieter werden, um zu sehen, ob eine neue Version da ist.

PHP geht ja aufgrund der Restriktionen nicht. Ajax klappt auch nicht, weil die meisten Browser cross domain Anfragen aus Sicherheitsgründen blockieren.

Nicht elegant: die Einbindung einer Angabe mit Hilfe eines iframes, welches eine Adresse beim Theme-Anbieter aufruft. Aber das ist wirklich ein sehr unschöner Notnagel und letztlich entfällt auch hier die Möglichkeit unterschiedlicher Benachrichtigungen...man würde nur solche Geschichten sehen:

Deine Version: 0.9
Aktuelle Version 1.0

Der kursive Teil wäre dann ein Iframe und letztlich auf dem Server des Theme-Anbieters.

Keine Ahnung, ist wie Schwimmen mit Handschellen.
 
Kann man nicht mit javascript die Inhalt einer anderen Seite laden und daraus dann bestimmte Objekte extrahieren?
Ich meine so ne Art API (also ganz simpel).
Quasi eine Seite (die bei mir gehostet wird), die dann eben nur einen Text enthält:
Code:
version = 1.0

Also sowas wie:
http://api.openweathermap.org/data/2.5/weather?q=munich
 
Du kannst nochmal Google dazu bemühen, aber ich glaube nicht, dass das via Javascript/AJAX möglich ist. Bzw. möglich schon, aber Browser blocken das aus Sicherheitsgründen. Dafür benutzt man eben PHP und Co. siehe http://www.paulund.co.uk/make-cross-domain-ajax-calls-with-jquery-and-php

Was aber gehen könnte wäre eine Einbettung von fremden Inhalten via .js-Scriptdatei (so wie du jquery ja auch von Googles Servern laden kannst). Dort könntest du dann die aktuellste Version hinterlegen und dann im Theme damit arbeiten:

<script type="text/javascript" src="http://www.themeanbieter.com/currentversion.js"></script>

Fiel mir jetzt aber auch nur spontan ohne Überprüfung ein - keine Ahnung, ob da vielleicht auch ein Fallstrick vorhanden ist.
 
Logisch geht das. Du musst nur im entsprechenden Skript auf deinem Server den Header Access-Control-Allow-Origin setzen:
Code:
<?php
header("access-control-allow-origin: *");
?>
Damit wird dem Browser die CORS-Anfrage erlaubt. In den Netzwerkanfragen sieht das dann so aus:
ajax.jpg

€dit: Das mit dem PHP/jQuery-Gedöns von der Paulund.co.uk-Seite ist ganz übler Mist. Da hat jemand nicht verstanden, dass CORS eigentlich ein Sicherheitsmechanismus ist und nicht umgangen werden soll.

Da sich cURL aber nicht an Access-Control-Allow-Origin bzw. die Same Origin Policy halten muss, wird genau das erreicht. Wenn diese Policy nicht gelten soll, muss das schon im Einvernehmen mit dem Serverbesitzer geschehen. Wenn das der Fall ist, kann dieser die besagten Access-Control-Allow-Origin-Header setzen, und alles ist in Butter.
 
Zuletzt bearbeitet:
Sorry für die späte Antwort, musste mein Projekt auf Eis legen, jetzt ist es aber wieder aktuell.

Wie sieht denn dann so ein Skript ungefähr aus, dass die Anfrage stellt bzw das, dass den Wert ausgibt?
 
Wie lautet die Adresse deines Servers, von dem die Datei abgefragt werden soll? Bzw. hast du ein PHP-Skript, das den Inhalt der Datei ausliefert, so wie oben angegeben?
 
Also im Prinzip habe ich an eine sehr einfache php Datei:
PHP:
<?php
header("access-control-allow-origin: *");
echo "latest-version = 1.0";
?>

Reicht das?
 
Probier's aus? ;)
Code:
$.ajax('http://someserver.net/themeConfig.php').success(function (data) {
    var styleCfg = data;
    var version = (styleCfg.split('=')[1]).trim(); // enthält jetzt "1.0"
});
Noch leichter für die Verarbeitung wäre es aber, wenn du da gleich ein JSON hinterlegst...
PHP:
<?php
    header("access-control-allow-origin: *");
    header("content-type: application/json");
    echo "{\"latestVersion\": \"1.0\"}";
?>
...und dann entsprechend:
Code:
$.ajax('http://someserver.net/themeConfig.php').success(function (data) {
    var version = data.latestVersion; // enthält jetzt "1.0"
});
Möglicherweise musst du das JSON in JavaScript noch decodieren, das ginge dann mittels
Code:
JSON.parse(data);
 
AWESOME :D

Funktioniert perfekt :)

Vielen vielen Dank :)
 
Zurück
Oben