/**
  * 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
 }
Esempio n. 2
0
 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);
                 }
             }
         }
     }
 }