source: spip-zone/_plugins_/fabrique/inc/futilitaire.php @ 62540

Last change on this file since 62540 was 62540, checked in by marcimat@…, 7 years ago

Fonction "deplacer_dossiers" pour le Futilitaire.

File size: 6.9 KB
Line 
1<?php
2
3/**
4 *  /!\   Partie experimentale.   /!\
5 *
6 *  Cette API est susceptible d'évoluer.
7**/
8
9
10/**
11 * Ce fichier contient des fonctions utiles pour
12 * lancer des actions effectues apres la creation du plugin
13 * dans le script "post_creation" de la Fabrique
14 *
15 * Ces fonctions sont encapsulees dans une classe "Futilitaire"
16 *
17**/
18
19// fichier de log des actions.
20define('_FABRIQUE_LOG_SCRIPTS', 'fabrique_scripts');
21
22
23
24/**
25 * Cette classe Futilitaires
26 * encapsule les fonctions d'aides
27 *
28 * $futil = new Futilitaire($data, $destination_plugin, $destination_ancien_plugin);
29**/
30Class Futilitaire {
31
32        public $dir_backup = "";
33        public $dir_dest = "";
34        public $data = array();
35
36        /**
37         * Le constructeur charge les infos utiles :
38         * - le tableau $data contenant les saisies utilisateurs
39         * - le lieu de destination du plugin
40         * - le lieu de sauvegarde de la precedente creation du plugin
41         *   (qui contient donc peut etre des informations/fichiers que l'on veut recuperer)
42         *
43         * @param array $data
44         *              Information complete des saisies du formulaire de creation de la fabrique
45         *              completee de quelques raccourcis
46         * @param string $dir_dest
47         *              Chemin de destination de notre plugin
48         * @param string $dir_backup
49         *              Chemin de l'ancien plugin (celui que l'on recree et que l'on a copie en sauvegarde avant)
50         *
51         * @return null
52        **/
53        public function __construct($data, $dir_dest, $dir_backup) {
54                $this->data = $data;
55                $this->dir_dest = $dir_dest;
56                $this->dir_backup = $dir_backup;
57        }
58
59        /**
60         * Log une erreur
61         *
62         * @param string $texte
63         *              Le texte a logguer.
64         *
65         * @return null
66        **/
67        public function log($texte = '') {
68                spip_log($texte, _FABRIQUE_LOG_SCRIPTS);
69        }
70
71
72        /**
73         * Deplacer une liste de fichiers
74         * du backup vers le nouveau plugin
75         * et cree les repertoires manquant si besoin dans le nouveau plugin.
76         *
77         * Usage:
78         * $futil->deplacer_fichiers(array(
79         *    'base/importer_spip_villes.php',
80         *    'base/importer_spip_villes_donnees.gz',
81         * ));
82         *
83         * @param string|array $fichiers
84         *              Liste des fichiers a déplacer
85         *
86         * @return null
87        **/
88        public function deplacer_fichiers($fichiers) {
89                static $dirs = array();
90
91                if (!$fichiers OR !$this->dir_dest OR !$this->dir_backup) {
92                        $this->log("deplacer_fichiers: Info manquante");
93                        return;
94                }
95
96                if (!is_array($fichiers)) {
97                        $fichiers = array($fichiers);
98                }
99
100                foreach ($fichiers as $f) {
101                        if (!$f) {
102                                $this->log("deplacer_fichiers: Fichier vide");
103                                continue;
104                        }
105                        $source = $this->dir_backup . $f;
106                        $dest   = $this->dir_dest   . $f;
107                        if (!file_exists($source)){
108                                $this->log("deplacer_fichiers: Fichier $f introuvable dans le backup : $dest");
109                                continue;
110                        }
111
112                        // cree l'arborescence depuis le chemin
113                        $this->creer_arborescence_destination($f);
114
115                        if (!copy($source, $dest)) {
116                                $this->log("deplacer_fichiers: Copie ratee de $source vers $dest");
117                        }
118                }
119        }
120
121
122
123        /**
124         * Deplacer une liste de dossiers/répertoires
125         * du backup vers le nouveau plugin
126         * et cree les repertoires manquant si besoin dans le nouveau plugin.
127         *
128         * Usage:
129         * $futil->deplacer_dossiers('lib');
130         * $futil->deplacer_dossiers(array('lib','actions'));
131         *
132         * @param string|array $dossiers
133         *              Liste des fichiers a déplacer
134         *
135         * @return null
136        **/
137        public function deplacer_dossiers($dossiers) {
138                static $dirs = array();
139
140                if (!$dossiers OR !$this->dir_dest OR !$this->dir_backup) {
141                        $this->log("deplacer_dossiers: Info manquante");
142                        return;
143                }
144
145                if (!is_array($dossiers)) {
146                        $dossiers = array($dossiers);
147                }
148
149                foreach ($dossiers as $d) {
150                        if (!$d) {
151                                $this->log("deplacer_dossiers: Dossier vide");
152                                continue;
153                        }
154                        $source = $this->dir_backup . $d;
155                        $dest   = $this->dir_dest   . $d;
156                        if (!is_dir($source)){
157                                $this->log("deplacer_dossiers: Dossier $d introuvable dans le backup : $dest");
158                                continue;
159                        }
160
161                        // cree l'arborescence depuis le chemin
162                        $this->log("deplacer_dossiers: Créer arborescence pour $d");
163                        $this->creer_arborescence_destination($d, false);
164
165                        // copie recursive
166                        // http://stackoverflow.com/a/7775949
167                        foreach ($iterator =
168                                        new RecursiveIteratorIterator(
169                                                new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
170                                                        RecursiveIteratorIterator::SELF_FIRST) as $item
171                                ) {
172                                if ($item->isDir()) {
173                                        if (!mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName())) {
174                                                $this->log("deplacer_dossiers: Creation ratee de " . $iterator->getSubPathName());
175                                        }
176                                } else {
177                                        if (!copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName())) {
178                                                $this->log("deplacer_dossiers: Creation ratee de " . $iterator->getSubPathName());
179                                        }
180                                }
181                        }
182                }
183        }
184
185
186
187        /**
188         * Cree les repertoires manquants dans le plugin cree
189         * par rapport au chemin desire
190         *
191         * Usage :
192         * $this->creer_arborescence_destination("inclure/config.php");
193         *
194         * @param string $chemin
195         *              Destination depuis la racine du plugin
196         * @return bool
197         *              Est-ce que c'est bien cree ?
198        **/
199        public function creer_arborescence_destination($chemin, $is_file = true) {
200                // repertoire de destination deja crees.
201                static $reps = array();
202
203                if (!$this->dir_dest) {
204                        $this->log("creer_chemin: Destination inconnue");
205                        return false;
206                }
207
208                // si c'est un fichier,
209                // on retrouve le nom du fichier et la base du chemin de destination
210                if ($is_file) {
211                        $dest = explode('/', $chemin);
212                        $nom = array_pop($dest);
213                        $chemin_dest = implode('/', $dest);
214                } else {
215                        $chemin_dest = $chemin;
216                }
217
218                // ne pas creer systematiquement les repertoires tout de meme.
219                if (!isset($reps[$chemin_dest])) {
220                        sous_repertoire_complet($this->dir_dest . $chemin_dest);
221                        $reps[$chemin_dest] = true;
222                }
223
224                return true;
225        }
226
227
228        /**
229         * Insere du code dans un fichier indique
230         *
231         * Usage:
232         * $futil->ajouter_lignes('lang/geoniche_fr.php', -3, 0, fabrique_tabulations($lignes, 1));
233         *
234         * @param string $chemin
235         *              Chemin du fichier depuis la racine du plugin
236         * @param int $debut
237         *              Ligne du depart de l'insertion
238         *              Peut etre negatif : -3 indique 3 lignes avant la fin de fichier
239         * @param int $fin
240         *              Indique combien de lignes seront supprimees du fichier a partir du debut choisi
241         *              0 (zero) pour conserver tout le code existant dans le fichier
242         * @param string $code
243         *              Le code a inserer.
244         * @return bool
245         *              Operation reussie ou pas.
246        **/
247        public function ajouter_lignes($chemin, $debut, $fin, $code) {
248
249                if (!$this->dir_dest) {
250                        $this->log("ajouter_lignes: Destination inconnue");
251                        return false;
252                }
253
254                $dest = $this->dir_dest . $chemin;
255                if (!file_exists($dest)) {
256                        $this->log("ajouter_lignes: Fichier inexistant $dest");
257                        return false;
258                }
259
260                lire_fichier($dest, $contenu);
261                if (is_null($contenu)) {
262                        $this->log("ajouter_lignes: Lecture echouee de $dest");
263                        return false;
264                }
265
266                $contenu = explode("\n", $contenu);
267                $code = explode("\n", $code);
268                array_splice($contenu, $debut, $fin, $code);
269                $contenu = implode("\n", $contenu);
270                ecrire_fichier($dest, $contenu);
271        }
272}
273
274?>
Note: See TracBrowser for help on using the repository browser.