/** * Cette fonction permet de désinstaller un plugin * * Pour ce faire, elle va chercher directement dans la classe du fichier plugin.php les variables qui contiennent les informations nécessaires : * $plugin->filesCopy La variable qui contient à la base la liste des fichiers à copier * $plugin->sourceFolder Détermine le dossier source des fichiers à copier. Le plus souvent, c'est " dirname(__FILE__).DS.'install' ", mais cela peut changer * * @param integer $id Identifiant du plugin à désinstaller * @access public * @author koéZionCMS * @version 0.1 - 30/03/2013 by AA * @version 0.2 - 29/10/2013 by FI - Reprise de la fonction pour la terminer... */ public function backoffice_uninstall($id) { $errors = array(); $plugin = $this->Plugin->findFirst(array('conditions' => array('id' => $id))); //On récupère le nom du plugin //On ne réalise la désinstallation que si le plugin est installé if ($plugin['installed']) { $pluginName = Inflector::camelize($plugin['code']) . 'Plugin'; //Génération du nom du plugin $pluginFile = PLUGINS . DS . $plugin['code'] . DS . 'plugin.php'; //Chemin vers le fichier d'installation du plugin if (FileAndDir::fexists($pluginFile)) { //Si le fichier plugin.php existe require_once $pluginFile; //Chargement du fichier $pluginClass = new $pluginName(); //Création d'un objet plugin ////////////////////////////////// // ACTIONS BDD // ////////////////////////////////// $sql[] = 'DELETE FROM `modules` WHERE `plugin_id` = ' . $id . ';'; //Requête de suppression des modules $sql[] = 'DELETE FROM `modules_types` WHERE `plugin_id` = ' . $id . ';'; //Requête de suppression du type de module $sql[] = 'DELETE FROM `plugins` WHERE `id` = ' . $id . ';'; //Requête de suppression du plugin //ON VA RECUPERER, SI IL Y EN A, LA LISTE DES TABLES ASSOCIEES AU PLUGIN EN COURS DE SUPPRESSION $databaseTables = $this->Plugin->table_list_in_database(); //Liste des tables de la BDD $databasePluginTables = array(); //Liste des tables du plugin $databasePluginTablesPrefix = 'plugins_' . $plugin['code']; //Préfix des tables du plugin //On va parcourir la liste des tables de la base de données pour en extraire les tables associées au plugin //Elles seront ensuite renommées en vue d'une suppression manuelle par le gestionnaire de la BDD foreach ($databaseTables as $databaseTable) { if (substr_count($databaseTable, $databasePluginTablesPrefix)) { $sql[] = "RENAME TABLE `" . $databaseTable . "` TO `_" . $databaseTable . "_" . date("Ymd_His") . "`;"; } } //Si on a des requêtes supplémentaires à exécuter //Prévu pour supprimer les types de modules par exemple if ($pluginClass->fileSqlDelete) { $sql[] = $pluginClass->fileSqlDelete; } //On va récupérer l'identifiant du type de module à supprimer //$modulesTypeIdResult = current($this->Plugin->query("SELECT DISTINCT(`modules_type_id`) FROM `modules` WHERE `plugin_id` = ".$id.";", true)); //$modulesTypeId = $modulesTypeIdResult['modules_type_id']; //if($modulesTypeId != 6) { $this->Plugin->query('DELETE FROM `modules_types` WHERE `id` = '.$modulesTypeId.';'); } //On supprime le type de module associé à ce plugin $sql = implode("\n", $sql); $this->Plugin->query($sql); ////////////////////////////////// // ACTIONS FICHIERS // ////////////////////////////////// //Si des fichiers doivent être supprimés, on les récupère dans le plugin //A REPRENDRE VOIR EVENTUELLEMENT SI ON SUPPRIME PAS LA CLASSE FileAndDir??? if (isset($pluginClass->filesCopy)) { //Création du dossier de backup des fichiers de configuration du plugin if ($pluginClass->path) { $deletePath = $pluginClass->path . DS . 'delete' . DS . date("Ymd_His"); FileAndDir::createPath($deletePath); } foreach ($pluginClass->filesCopy as $fileDelete) { if (isset($fileDelete['sourceName'])) { //On récupère le nom du fichier de destination (par défaut ce sera le même que la source) $destinationName = isset($fileDelete['destinationName']) ? $fileDelete['destinationName'] : $fileDelete['sourceName']; $fileToDelete = $fileDelete['destinationPath'] . DS . $destinationName; //Chemin du fichier de destination if (isset($deletePath)) { FileAndDir::fcopy($fileToDelete, $deletePath . DS . $destinationName); } //Sauvegarde du fichier $processResult = FileAndDir::remove($fileToDelete); //Suppression du fichier if (!$processResult) { $errors[] = $fileToDelete; } } else { //Backup des fichiers, on va copier le dossier parent $pathInfos = pathinfo($fileDelete['destinationPath']); FileAndDir::createPath($deletePath . DS . $pathInfos['filename']); FileAndDir::recursive_copy($fileDelete['destinationPath'], $deletePath . DS . $pathInfos['filename']); FileAndDir::recursive_delete($fileDelete['destinationPath']); } //Si l'index removePath est défini à true, alors on supprime le dossier en plus du fichier if (isset($fileDelete['removePath']) && $fileDelete['removePath'] == true) { FileAndDir::remove_directory($fileDelete['destinationPath']); } } if (!empty($errors)) { Session::setFlash('Une erreur est survenue lors de la suppression de certains fichiers :<br />' . implode('<br />* ', $errors), 'error'); $this->redirect('backoffice/plugins/index'); //On retourne sur la page de listing } } } else { Session::setFlash("Le fichier plugin.php n'existe pas", 'error'); $this->redirect('backoffice/plugins/index'); //On retourne sur la page de listing } } else { Session::setFlash('Le plugin doit être installé pour pouvoir être désinstallé', 'error'); $this->redirect('backoffice/plugins/index'); //On retourne sur la page de listing } FileAndDir::delete_directory_file(TMP . DS . 'cache' . DS . 'models' . DS); //Suppression du fichier de cache de la bdd FileAndDir::remove(TMP . DS . 'cache' . DS . 'variables' . DS . 'Plugins' . DS . 'plugins.cache'); //Suppression du fichier de cache des plugins Session::setFlash('Le plugin a été correctement désinstallé'); $this->redirect('backoffice/plugins/index'); //On retourne sur la page de listing }
protected function _delete_cache() { if (isset($this->cachingFiles)) { foreach ($this->cachingFiles as $file) { if (FileAndDir::dexists($file)) { Cache::delete_cache_directory($file); } else { if (FileAndDir::fexists($file)) { FileAndDir::remove($file); } } } } }