source: spip-zone/_plugins_/noizetier/trunk/noizetier_administrations.php @ 113140

Last change on this file since 113140 was 113140, checked in by eric@…, 5 months ago

Prise en compte du nouveau champ profondeur dans la table des noisettes et dans le service de stockage.
Ceinture et bretelles pour les champs modifiables d'une noisette conteneur ou pas : on fait aussi en sorte de pas fournir des champs inutiles même si N-Core sait les filtrer.
On améliore l'importation ieconfig mais elle ne fonctionne toujours pas correctement. La profondeur va permettre de corriger le dernier souci.

File size: 10.9 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) {
5        return;
6}
7
8/**
9 * Installation du schéma de données propre au plugin et gestion des migrations suivant
10 * les évolutions du schéma.
11 *
12 * Le schéma comprend des tables et des variables de configuration propres au plugin.
13 *
14 * @api
15 * @see boussole_declarer_tables_principales()
16 * @see boussole_declarer_tables_interfaces()
17 *
18 * @param string $nom_meta_base_version
19 *              Nom de la meta dans laquelle sera rangée la version du schéma
20 * @param string $version_cible
21 *              Version du schéma de données en fin d'upgrade
22 *
23 * @return void
24 */
25function noizetier_upgrade($nom_meta_base_version, $version_cible) {
26        $maj = array();
27
28        // Configurations par défaut
29        $config_060 = array(
30                'objets_noisettes' => array(),
31                'encapsulation_noisette' => 'on',
32                'ajax_noisette' => 'on',
33                'profondeur_max' => '',
34        );
35
36        $maj['create'] = array(
37                array('maj_tables',array('spip_noizetier_pages', 'spip_types_noisettes', 'spip_noisettes')),
38                array('ecrire_config', 'noizetier', $config_060),
39        );
40
41        $maj['0.2.0'] = array(
42                array('maj_tables',array('spip_noisettes')),
43        );
44
45        $maj['0.3.0'] = array(
46                array('sql_alter','TABLE spip_noisettes DROP COLUMN contexte'),
47        );
48
49        $maj['0.4.0'] = array(
50                array('maj_tables',array('spip_noisettes')),
51        );
52       
53        $maj['0.5.0'] = array(
54                array('maj_tables',array('spip_noisettes')),
55                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (type(255))'),
56                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (composition(255))'),
57                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (bloc(255))'),
58                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (noisette(255))'),
59                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (objet)'),
60                array('sql_alter', 'TABLE spip_noisettes ADD INDEX (id_objet)'),
61        );
62
63        $maj['0.6.0'] = array(
64                array('maj_060', $config_060),
65        );
66
67        include_spip('base/upgrade');
68        maj_plugin($nom_meta_base_version, $version_cible, $maj);
69}
70
71/**
72 * Suppression de l'ensemble du schéma de données propre au plugin, c'est-à-dire
73 * les tables et les variables de configuration.
74 *
75 * @api
76 *
77 * @param string $nom_meta_base_version
78 *              Nom de la meta dans laquelle sera rangée la version du schéma
79 *
80 * @return void
81 */
82function noizetier_vider_tables($nom_meta_base_version) {
83
84        // On efface les tables du plugin
85        sql_drop_table('spip_noizetier_pages');
86        sql_drop_table('spip_types_noisettes');
87        sql_drop_table('spip_noisettes');
88
89        // On efface la version enregistrée du schéma des données du plugin
90        effacer_meta($nom_meta_base_version);
91        // On efface la configuration du plugin
92        effacer_meta('noizetier');
93}
94
95/**
96 * Migration du schéma 0.5 au 0.6.
97 *
98 * Les actions effectuées sont les suivantes:
99 * - ajout de la tables `spip_noisettes_pages` pour stocker l'ensemble des pages et compositions
100 *   explicites et virtuelles.
101 * - ajout du champ `encapsulation` à la table `spip_noisettes` pour déterminer si le noiZetier doit inclure
102 *   la noisette concernée dans un div englobant et ajout du champ plugin pour étendre le stockage au-delà
103 *   du noiZetier.
104 * - mise à jour de la taille des champs type, composition et objet dans la table `spip_noisettes`
105 * - ajout d'une liste de variables de configuration initialisées
106 * - transfert des compositions virtuelles de la meta `noizetier_compositions` dans la nouvelle
107 *   table `spip_noizetier_pages` et suppression définitive de la meta.
108 *
109 * @param array $config_defaut
110 *              Tableau des variables de configuration intialisées.
111 *
112 * @return void
113 */
114function maj_060($config_defaut) {
115
116        // Ajout de la tables des pages du noizetier qui contiendra pages et compositions qu'elles soient
117        // explicites ou virtuelles et de la tables des types de noisette.
118        include_spip('base/create');
119        maj_tables(array('spip_noizetier_pages', 'spip_types_noisettes'));
120
121        // Modification de la table spip_noisettes
122        // -- Ajout de la colonne 'encapsulation' qui indique pour chaque noisette si le noiZetier doit l'inclure dans une capsule
123        //    englobante ou pas. Le champ prend les valeurs 'on', '' ou 'defaut' qui indique qu'il faut prendre
124        //    en compte la valeur configurée par défaut (configuration du noizetier).
125        // -- Ajout de la colonne 'plugin' qui vaut 'noizetier' pour ce plugin.
126        // -- Ajout de la colonne 'id_conteneur'.
127        // -- Ajout de la colonne 'est_conteneur' toujours à la valeur 'non' car il n'existe pas de noisette de ce type
128        // -- Ajout de la colonne 'profondeur' à la valeur par défaut 0
129        //    dans les versions précédentes du plugin.
130        sql_alter("TABLE spip_noisettes ADD plugin varchar(30) DEFAULT '' NOT NULL AFTER id_noisette");
131        sql_alter("TABLE spip_noisettes ADD id_conteneur varchar(255) DEFAULT '' NOT NULL AFTER plugin");
132        sql_alter("TABLE spip_noisettes ADD conteneur text DEFAULT '' NOT NULL AFTER id_conteneur");
133        sql_alter("TABLE spip_noisettes ADD est_conteneur varchar(3) DEFAULT 'non' NOT NULL AFTER type_noisette");
134        sql_alter("TABLE spip_noisettes ADD encapsulation varchar(6) DEFAULT 'defaut' NOT NULL AFTER parametres");
135        sql_alter("TABLE spip_noisettes ADD profondeur smallint DEFAULT 0 NOT NULL AFTER css");
136        // -- Changement du nom du champ 'rang' en 'rang_noisette'
137        sql_alter("TABLE spip_noisettes CHANGE rang rang_noisette smallint DEFAULT 1 NOT NULL");
138        // -- Changement du nom du champ 'noisette' en 'type_noisette' et de sa taille
139        sql_alter("TABLE spip_noisettes CHANGE noisette type_noisette varchar(255) DEFAULT '' NOT NULL");
140        // -- Suppression des index pour des colonnes dont on va modifier la taille ou le type
141        sql_alter("TABLE spip_noisettes DROP INDEX type");
142        sql_alter("TABLE spip_noisettes DROP INDEX composition");
143        sql_alter("TABLE spip_noisettes DROP INDEX bloc");
144        sql_alter("TABLE spip_noisettes DROP INDEX noisette");
145        // Mise à jour des tailles des colonnes type, composition et objet pour cohérence
146        sql_alter("TABLE spip_noisettes MODIFY bloc varchar(255) DEFAULT '' NOT NULL");
147        sql_alter("TABLE spip_noisettes MODIFY type varchar(127) NOT NULL");
148        sql_alter("TABLE spip_noisettes MODIFY composition varchar(127) NOT NULL");
149        sql_alter("TABLE spip_noisettes MODIFY objet varchar(25) NOT NULL");
150        // -- Création des index détruits précédemment et des nouveaux index plugin et conteneur
151        sql_alter("TABLE spip_noisettes ADD INDEX type (type)");
152        sql_alter("TABLE spip_noisettes ADD INDEX composition (composition)");
153        sql_alter("TABLE spip_noisettes ADD INDEX bloc (bloc)");
154        sql_alter("TABLE spip_noisettes ADD INDEX type_noisette (type_noisette)");
155        sql_alter("TABLE spip_noisettes ADD INDEX plugin (plugin)");
156        sql_alter("TABLE spip_noisettes ADD INDEX id_conteneur (id_conteneur)");
157        sql_alter("TABLE spip_noisettes ADD INDEX rang_noisette (rang_noisette)");
158        // -- Remplissage de la nouvelle colonne plugin avec la valeur 'noizetier'
159        //    et des colonnes id_conteneur et conteneur à partir des autres colonnes existantes.
160        $select = array('id_noisette', 'type', 'composition', 'objet', 'id_objet', 'bloc');
161        $from = 'spip_noisettes';
162        $noisettes = sql_allfetsel($select, $from);
163        if ($noisettes) {
164                include_spip('inc/ncore_conteneur');
165                foreach ($noisettes as $_cle => $_noisette) {
166                        // C'est le plugin noizetier
167                        $noisettes[$_cle]['plugin'] = 'noizetier';
168                        // On calcule le conteneur au format tableau et on appelle la fonction de service de construction
169                        // de l'id du conteneur
170                        // TODO : utiliser la fonction composer_conteneur
171                        $conteneur = array();
172                        if (!empty($_noisette['objet']) and !empty($_noisette['id_objet']) and intval($_noisette['id_objet'])) {
173                                $conteneur['objet'] = $_noisette['objet'];
174                                $conteneur['id_objet'] = $_noisette['id_objet'];
175                                $conteneur['squelette'] = $_noisette['bloc'];
176                        }
177                        else {
178                                $page = $_noisette['type'] . ($_noisette['composition'] ? "-{$_noisette['composition']}" : '');
179                                $conteneur['squelette'] = "{$_noisette['bloc']}/${page}";
180                        }
181                        $noisettes[$_cle]['conteneur'] = serialize($conteneur);
182                        $noisettes[$_cle]['id_conteneur'] = conteneur_identifier('noizetier', $conteneur);
183                }
184                sql_replace_multi($from, $noisettes);
185        }
186
187        // Mise à jour de la configuration du plugin
188        include_spip('inc/config');
189        $config = lire_config('noizetier', array());
190        if ($config and isset($config['objets_noisettes'])) {
191                $config_defaut['objets_noisettes'] = $config['objets_noisettes'];
192        }
193        ecrire_config('noizetier', $config_defaut);
194
195        // Suppression des caches devenus inutiles
196        include_spip('inc/flock');
197        supprimer_fichier(_DIR_CACHE . 'noisettes_descriptions.php');
198        supprimer_fichier(_DIR_CACHE . 'noisettes_ajax.php');
199        supprimer_fichier(_DIR_CACHE . 'noisettes_contextes.php');
200        supprimer_fichier(_DIR_CACHE . 'noisettes_inclusions.php');
201
202        // Déplacement de la liste des compositions virtuelles dans la table 'spip_noisettes_pages'
203        $compositions = lire_config('noizetier_compositions', array());
204        if ($compositions) {
205                $compositions_060 = array();
206                foreach ($compositions as $_type => $_compositions) {
207                        foreach ($_compositions as $_composition => $_description) {
208                                // Type et composition (ne sont jamais vides)
209                                $_description['type'] = $_type;
210                                $_description['composition'] = $_composition;
211                                // Construction de l'identifiant de la page
212                                $_description['page'] = "${_type}-${_composition}";
213                                // Nom par défaut si non précisé (identifiant de la page)
214                                if (empty($_description['nom'])) {
215                                        $_description['nom'] = $_description['page'];
216                                }
217                                // Icone par défaut si non précisé
218                                if (empty($_description['icon'])) {
219                                        $_description['icon'] = 'composition-24.png';
220                                }
221                                // Traitement des necessite pour identifier l'activité de la page
222                                $_description['est_active'] = 'oui';
223                                if (!empty($_description['necessite'])) {
224                                        foreach ($_description['necessite'] as $_plugin_necessite) {
225                                                if (!defined('_DIR_PLUGIN_' . strtoupper($_plugin_necessite))) {
226                                                        $_description['est_active'] = 'non';
227                                                        break;
228                                                }
229                                        }
230                                }
231                                // Blocs, necessite et branche: des tableaux à sérialiser
232                                $_description['blocs_exclus'] = isset($_description['blocs_exclus'])
233                                        ? serialize($_description['blocs_exclus'])
234                                        : serialize(array());
235                                $_description['necessite'] = isset($_description['necessite'])
236                                        ? serialize($_description['necessite'])
237                                        : serialize(array());
238                                $_description['branche'] = isset($_description['branche'])
239                                        ? serialize($_description['branche'])
240                                        : serialize(array());
241                                // Indicateur de type d'objet
242                                include_spip('base/objets');
243                                $tables_objets = array_keys(lister_tables_objets_sql());
244                                $_description['est_page_objet'] = in_array(table_objet_sql($_type), $tables_objets) ? 'oui' : 'non';
245                                // Indicateur de composition virtuelle
246                                $description['est_virtuelle'] = 'oui';
247                                $compositions_060[] = $_description;
248                        }
249                }
250                if ($compositions_060) {
251                        if (sql_preferer_transaction()) {
252                                sql_demarrer_transaction();
253                        }
254                        sql_insertq_multi('spip_noizetier_pages', $compositions_060);
255                        if (sql_preferer_transaction()) {
256                                sql_terminer_transaction();
257                        }
258                }
259        }
260        // On efface la meta des compositions maintenant que celles-ci sont stockées
261        // dans une table dédiées aux pages du noizetier
262        effacer_meta('noizetier_compositions');
263}
Note: See TracBrowser for help on using the repository browser.