Social Media
Foren
Update-Funktion für Plugins
Update-Funktion für Plugins
Bis jetzt gibt es bei den Plugins noch keine Update-Funktion.
Das Problem ist, dass, wenn ich z.B. mein Gästebuch-Plugin deaktiviere auch die dazugehörige Datenbank-Tabelle lösche und die Gästebuch-Einträge damit auch.
Deßhalb sollte unter dem Button "Deaktiviern" im Admin-Bereich/Plugins ein Button "Update" erscheinen, falls im Plugin-Ordner eine Datei "update.php" vorhanden ist.
Um das mit der Versions-Verwaltung den Plugin-Entwicklern zu erleichtern, habe ich mir etwas ausgedacht:
Es gibt eine abstrakte Klasse "PluginUpdate".
Von dieser Klasse müssen alle Update-Klassen der Plugins erben.
Sie sieht erst einmal so aus (ist noch in Entwicklung):
ich weiß, die Klasse ist etwas groß und noch nicht einmal vollständig, dafür hat sie folgende Vorteile:
Hier mal ein Beispiel "update.php"-Datei:
Was hälst du / haltet ihr von der ganzen Sache?
(Die PluginUpdate - Klasse müsste natürlich in den Core, nicht das diese bei allen Updates mitgeliefert werden muss.)
Das Problem ist, dass, wenn ich z.B. mein Gästebuch-Plugin deaktiviere auch die dazugehörige Datenbank-Tabelle lösche und die Gästebuch-Einträge damit auch.
Deßhalb sollte unter dem Button "Deaktiviern" im Admin-Bereich/Plugins ein Button "Update" erscheinen, falls im Plugin-Ordner eine Datei "update.php" vorhanden ist.
Um das mit der Versions-Verwaltung den Plugin-Entwicklern zu erleichtern, habe ich mir etwas ausgedacht:
Es gibt eine abstrakte Klasse "PluginUpdate".
Von dieser Klasse müssen alle Update-Klassen der Plugins erben.
Sie sieht erst einmal so aus (ist noch in Entwicklung):
PHP-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
<?php
/*
* Package ContentLion - Core
* Author: Justin (JuKu)
*
* Description: Jede Plugin-Updater-Klasse (Datei "update.php" im Plugin-Ordner) muss von dieser Klasse erben.
*/
abstract class PluginUpdate {
protected $plugininfo;
protected $new_version;
protected $log_handle;
protected $path;
public $deleteFile = array();//Dateien, die gelöscht werden sollen.
public $copyFiles = array();//Dateien die aktualisiert (kopiert und evtl. überschrieben) werden sollen.
public $queries = array();//MYSQL-Befehle
public $abord_on_error_delete_file = true;//Einstellung: Wenn Datei, die gelöscht werden soll, nicht gefunden wird - Abbrechen?
//Konstruktor
public function __construct ($plugininfo, $path) {
$this->plugininfo = $plugininfo;
$this->path = $path;
//Wenn der Log-Ordner nicht vorhanden ist, wird er erstellt.
if (!file_exists("log")) {
mkdir("log");
}
$this->log_handle = fopen("log/update.txt", "a");
fwrite($this->log_handle, "#### Update to Version " . $this->new_version . ", " . date("D d.m.y H:i:s") . " ####\r\n");
fwrite($this->log_handle, "Current-Version: " . $this->plugininfo->version . "\r\n");
fwrite($this->log_handle, "Plugin-Author: " . $this->plugininfo->authorName . "\r\n");
fwrite($this->log_handle, "Plugin-Name: " . $this->plugininfo->name . "\r\n\r\n");
$this->init();
}
//Wird aufgerufen, wenn der User auf "Update" klickt
public final function execute () {
$version = $this->plugininfo->version;
$this->new_version = $this->getNewVersion();
fwrite($this->log_handle, "#### Update starts.\r\n");
fwrite($this->log_handle, "#### Update FileSystem: \r\n");
$update_ok = $this->updateFileSystem($version);
//Wenn die Dateien erfolgreich aktualisiert wurden, aktualisiere Datenbank.
if ($update_ok == true) {
//Datenbank aktualisieren
$update_ok = $this->updateDatabase($version);
if ($update_ok == true) {
//
$update_ok = $this->updateManual($version);
if ($update_ok == true) {
fclose($this->log_handle);
return true;//Update erfolgreich
} else {
return $update_ok;//Fehler zurückgeben
}
} else {
return $update_ok;
}
} else {
return $update_ok;
}
}
//Aktualisiert die Plugin-Dateien
public final function updateFileSystem ($version) {//Gibt true zurück, wenn alles geklappt hat, ansonsten false oder die Fehlermeldung.
if (isset($this->deleteFile["" . $version])) {
for ($i = 0; $i < count($this->deleteFile["" . $version]); $i++) {
fwrite($this->log_handle, "\t - Delete " . $this->path . "/" . $this->deleteFile[$version][$i] . " ... ");
//Prüfen, ob Datei existiert
if (file_exists($this->path . "/" . $this->deleteFile[$version][$i])) {
//Datei löschen
unlink($this->path . "/" . $this->deleteFile[$version][$i]);
fwrite($this->log_handle, "Ok.\r\n");
} else {
fwrite($this->log_handle, "Error, File not exists!\r\n");
//
if ($this->abord_on_error_delete_file) {//Abbrechen, falls es so eingestellt ist.
return "Error-deleteFile:" . $this->path . "/" . $this->deleteFile[$version][$i];
}
}
}
}
return true;
}
public abstract function init ();//Hier können die Variablen gesetzt werden
//Aktualisiert die Datenbank
public function updateDatabase ($version) {//Gibt true zurück, wenn alles geklappt hat, ansonsten false oder die Fehlermeldung.
return true;
}
public function updateManual ($version) {//Manuelle Schritte, z.B. komplexe Datenbank-Änderungen etc.
return true;
}
public abstract function getNewVersion ();//Gibt die neue Version als String zurück
public abstract function deleteUpdateFile ();//Gibt true zurück, wenn die Datei "update.php" im Plugin-Ordner nach dem Update gelöscht werden soll. (Der Update-Button erscheint nur, wenn die Datei "update.php" vorhanden ist.)
}
?>
|
ich weiß, die Klasse ist etwas groß und noch nicht einmal vollständig, dafür hat sie folgende Vorteile:
- Durch diese große Klasse müssen die Plugin-Entwickler fast nichts mehr machen, außer die Dateien usw. in einem Array angeben.
- Diese Klasse erzeigt eigenständig ein Log im Ordner "log" (wird bei Bedarf angelegt), wo alle Schritte genau protokolliert werden.
Hier mal ein Beispiel "update.php"-Datei:
PHP-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php
class Plugin_Guestbook_Update extends PluginUpdate {
public function getNewVersion () {//Gibt die neueste Version zurück, auf die geupdatet wird. (Wichtig für das Neu-Schreiben der info.php-Datei!)
return "1.1.0";
}
public function deleteUpdateFile () {//Gibt an, ob die Datei "update.php" nach einem erfolgreichem Update gelöscht werden soll, das zur Folge hat, das der "Update"-Button nicht mehr im Admin-Bereich angezeigt wird.
return false;//Datei "update.php" nicht löschen.
}
public function init () {//Arrays initialisieren
$this->deleteFile['1.0.0'] = array("test.txt", "test2.txt");
$this->deleteFile['1.1.0'] = array("test_.php", "test.txt");
//print_r($this->deleteFile);
}
}
$update = new Plugin_Guestbook_Update($pluginInfo, "."/* . "system/plugins/" . $pluginInfo->path . ""*/);//Der Pfad muss angepasst werden ;)
$update->execute();
?>
|
Was hälst du / haltet ihr von der ganzen Sache?
(Die PluginUpdate - Klasse müsste natürlich in den Core, nicht das diese bei allen Updates mitgeliefert werden muss.)
Sorry, die folgenden Zeilen in der Beispiel-Datei müssten natürlich entfernt werden:
Diese Zeilen müssten dann irgendwo in der Datei mit den Update-Button erscheinen, also wenn der Update-Button gedrückt wird, müssen diese beiden PHP-Befehle ausgeführt werden.
Der Klassenname muss natürlich auch noch vorher geparst werden.
PHP-Quelltext |
|
1 2 |
$update = new Plugin_Guestbook_Update($pluginInfo, "."/* . "system/plugins/" . $pluginInfo->path . ""*/);//Pfad anpassen
$update->execute();
|
Diese Zeilen müssten dann irgendwo in der Datei mit den Update-Button erscheinen, also wenn der Update-Button gedrückt wird, müssen diese beiden PHP-Befehle ausgeführt werden.
Der Klassenname muss natürlich auch noch vorher geparst werden.
So sieht dann ungefähr die Log-Datei aus:
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#### Update to Version 1.1.0, Tue 24.04.12 18:14:04 #### Current-Version: 1.0.0 Plugin-Author: Justin Plugin-Name: Gästebuch #### Update starts. #### Update FileSystem: - Delete ./test.txt ... Error, File not exists! - Delete ./test2.txt ... Error, File not exists! - Copy ./update/data/test_2.txt to ./test_2.txt_ ... Ok. #### Update Database: #### Update Manual: #### Update successful. |
Ähnliche Themen
-
- Erweiterungen »
- Event-Liste (21. April 2012, 15:31)
-
- Erweiterungen »
- Kommentar-Funktion (21. April 2012, 16:30)
-
- Support »
- Updateverteilung bereitet Probleme. Ideen? (22. April 2012, 13:24)
-
- Off-Topic »
- Nächstes Update (15. April 2012, 19:00)