Deutschland United States United Kingdom
ContentLion - Open Source CMS

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):

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? :D
(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: ^^

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. :D

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.

Gibts schon ;-)

Ist im Updater-Plguin mit drin

Ähnliche Themen