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

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

«La Fabrique» est un outil de création de plugin (pour gérer des objets éditoriaux) pour SPIP 3.0

File size: 5.1 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 $source
84         *              Répertoire source
85         * @param string $dest
86         *              Répertoire destination
87         * @param string|array $fichiers
88         *              Liste des fichiers a déplacer
89         *
90         * @return null
91        **/
92        public function deplacer_fichiers($fichiers) {
93                static $dirs = array();
94
95                if (!$fichiers OR !$this->dir_dest OR !$this->dir_backup) {
96                        $this->log("deplacer_fichiers: Info manquante");
97                        return;
98                }
99
100                if (!is_array($fichiers)) {
101                        $fichiers = array($fichiers);
102                }
103
104                foreach ($fichiers as $f) {
105                        if (!$f) {
106                                $this->log("deplacer_fichiers: Fichier vide");
107                                continue;
108                        }
109                        $source = $this->dir_backup . $f;
110                        $dest   = $this->dir_dest   . $f;
111                        if (!file_exists($source)){
112                                $this->log("deplacer_fichiers: Fichier introuvable dans le backup : $dest");
113                                continue;
114                        }
115
116                        // cree l'arborescence depuis le chemin
117                        $this->creer_arborescence_destination($f);
118
119                        if (!copy($source, $dest)) {
120                                $this->log("deplacer_fichiers: Copie ratee de $source vers $dest");
121                        }
122                }
123        }
124
125
126        /**
127         * Cree les repertoires manquants dans le plugin cree
128         * par rapport au chemin desire
129         *
130         * Usage :
131         * $this->creer_arborescence_destination("inclure/config.php");
132         *
133         * @param string $chemin
134         *              Destination depuis la racine du plugin
135         * @return bool
136         *              Est-ce que c'est bien cree ?
137        **/
138        public function creer_arborescence_destination($chemin) {
139                // repertoire de destination deja crees.
140                static $reps = array();
141
142                if (!$this->dir_dest) {
143                        $this->log("creer_chemin: Destination inconnue");
144                        return false;
145                }
146
147                // on retrouve le nom du fichier et la base du chemin de destination
148                $dest = explode('/', $chemin);
149                $nom = array_pop($dest);
150                $chemin_dest = implode('/', $dest);
151
152                // ne pas creer systematiquement les repertoires tout de meme.
153                if (!isset($reps[$chemin_dest])) {
154                        sous_repertoire_complet($this->dir_dest . $chemin_dest);
155                        $reps[$chemin_dest] = true;
156                }
157
158                return true;
159        }
160
161
162        /**
163         * Insere du code dans un fichier indique
164         *
165         * Usage:
166         * $futil->ajouter_lignes('lang/geoniche_fr.php', -3, 0, fabrique_tabulations($lignes, 1));
167         *
168         * @param string $chemin
169         *              Chemin du fichier depuis la racine du plugin
170         * @param int $debut
171         *              Ligne du depart de l'insertion
172         *              Peut etre negatif : -3 indique 3 lignes avant la fin de fichier
173         * @param int $fin
174         *              Indique combien de lignes seront supprimees du fichier a partir du debut choisi
175         *              0 (zero) pour conserver tout le code existant dans le fichier
176         * @param string $code
177         *              Le code a inserer.
178         * @return bool
179         *              Operation reussie ou pas.
180        **/
181        public function ajouter_lignes($chemin, $debut, $fin, $code) {
182
183                if (!$this->dir_dest) {
184                        $this->log("ajouter_lignes: Destination inconnue");
185                        return false;
186                }
187
188                $dest = $this->dir_dest . $chemin;
189                if (!file_exists($dest)) {
190                        $this->log("ajouter_lignes: Fichier inexistant $dest");
191                        return false;
192                }
193
194                lire_fichier($dest, $contenu);
195                if (is_null($contenu)) {
196                        $this->log("ajouter_lignes: Lecture echouee de $dest");
197                        return false;
198                }
199
200                $contenu = explode("\n", $contenu);
201                $code = explode("\n", $code);
202                array_splice($contenu, $debut, $fin, $code);
203                $contenu = implode("\n", $contenu);
204                ecrire_fichier($dest, $contenu);
205        }
206}
207
208?>
Note: See TracBrowser for help on using the repository browser.