[PLUGINS] +clavettes et dependances
[lhc/web/clavette_www.git] / www / plugins / champs_extras3 / inc / cextras.php
1 <?php
2
3 /**
4 * Déclaration d'autorisations pour les champs extras
5 *
6 * @package SPIP\Cextras\Fonctions
7 **/
8
9 // sécurité
10 if (!defined("_ECRIRE_INC_VERSION")) return;
11
12
13 /**
14 * Log une information
15 *
16 * @param mixed $contenu
17 * Contenu à loger
18 * @param bool $important
19 * Est-ce une info importante à loger ?
20 */
21 function extras_log($contenu, $important=false) {
22 if ($important) {
23 spip_log($contenu, 'extras.'. _LOG_INFO);
24 } else {
25 spip_log($contenu, 'extras.'. _LOG_INFO_IMPORTANTE);
26 }
27 }
28
29
30 /**
31 * Retourne la liste des objets valides utilisables
32 *
33 * C'est à dire les objets dont on peut afficher les champs dans les
34 * formulaires, ce qui correspond aux objets éditoriaux déclarés
35 * comme avec l'option principale.
36 *
37 * @return array
38 * Couples (table sql => description de l'objet éditorial)
39 */
40 function cextras_objets_valides(){
41
42 $objets = array();
43 $tables = lister_tables_objets_sql();
44 ksort($tables);
45
46 foreach($tables as $table => $desc) {
47 if (($desc['editable'] == 'oui') and ($desc['principale'] == 'oui')) {
48 $objets[$table] = $desc;
49 }
50 }
51
52 return $objets;
53 }
54
55
56
57
58 /**
59 * Liste les saisies ayant des traitements
60 *
61 * Retourne uniquement les saisies ayant traitements à appliquer sur
62 * les champs tel que des traitements typo ou traitements raccourcis.
63 *
64 * @param array $saisies
65 * Liste de saisies
66 * @param String $tri
67 * Tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
68 * @return array
69 * Liste de ces saisies triées par nom ayant des traitements définis
70 **/
71 function saisies_lister_avec_traitements($saisies, $tri = 'nom') {
72 return saisies_lister_avec_option('traitements', $saisies, $tri);
73 }
74
75
76
77 /**
78 * Créer les champs extras (colonnes en base de données)
79 * definies par le lot de saisies donné
80 *
81 * @param string $table
82 * Nom de la table SQL
83 * @param array $saisies
84 * Description des saisies
85 * @return bool|void
86 * False si pas de table ou aucune saisie de type SQL
87 **/
88 function champs_extras_creer($table, $saisies) {
89 if (!$table) {
90 return false;
91 }
92 if (!is_array($saisies) OR !count($saisies)) {
93 return false;
94 }
95
96 // uniquement les saisies décrivant SQL
97 include_spip('inc/saisies');
98 $saisies = saisies_lister_avec_sql($saisies);
99 if (!$saisies) {
100 return false;
101 }
102
103 $desc = lister_tables_objets_sql($table);
104
105 // parcours des saisies et ajout des champs extras nouveaux dans
106 // la description de la table
107 foreach ($saisies as $saisie) {
108 $nom = $saisie['options']['nom'];
109 // le champ ne doit pas deja exister !
110 if (!isset($desc['field'][$nom])) {
111 $desc['field'][$nom] = $saisie['options']['sql'];
112 }
113 }
114
115 // executer la mise a jour
116 include_spip('base/create');
117 creer_ou_upgrader_table($table, $desc, true, true);
118 }
119
120
121 /**
122 * Supprimer les champs extras (colonne dans la base de données)
123 * definies par le lot de saisies donné
124 *
125 * @param string $table
126 * Nom de la table SQL
127 * @param array $saisies
128 * Description des saisies
129 * @return bool
130 * False si pas de table, aucune saisie de type SQL, ou une suppression en erreur
131 * True si toutes les suppressions sont OK
132 **/
133 function champs_extras_supprimer($table, $saisies) {
134 if (!$table) {
135 return false;
136 }
137 if (!is_array($saisies) OR !count($saisies)) {
138 return false;
139 }
140
141 include_spip('inc/saisies');
142 $saisies = saisies_lister_avec_sql($saisies);
143
144 if (!$saisies) {
145 return false;
146 }
147
148 $desc = lister_tables_objets_sql($table);
149
150 $ok = true;
151 foreach ($saisies as $saisie) {
152 $nom = $saisie['options']['nom'];
153 if (isset($desc['field'][$nom])) {
154 $ok &= sql_alter("TABLE $table DROP COLUMN $nom");
155 }
156 }
157 return $ok;
158 }
159
160
161 /**
162 * Modifier les champs extras (colonne dans la base de données)
163 * definies par le lot de saisies donné
164 *
165 * Permet de changer la structure SQL ou le nom de la colonne
166 * des saisies
167 *
168 * @param string $table
169 * Nom de la table SQL
170 * @param array $saisies_nouvelles
171 * Description des saisies nouvelles
172 * @param array $saisies_anciennes
173 * Description des saisies anciennes
174 * @return bool
175 * True si les changement SQL sont correctement effectués
176 **/
177 function champs_extras_modifier($table, $saisies_nouvelles, $saisies_anciennes) {
178 $ok = true;
179 foreach ($saisies_nouvelles as $id => $n) {
180 $n_nom = $n['options']['nom'];
181 $n_sql = $n['options']['sql'];
182 $a_nom = $saisies_anciennes[$id]['options']['nom'];
183 $a_sql = $saisies_anciennes[$id]['options']['sql'];
184 if ($n_nom != $a_nom OR $n_sql != $n_sql) {
185 $ok &= sql_alter("TABLE $table CHANGE COLUMN $a_nom $n_nom $n_sql");
186 }
187 }
188 return $ok;
189 }
190
191
192 /**
193 * Complète un tableau de mise à jour de plugin afin d'installer les champs extras.
194 *
195 * @example
196 * ```
197 * cextras_api_upgrade(motus_declarer_champs_extras(), $maj['create']);
198 * ```
199 *
200 * @param array $declaration_champs_extras
201 * Liste de champs extras à installer, c'est à dire la liste de saisies
202 * présentes dans le pipeline declarer_champs_extras() du plugin qui demande l'installation
203 * @param array $maj_item
204 * Un des éléments du tableau d'upgrade $maj,
205 * il sera complété des actions d'installation des champs extras demandés
206 *
207 * @return bool
208 * false si les déclarations sont mal formées
209 * true sinon
210 **/
211 function cextras_api_upgrade($declaration_champs_extras, &$maj_item) {
212 if (!is_array($declaration_champs_extras)) {
213 return false;
214 }
215 if (!is_array($maj_item)) {
216 $maj_item = array();
217 }
218 foreach($declaration_champs_extras as $table=>$champs) {
219 $maj_item[] = array('champs_extras_creer',$table, $champs);
220 }
221
222 return true;
223 }
224
225
226 /**
227 * Supprime les champs extras declarés
228 *
229 * @example
230 * ```
231 * cextras_api_vider_tables(motus_declarer_champs_extras());
232 * ```
233 *
234 * @param array $declaration_champs_extras
235 * Liste de champs extras à désinstaller, c'est à dire la liste de saisies
236 * présentes dans le pipeline declarer_champs_extras() du plugin qui demande la désinstallation
237 *
238 * @return bool
239 * false si déclaration mal formée
240 * true sinon
241 **/
242 function cextras_api_vider_tables($declaration_champs_extras) {
243 if (!is_array($declaration_champs_extras)) {
244 return false;
245 }
246 foreach($declaration_champs_extras as $table=>$champs) {
247 champs_extras_supprimer($table, $champs);
248 }
249 return true;
250 }
251
252
253 /*
254 *
255 * Rechercher les champs non declares mais existants
256 * dans la base de donnee en cours
257 * (code d'origine : _fil_)
258 *
259 */
260
261 /**
262 * Liste les tables et les champs que le plugin et spip savent gérer
263 * mais qui ne sont pas déclarés à SPIP
264 *
265 * @param string $connect
266 * Nom du connecteur de base de données
267 * @return array
268 * Tableau (table => couples(colonne => description SQL))
269 */
270 function extras_champs_utilisables($connect='') {
271 $tout = extras_champs_anormaux($connect);
272 $objets = cextras_objets_valides();
273 $utilisables = array_intersect_key($tout, $objets);
274 ksort($utilisables);
275 return $utilisables;
276 }
277
278 /**
279 * Liste les champs anormaux par rapport aux définitions de SPIP
280 *
281 * @note
282 * Aucune garantie que $connect autre que la connexion principale fasse quelque chose
283 *
284 * @param string $connect
285 * Nom du connecteur de base de données
286 * @return array
287 * Tableau (table => couples(colonne => description SQL))
288 */
289 function extras_champs_anormaux($connect='') {
290 static $tout = false;
291 if ($tout !== false) {
292 return $tout;
293 }
294 // recuperer les tables et champs de la base de donnees
295 // les vrais de vrai dans la base sql...
296 $tout = extras_base($connect);
297
298 // recuperer les champs SPIP connus
299 // si certains ne sont pas declares alors qu'ils sont presents
300 // dans la base sql, on pourra proposer de les utiliser comme champs
301 // extras (plugin interface).
302 include_spip('base/objets');
303 $tables_spip = lister_tables_objets_sql();
304
305 // chercher ce qui est different
306 $ntables = array();
307 $nchamps = array();
308 // la table doit être un objet editorial
309 $tout = array_intersect_key($tout, $tables_spip);
310 foreach ($tout as $table => $champs) {
311 // la table doit être un objet editorial principal
312 if ($tables_spip[$table]['principale'] == 'oui') {
313 // pour chaque champ absent de la déclaration, on le note dans $nchamps.
314 foreach($champs as $champ => $desc) {
315 if (!isset($tables_spip[$table]['field'][$champ])) {
316 if (!isset($nchamps[$table])) {
317 $nchamps[$table] = array();
318 }
319 $nchamps[$table][$champ] = $desc;
320 }
321 }
322 }
323 }
324
325 if($nchamps) {
326 $tout = $nchamps;
327 } else {
328 $tout = array();
329 }
330
331 return $tout;
332 }
333
334 /**
335 * Établit la liste de tous les champs de toutes les tables de la connexion
336 * sql donnée
337 *
338 * Ignore la table 'spip_test'
339 *
340 * @param string $connect
341 * Nom du connecteur de base de données
342 * @return array
343 * Tableau (table => couples(colonne => description SQL))
344 */
345 function extras_base($connect='') {
346 $champs = array();
347
348 foreach (extras_tables($connect) as $table) {
349 if ($table != 'spip_test') {
350 $champs[$table] = extras_champs($table, $connect);
351 }
352 }
353 return $champs;
354 }
355
356
357 /**
358 * Liste les tables SQL disponibles de la connexion sql donnée
359 *
360 * @param string $connect
361 * Nom du connecteur de base de données
362 * @return array
363 * Liste de tables SQL
364 */
365 function extras_tables($connect='') {
366 $a = array();
367 $taille_prefixe = strlen( $GLOBALS['connexions'][$connect ? $connect : 0]['prefixe'] );
368
369 if ($s = sql_showbase(null, $connect)) {
370 while ($t = sql_fetch($s, $connect)) {
371 $t = 'spip' . substr(array_pop($t), $taille_prefixe);
372 $a[] = $t;
373 }
374 }
375 return $a;
376 }
377
378
379 /**
380 * Liste les champs dispos dans la table SQL de la connexion sql donnée
381 *
382 * @param string $table
383 * Nom de la table SQL
384 * @param string $connect
385 * Nom du connecteur de base de données
386 * @return array
387 * Couples (colonne => description SQL)
388 */
389 function extras_champs($table, $connect) {
390 $desc = sql_showtable($table, true, $connect);
391 if (is_array($desc['field'])) {
392 return $desc['field'];
393 } else {
394 return array();
395 }
396 }
397
398 ?>