source: spip-zone/_plugins_/champs_extras2/core/inc/cextras_gerer.php @ 32222

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

Corriger le bug de non installation des Champs Extras de plugin lorsqu'on active les 2 plugins en même temps (CE2 et le plugin dépendant).

File size: 6.6 KB
Line 
1<?php
2if (!defined("_ECRIRE_INC_VERSION")) return;
3
4include_spip('inc/cextras');
5
6// retourne la liste des objets valides utilisables par le plugin
7// (dont on peut afficher les champs dans les formulaires)
8function cextras_objets_valides(){
9       
10        $objets = array();
11       
12        $objets_extensibles = pipeline("objets_extensibles", array(
13                'article'     => _T('cextras:table_article'),
14                'auteur'      => _T('cextras:table_auteur'),
15                'breve'       => _T('cextras:table_breve'),
16                'groupes_mot' => _T('cextras:table_groupes_mot'),
17                'mot'         => _T('cextras:table_mot'),
18                'rubrique'    => _T('cextras:table_rubrique'),
19                'site'        => _T('cextras:table_site')
20        ));
21       
22        foreach ($objets_extensibles as $objet => $traduction) {
23                $objets[$objet] = array(
24                        'table' => table_objet_sql($objet), 
25                        'type' => objet_type($objet), 
26                        'nom' => $traduction,
27                );
28        }
29
30        return $objets;
31}
32
33// retourne la liste des types de formulaires de saisie
34// utilisables par les champs extras
35// (crayons appelle cela des 'controleurs')
36function cextras_types_formulaires(){
37        $types = array();
38
39        foreach(_chemin() as $dir) {
40                if (@is_dir($s = $dir.'extra-saisies/')) {
41                        foreach(preg_files($s, '.*.html$') as $saisie) {
42                                $type = basename($saisie,'.html');
43                                $types[$type] = array(
44                                        'nom' => _T('cextras:type', array('type' => $type))
45                                );
46                        }
47                }
48        }
49        return $types;
50}
51
52
53/**
54 * Installe des champs extras et
55 * gere en meme temps la mise a jour de la meta
56 * du plugin concernant la base de donnee
57 */
58function installer_champs_extras($champs, $nom_meta_base_version, $version_cible) {
59        $current_version = 0.0;
60        if ((!isset($GLOBALS['meta'][$nom_meta_base_version]))
61        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
62                // cas d'une installation
63                if ($current_version==0.0){
64                        creer_champs_extras($champs);
65                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible,'non');
66                }
67        }       
68}
69
70/**
71 * Cree en base les champs extras demandes
72 * @param $champs : objet ChampExtra ou tableau d'objets ChampExtra
73 */
74function creer_champs_extras($champs) {
75        if (!$champs) {
76                return;
77        }
78       
79        if (!is_array($champs)) 
80                $champs = array($champs);
81                               
82        // on recupere juste les differentes tables a mettre a jour
83        $tables = array();
84        foreach ($champs as $c){ 
85                if ($table = table_objet_sql($c->table)) {
86                        $tables[$table] = $table;
87                }
88        }       
89
90        // on met a jour les tables trouvees
91        if ($tables) {
92                // recharger les tables principales et auxiliaires
93                include_spip('base/serial');
94                include_spip('base/auxiliaires');
95                global $tables_principales, $tables_auxiliaires;
96                base_serial($tables_principales);
97                base_auxiliaires($tables_auxiliaires);
98               
99                // inclure les champs extras declares ALORS que le pipeline
100                // n'est pas encore actif : important lorsqu'on active
101                // en meme temps CE2 et un plugin dependant
102                // et non l'un apres l'autre
103                if (!defined('_CHAMPS_EXTRAS_DECLARES')) {
104                        include_spip('base/cextras');
105                        $tables_principales = cextras_declarer_tables_principales($tables_principales);
106                }
107
108                // executer la mise a jour
109                include_spip('base/create');
110                maj_tables($tables);
111        }
112}
113
114/**
115 * Desinstaller des champs extras
116 * et gerer la suppression de la meta du plugin concernant
117 * la base de donnee
118 */
119function desinstaller_champs_extras($champs, $nom_meta_base_version) {
120        vider_champs_extras($champs);
121        effacer_meta($nom_meta_base_version);   
122}
123
124/**
125 * Supprime les champs extras
126 * @param $champs : objet ChampExtra ou tableau d'objets ChampExtra
127 */
128function vider_champs_extras($champs) {
129        if (!is_array($champs)) 
130                $champs = array($champs);
131               
132        // on efface chaque champ trouve
133        foreach ($champs as $c){ 
134                if ($table = table_objet_sql($c->table) and $c->champ and $c->sql) {
135                        sql_alter("TABLE $table DROP $c->champ");
136                }
137        }       
138}
139
140
141
142/**
143 *
144 * Rechercher les champs non declares mais existants
145 * dans la base de donnee en cours
146 * (code d'origine : _fil_)
147 *
148 */
149
150// liste les tables et les champs que le plugin et spip savent gerer
151function extras_champs_utilisables($connect='') {
152        $tout = extras_champs_anormaux($connect);
153        $objets = cextras_objets_valides();
154
155        $tables_utilisables = array();
156        foreach ($objets as $o){$tables_utilisables[] = $o['table'];}
157        foreach ($tout as $table=>$champs) {
158                if (!in_array($table, $tables_utilisables)) {
159                        unset($tout[$table]);
160                }
161        }
162        return $tout;
163}
164
165// Liste les champs anormaux par rapport aux definitions de SPIP
166// (aucune garantie que $connect autre que la connexion principale fasse quelque chose)
167function extras_champs_anormaux($connect='') {
168        // recuperer les tables et champs accessibles
169        $tout = extras_base($connect);
170
171        // recuperer les champs SPIP connus
172        include_spip('base/auxiliaires');
173        include_spip('base/serial');
174        $tables_spip = array_merge($GLOBALS['tables_principales'], $GLOBALS['tables_auxiliaires']);
175
176        // chercher ce qui est different
177        $ntables = array();
178        $nchamps = array();
179        foreach ($tout as $table => $champs) {
180                if (!isset($tables_spip[$table]['field'])) {
181                        $nchamps[$table] = $champs;
182                } else {
183                        foreach($champs as $champ => $desc) {
184                                if (!isset($tables_spip[$table]['field'][$champ])) {
185                                        $nchamps[$table][$champ] = $desc;
186                                }
187                        }
188                }
189        }
190
191        unset($tout);
192        if($nchamps) {
193                $tout = $nchamps;
194        } else {
195                $tout = array();
196        }
197
198        return $tout;
199}
200
201// etablit la liste de tous les champs de toutes les tables du connect donne
202// ignore la table 'spip_test'
203function extras_base($connect='') {
204        $champs = array();
205        foreach (extras_tables($connect) as $table) {
206                if ($table != 'spip_test') {
207                        $champs[$table] = extras_champs($table, $connect);
208                }
209        }
210        return $champs;
211}
212
213// liste les tables dispos ans la connexion $connect
214function extras_tables($connect='') {
215        $a = array();
216        if ($s = sql_showbase(null, $connect)) {
217                while ($t = sql_fetch($s, $connect)) {
218                                $a[] = array_pop($t);
219                }
220        }
221        return $a;
222}
223
224
225// liste les champs dispos dans la table $table de la connexion $connect
226function extras_champs($table, $connect) {
227        $desc = sql_showtable($table, null, $connect);
228        if (is_array($desc['field'])) {
229                return $desc['field'];
230        } else {
231                return array();
232        }
233}
234
235
236/** fonctions non utilisees du futur defunt plugin extras2 **
237
238// Liste les connexions disponibles dans config/
239function extras_connexions() {
240        $connexions = array();
241        foreach(preg_files(_DIR_CONNECT.'.*[.]php$') as $fichier) {
242                if (lire_fichier($fichier, $contenu)
243                AND strpos($contenu, 'spip_connect_db')
244                )
245                        $connexions[] = basename($fichier, '.php');
246        }
247
248        return $connexions;
249}
250
251
252// etablit la liste de tous les champs de toutes les tables de toutes les bases dispos
253function extras_tout() {
254        $champs = array();
255        foreach(extras_connexions() as $connect)
256                foreach (extras_tables($connect) as $table)
257                        $champs[$connect][$table] = extras_champs($table, $connect);
258
259        return $champs;
260}
261*/
262?>
Note: See TracBrowser for help on using the repository browser.