|
1
|
|
|
<?php |
|
2
|
|
|
namespace core\modules; |
|
3
|
|
|
|
|
4
|
|
|
use core\App; |
|
5
|
|
|
use core\HTML\flashmessage\FlashMessage; |
|
6
|
|
|
|
|
7
|
|
|
class ImportModule { |
|
8
|
|
|
private $nom_dossier; |
|
9
|
|
|
private $nom_fichier; |
|
10
|
|
|
private $extension; |
|
11
|
|
|
private $erreur; |
|
12
|
|
|
|
|
13
|
|
|
//pour les infos du module |
|
14
|
|
|
private $id_module; |
|
15
|
|
|
private $url_telechargement; |
|
16
|
|
|
private $version_ok; |
|
17
|
|
|
private $dossier_module; |
|
18
|
|
|
|
|
19
|
|
|
|
|
20
|
|
|
//-------------------------- CONSTRUCTEUR ----------------------------------------------------------------------------// |
|
21
|
|
|
public function __construct() { |
|
22
|
|
|
//On test si dossier temporaire + modules a la racines existes bien sinon on les crées |
|
23
|
|
|
if (!file_exists(ROOT."temp")) mkdir(ROOT."temp"); |
|
24
|
|
|
if (!file_exists(ROOT."modules")) mkdir(ROOT."modules"); |
|
25
|
|
|
} |
|
26
|
|
|
//-------------------------- FIN CONSTRUCTEUR ----------------------------------------------------------------------------// |
|
27
|
|
|
|
|
28
|
|
|
|
|
29
|
|
|
//-------------------------- GETTER ----------------------------------------------------------------------------// |
|
30
|
|
View Code Duplication |
private function getUrl($id) { |
|
|
|
|
|
|
31
|
|
|
$dbc = App::getDb(); |
|
32
|
|
|
|
|
33
|
|
|
$query = $dbc->select("url")->from("module")->where("ID_module", "=", $id); |
|
34
|
|
|
|
|
35
|
|
|
if ((is_array($query)) && (count($query) > 0)) { |
|
36
|
|
|
foreach ($query as $obj) { |
|
37
|
|
|
return MODULEROOT.$obj->url; |
|
38
|
|
|
} |
|
39
|
|
|
} |
|
40
|
|
|
} |
|
41
|
|
|
|
|
42
|
|
|
/** |
|
43
|
|
|
* @param $id_module |
|
44
|
|
|
* permets de récupérer des informations sur un module |
|
45
|
|
|
*/ |
|
46
|
|
|
private function getInfoModule($id_module) { |
|
47
|
|
|
$dbc = App::getDb(); |
|
48
|
|
|
|
|
49
|
|
|
$query = $dbc->query("select * from module WHERE ID_module=".$dbc->quote($id_module)); |
|
50
|
|
|
|
|
51
|
|
|
if ((is_array($query)) && (count($query) > 0)) { |
|
52
|
|
|
foreach ($query as $obj) { |
|
53
|
|
|
$this->id_module = $obj->ID_module; |
|
54
|
|
|
$this->url_telechargement = $obj->url_telechargement; |
|
55
|
|
|
$this->version_ok = $obj->online_version; |
|
56
|
|
|
$this->dossier_module = str_replace("/", "", $obj->url); |
|
57
|
|
|
} |
|
58
|
|
|
} |
|
59
|
|
|
} |
|
60
|
|
|
//-------------------------- FIN GETTER ----------------------------------------------------------------------------// |
|
61
|
|
|
|
|
62
|
|
|
|
|
63
|
|
|
//-------------------------- SETTER ----------------------------------------------------------------------------// |
|
64
|
|
|
private function setInstallModule($url_module) { |
|
65
|
|
|
$zip = new \ZipArchive(); |
|
66
|
|
|
|
|
67
|
|
|
if (($this->extension == "zip") && |
|
68
|
|
|
(file_exists(MODULEROOT.$this->nom_dossier) == false) && |
|
69
|
|
|
(file_put_contents(TEMPROOT.$this->nom_fichier, fopen($url_module, 'r')) != false) && |
|
|
|
|
|
|
70
|
|
|
($zip->open(TEMPROOT.$this->nom_fichier) == true) && |
|
71
|
|
|
($zip->extractTo(TEMPROOT) == true) && |
|
72
|
|
|
(rename(TEMPROOT.$this->nom_dossier, MODULEROOT.$this->nom_dossier) == true)) { |
|
73
|
|
|
|
|
74
|
|
|
$zip->close(); |
|
75
|
|
|
return true; |
|
76
|
|
|
} |
|
77
|
|
|
|
|
78
|
|
|
return false; |
|
79
|
|
|
} |
|
80
|
|
|
/** |
|
81
|
|
|
* @param $url_module |
|
82
|
|
|
* @param boolean $update |
|
83
|
|
|
* fonction qui permets d'importer un module dans notre site internet |
|
84
|
|
|
*/ |
|
85
|
|
|
public function setImportModule($url_module, $update = null) { |
|
86
|
|
|
$dbc = App::getDb(); |
|
87
|
|
|
|
|
88
|
|
|
//avant tout on récupère le nom du fichier pour le mettre dans le dossier temporaire |
|
89
|
|
|
$explode = explode("/", $url_module); |
|
90
|
|
|
$this->nom_fichier = end($explode); |
|
91
|
|
|
|
|
92
|
|
|
//on recupere le nom du dossier + extention |
|
93
|
|
|
$explode = explode(".", $this->nom_fichier); |
|
94
|
|
|
$this->nom_dossier = $explode[0]; |
|
95
|
|
|
$this->extension = $explode[1]; |
|
96
|
|
|
|
|
97
|
|
|
if ($this->setInstallModule($url_module) == true) { |
|
98
|
|
|
$this->setSupprimerArchiveTemp(); |
|
99
|
|
|
|
|
100
|
|
|
//si c'est une install et non une mise à jour |
|
101
|
|
|
if ($update == null) { |
|
102
|
|
|
$requete = ""; |
|
103
|
|
|
require_once(MODULEROOT.$this->nom_dossier."/install.php"); |
|
104
|
|
|
$dbc->query($requete); |
|
105
|
|
|
} |
|
106
|
|
|
|
|
107
|
|
|
FlashMessage::setFlash("Votre module a bien été ajouté au site.", "success"); |
|
108
|
|
|
} |
|
109
|
|
|
else { |
|
110
|
|
|
FlashMessage::setFlash("Le module n'a pas pu être correctement téléchargé et installé, veuillez réesseyer dans un instant"); |
|
111
|
|
|
} |
|
112
|
|
|
} |
|
113
|
|
|
|
|
114
|
|
|
/** |
|
115
|
|
|
* @param $id_module |
|
116
|
|
|
* permet de mettre à jour un module en gardant une copie de l'ancienne version pendant une semaine |
|
117
|
|
|
*/ |
|
118
|
|
|
Public function setUpdateModule($id_module) { |
|
119
|
|
|
$dbc = App::getDb(); |
|
120
|
|
|
|
|
121
|
|
|
$this->getInfoModule($id_module); |
|
122
|
|
|
|
|
123
|
|
|
//on rename le dossier actuel du module |
|
124
|
|
|
if (rename(MODULEROOT.$this->dossier_module, MODULEROOT.$this->dossier_module."_OLDVERSION")) { |
|
125
|
|
|
$this->setImportModule($this->url_telechargement, true); |
|
126
|
|
|
|
|
127
|
|
|
//si pas d'erreur on met la date de next check a la semaine pro ++ on dit |
|
128
|
|
|
//de delete l'ancienne version au next check |
|
129
|
|
|
if (($this->erreur !== true) || (!isset($this->erreur))) { |
|
130
|
|
|
$today = date("Y-m-d"); |
|
131
|
|
|
$today = new \DateTime($today); |
|
132
|
|
|
|
|
133
|
|
|
$value = [ |
|
134
|
|
|
"next_check" => $today->add(new \DateInterval("P1W"))->format("Y-m-d"), |
|
135
|
|
|
"version" => $this->version_ok, |
|
136
|
|
|
"online_version" => "", |
|
137
|
|
|
"mettre_jour" => "", |
|
138
|
|
|
"delete_old_version" => 1, |
|
139
|
|
|
"id_module" => $id_module |
|
140
|
|
|
]; |
|
141
|
|
|
|
|
142
|
|
|
$dbc->prepare("UPDATE module SET next_check_version=:next_check, version=:version, online_version=:online_version, mettre_jour=:mettre_jour, delete_old_version=:delete_old_version WHERE ID_module=:id_module", $value); |
|
143
|
|
|
|
|
144
|
|
|
FlashMessage::setFlash("Votre module a bien été mis à jour", "success"); |
|
145
|
|
|
} |
|
146
|
|
|
} |
|
147
|
|
|
else { |
|
148
|
|
|
FlashMessage::setFlash("Impossible de télécharger la mise à jour, veuillez réesseyer dans un instant"); |
|
149
|
|
|
} |
|
150
|
|
|
} |
|
151
|
|
|
|
|
152
|
|
|
/** |
|
153
|
|
|
* @return bool |
|
154
|
|
|
* fonction qui après l'installation d'un module supprime les fichier temporaires |
|
155
|
|
|
*/ |
|
156
|
|
|
private function setSupprimerArchiveTemp() { |
|
157
|
|
|
if (unlink(TEMPROOT.$this->nom_fichier) == true) { |
|
158
|
|
|
return true; |
|
159
|
|
|
} |
|
160
|
|
|
else { |
|
161
|
|
|
return false; |
|
162
|
|
|
} |
|
163
|
|
|
} |
|
164
|
|
|
|
|
165
|
|
|
/** |
|
166
|
|
|
* @param $id_module |
|
167
|
|
|
* fonction qui permet de supprimer un module (suppression des tables + appel fonction supprimer dossier) |
|
168
|
|
|
*/ |
|
169
|
|
|
public function setSupprimerModule($id_module, $systeme) { |
|
170
|
|
|
$dbc = App::getDb(); |
|
171
|
|
|
|
|
172
|
|
|
if ($systeme == 1) { |
|
173
|
|
|
$value = array( |
|
174
|
|
|
"id_module" => $id_module, |
|
175
|
|
|
"activer" => 0, |
|
176
|
|
|
"installer" => 0, |
|
177
|
|
|
); |
|
178
|
|
|
|
|
179
|
|
|
$dbc->prepare("UPDATE module SET activer=:activer, installer=:installer WHERE ID_module=:id_module", $value); |
|
180
|
|
|
} |
|
181
|
|
|
else { |
|
182
|
|
|
$value = array( |
|
183
|
|
|
"id_module" => $id_module, |
|
184
|
|
|
); |
|
185
|
|
|
|
|
186
|
|
|
$dbc->prepare("DELETE FROM module WHERE ID_module=:id_module", $value); |
|
187
|
|
|
} |
|
188
|
|
|
|
|
189
|
|
|
$requete = ""; |
|
190
|
|
|
require_once($this->getUrl($id_module)."uninstall.php"); |
|
191
|
|
|
$dbc->query($requete); |
|
192
|
|
|
|
|
193
|
|
|
$this->supprimerDossier($this->getUrl($id_module)); |
|
194
|
|
|
} |
|
195
|
|
|
|
|
196
|
|
|
/** |
|
197
|
|
|
* @param $id_module |
|
198
|
|
|
* fonction qui permet de supprimer le dossier d'une vielle version d'un module une semaine après son ajout |
|
199
|
|
|
*/ |
|
200
|
|
|
public function setSupprimerOldModule($id_module) { |
|
201
|
|
|
$dbc = App::getDb(); |
|
202
|
|
|
|
|
203
|
|
|
$this->getInfoModule($id_module); |
|
204
|
|
|
|
|
205
|
|
|
$this->supprimerDossier(MODULEROOT.$this->dossier_module); |
|
206
|
|
|
|
|
207
|
|
|
$value = [ |
|
208
|
|
|
"id_module" => $this->id_module, |
|
209
|
|
|
"delete_old_version" => "" |
|
210
|
|
|
]; |
|
211
|
|
|
|
|
212
|
|
|
$dbc->prepare("UPDATE module SET delete_old_version=:delete_old_version WHERE ID_module=:id_module", $value); |
|
213
|
|
|
} |
|
214
|
|
|
|
|
215
|
|
|
/** |
|
216
|
|
|
* @param string $url |
|
217
|
|
|
* fonction qui permet de supprmer un dossier avec toute son abrorescence en fonction d'une URL |
|
218
|
|
|
*/ |
|
219
|
|
|
private function supprimerDossier($url) { |
|
220
|
|
|
if (is_dir($url)) { |
|
221
|
|
|
$objects = scandir($url); |
|
222
|
|
|
foreach ($objects as $object) { |
|
223
|
|
|
if ($object != "." && $object != "..") { |
|
224
|
|
|
if (filetype($url."/".$object) == "dir") $this->supprimerDossier($url."/".$object); else unlink($url."/".$object); |
|
225
|
|
|
} |
|
226
|
|
|
} |
|
227
|
|
|
reset($objects); |
|
228
|
|
|
rmdir($url); |
|
229
|
|
|
} |
|
230
|
|
|
} |
|
231
|
|
|
//-------------------------- FIN SETTER ----------------------------------------------------------------------------// |
|
232
|
|
|
} |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.