4 * Déclaration d'autorisations pour les champs extras
6 * @package SPIP\Cextras\Fonctions
10 if (!defined("_ECRIRE_INC_VERSION")) return;
16 * @param mixed $contenu
18 * @param bool $important
19 * Est-ce une info importante à loger ?
21 function extras_log($contenu, $important=false) {
23 spip_log($contenu, 'extras.'. _LOG_INFO
);
25 spip_log($contenu, 'extras.'. _LOG_INFO_IMPORTANTE
);
31 * Retourne la liste des objets valides utilisables
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.
38 * Couples (table sql => description de l'objet éditorial)
40 function cextras_objets_valides(){
43 $tables = lister_tables_objets_sql();
46 foreach($tables as $table => $desc) {
47 if (($desc['editable'] == 'oui') and ($desc['principale'] == 'oui')) {
48 $objets[$table] = $desc;
59 * Liste les saisies ayant des traitements
61 * Retourne uniquement les saisies ayant traitements à appliquer sur
62 * les champs tel que des traitements typo ou traitements raccourcis.
64 * @param array $saisies
67 * Tri par défaut des résultats (s'ils ne sont pas deja triés) ('nom', 'identifiant')
69 * Liste de ces saisies triées par nom ayant des traitements définis
71 function saisies_lister_avec_traitements($saisies, $tri = 'nom') {
72 return saisies_lister_avec_option('traitements', $saisies, $tri);
78 * Créer les champs extras (colonnes en base de données)
79 * definies par le lot de saisies donné
81 * @param string $table
83 * @param array $saisies
84 * Description des saisies
86 * False si pas de table ou aucune saisie de type SQL
88 function champs_extras_creer($table, $saisies) {
92 if (!is_array($saisies) OR !count($saisies)) {
96 // uniquement les saisies décrivant SQL
97 include_spip('inc/saisies');
98 $saisies = saisies_lister_avec_sql($saisies);
103 $desc = lister_tables_objets_sql($table);
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'];
115 // executer la mise a jour
116 include_spip('base/create');
117 creer_ou_upgrader_table($table, $desc, true, true);
122 * Supprimer les champs extras (colonne dans la base de données)
123 * definies par le lot de saisies donné
125 * @param string $table
126 * Nom de la table SQL
127 * @param array $saisies
128 * Description des saisies
130 * False si pas de table, aucune saisie de type SQL, ou une suppression en erreur
131 * True si toutes les suppressions sont OK
133 function champs_extras_supprimer($table, $saisies) {
137 if (!is_array($saisies) OR !count($saisies)) {
141 include_spip('inc/saisies');
142 $saisies = saisies_lister_avec_sql($saisies);
148 $desc = lister_tables_objets_sql($table);
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");
162 * Modifier les champs extras (colonne dans la base de données)
163 * definies par le lot de saisies donné
165 * Permet de changer la structure SQL ou le nom de la colonne
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
175 * True si les changement SQL sont correctement effectués
177 function champs_extras_modifier($table, $saisies_nouvelles, $saisies_anciennes) {
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");
193 * Complète un tableau de mise à jour de plugin afin d'installer les champs extras.
197 * cextras_api_upgrade(motus_declarer_champs_extras(), $maj['create']);
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
208 * false si les déclarations sont mal formées
211 function cextras_api_upgrade($declaration_champs_extras, &$maj_item) {
212 if (!is_array($declaration_champs_extras)) {
215 if (!is_array($maj_item)) {
218 foreach($declaration_champs_extras as $table=>$champs) {
219 $maj_item[] = array('champs_extras_creer',$table, $champs);
227 * Supprime les champs extras declarés
231 * cextras_api_vider_tables(motus_declarer_champs_extras());
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
239 * false si déclaration mal formée
242 function cextras_api_vider_tables($declaration_champs_extras) {
243 if (!is_array($declaration_champs_extras)) {
246 foreach($declaration_champs_extras as $table=>$champs) {
247 champs_extras_supprimer($table, $champs);
255 * Rechercher les champs non declares mais existants
256 * dans la base de donnee en cours
257 * (code d'origine : _fil_)
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
265 * @param string $connect
266 * Nom du connecteur de base de données
268 * Tableau (table => couples(colonne => description SQL))
270 function extras_champs_utilisables($connect='') {
271 $tout = extras_champs_anormaux($connect);
272 $objets = cextras_objets_valides();
273 $utilisables = array_intersect_key($tout, $objets);
279 * Liste les champs anormaux par rapport aux définitions de SPIP
282 * Aucune garantie que $connect autre que la connexion principale fasse quelque chose
284 * @param string $connect
285 * Nom du connecteur de base de données
287 * Tableau (table => couples(colonne => description SQL))
289 function extras_champs_anormaux($connect='') {
290 static $tout = false;
291 if ($tout !== false) {
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);
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();
305 // chercher ce qui est different
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();
319 $nchamps[$table][$champ] = $desc;
335 * Établit la liste de tous les champs de toutes les tables de la connexion
338 * Ignore la table 'spip_test'
340 * @param string $connect
341 * Nom du connecteur de base de données
343 * Tableau (table => couples(colonne => description SQL))
345 function extras_base($connect='') {
348 foreach (extras_tables($connect) as $table) {
349 if ($table != 'spip_test') {
350 $champs[$table] = extras_champs($table, $connect);
358 * Liste les tables SQL disponibles de la connexion sql donnée
360 * @param string $connect
361 * Nom du connecteur de base de données
363 * Liste de tables SQL
365 function extras_tables($connect='') {
367 $taille_prefixe = strlen( $GLOBALS['connexions'][$connect ?
$connect : 0]['prefixe'] );
369 if ($s = sql_showbase(null, $connect)) {
370 while ($t = sql_fetch($s, $connect)) {
371 $t = 'spip' . substr(array_pop($t), $taille_prefixe);
380 * Liste les champs dispos dans la table SQL de la connexion sql donnée
382 * @param string $table
383 * Nom de la table SQL
384 * @param string $connect
385 * Nom du connecteur de base de données
387 * Couples (colonne => description SQL)
389 function extras_champs($table, $connect) {
390 $desc = sql_showtable($table, true, $connect);
391 if (is_array($desc['field'])) {
392 return $desc['field'];