source: spip-zone/_plugins_/tickets/trunk/tickets_options.php @ 81313

Last change on this file since 81313 was 81313, checked in by severo@…, 5 years ago

tickets - fonctions pour préparer la migration.

Ne fait rien pour l'instant...

File size: 10.2 KB
Line 
1<?php
2/**
3 * Plugin Tickets
4 * Licence GPL (c) 2008-2013
5 *
6 * @package SPIP\Tickets\Options
7 */
8 
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11/**
12 * Activer le plugin no_spam sur les tickets
13 */
14$GLOBALS['formulaires_no_spam'][] = 'editer_ticket';
15// Liste des pages de configuration dans l'ordre de presentation
16define('_TICKETS_PAGES_CONFIG', 'general:autorisations');
17
18/**
19 * Récupérer dans la base la liste des mots-clés liés au ticket
20 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
21 */
22function valeur_champ_mots_ticket($table, $id, $champ) {
23        return valeur_champ_mots_objet($table, $id, $champ);
24}
25
26/**
27 * Récupérer dans la base la liste des mots-clés liés au ticket pour
28 * groupe de mots donné
29 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
30 */
31function valeur_champ_groupemots_ticket($table, $id, $champ) {
32        return valeur_champ_mots_objet($table, $id, $champ);
33}
34
35/**
36 * Récupérer dans la base la liste des mots-clés liés à l'objet
37 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
38 */
39function valeur_champ_mots_objet($table, $ids, $champ) {
40        list($id_objet, $id_groupe) = explode('-', $ids);
41        list(, $objet) = explode('_', $champ);
42
43        $where = array(
44                "m.id_mot = ml.id_mot",
45                "ml.id_objet=".sql_quote($id_objet),
46                "ml.objet=".sql_quote($objet)
47        );
48        if ($id_groupe > 0)
49                $where[] = "m.id_groupe=" . sql_quote($id_groupe);
50
51        $valeurs = sql_allfetsel("m.id_mot", "spip_mots AS m, spip_mots_liens AS ml", $where);
52        $valeurs = array_map('array_shift', $valeurs);
53
54        return $valeurs;
55}
56
57/**
58 * Modifier dans la base la liste des mots-clés liés au ticket
59 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
60 */
61function mots_ticket_revision($id, $colonnes, $type_objet) {
62        return mots_objet_revision($id, $colonnes, $type_objet, 'mots_ticket');
63}
64
65/**
66 * Modifier dans la base la liste des mots-clés liés au ticket pour un
67 * groupe de mots donné
68 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
69 */
70function groupemots_ticket_revision($id, $colonnes, $type_objet) {
71        return mots_objet_revision($id, $colonnes, $type_objet, 'groupemots_ticket');
72}
73
74/**
75 * Modifier dans la base la liste des mots-clés liés à l'objet
76 * http://marcimat.magraine.net/Crayon-de-mots-pour-un-article
77 */
78function mots_objet_revision($ids, $colonnes, $type_objet, $champ = '') {
79        if (!$champ) return false;
80
81        list($id_objet, $id_groupe) = explode('-', $ids);
82        list(, $type_liaison) = explode('_', $champ);
83
84        /* On vérifie qu'on a le droit d'associer des mots l'objet
85         * il serait mieux de le vérifier pour chaque groupe de mots (voir
86         * les options de la fonction autoriser_associermots_dist)
87         */
88        if (!autoriser('associermots',$type_liaison,$id_objet)) return false;
89
90        // actuellement en bdd
91        $old = valeur_champ_mots_objet($type_objet, $ids, $champ);
92        // ceux qu'on veut maintenant (on vérifie que ce sont des indices)
93        $new = array_filter(explode(',', $colonnes[$champ]),'is_numeric');
94        // les mots à supprimer
95        $del = array_diff($old, $new);
96        // les mots à ajouter
97        $add = array_diff($new, $old);
98
99        include_spip('action/editer_liens');
100        if ($del) {
101                objet_dissocier(array('mot'=>$del), array($type_liaison => $id_objet));
102        }
103        if ($add) {
104                objet_associer(array('mot'=>$add), array($type_liaison => $id_objet));
105        }
106
107        return true;
108}
109
110function ticket_id_assigne_revision($id, $colval = array(), $type = ''){
111        $a = crayons_update($id, $colval, $type);
112
113        if ($notifications = charger_fonction('notifications', 'inc')) {
114                foreach ($colval as $col => $val) {
115                        if ($col=="id_assigne") {
116                                $notifications('assignerticket', $id, array('id_auteur' => $val));
117                        }
118                }
119        }
120       
121        return $a;
122}
123
124
125/*
126 * Migrer 7 champs de la table spip_tickets vers des groupes de mots-clés
127 *
128 * Le résultat de la migration est stocké dans une meta au cas où :
129 *
130 * tickets/migration_180/champs/severite/id_groupe (int)
131 *                                      /erreur_groupe (str)
132 *                                      /valeurs/1/id_mot (int)
133 *                                                /erreur_mot (str)
134 */
135function migrer_champs_vers_mots_cles() {
136        include_spip('inc/config');
137        include_spip('action/editer_groupe_mots');
138        include_spip('action/editer_mot');
139        $trouver_table = charger_fonction('trouver_table','base');
140        $desc = $trouver_table(table_objet_sql('ticket'));
141        if (!$desc OR !array_key_exists('field',$desc))
142                return;
143        else
144                $field = $desc['field'];
145
146        $a_migrer = array(
147                'severite'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_severite_th'),'unseul'=>'oui','obligatoire'=>'oui')),
148                'tracker'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_type_th'),'unseul'=>'oui','obligatoire'=>'oui')),
149                'navigateur'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_navigateur'),'unseul'=>'non','obligatoire'=>'non')),
150                'projet'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_projet_th'),'unseul'=>'oui','obligatoire'=>'non'),'meta'=>'tickets/general/projets'),
151                'composant'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_composant_th'),'unseul'=>'oui','obligatoire'=>'non'),'meta'=>'tickets/general/composants'),
152                'version'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_version_th'),'unseul'=>'oui','obligatoire'=>'non'),'meta'=>'tickets/general/versions'),
153                'jalon'=>array('champs_groupe'=>array('titre'=>_T('tickets:champ_jalon_th'),'unseul'=>'oui','obligatoire'=>'non'),'meta'=>'tickets/general/jalons')
154                );
155
156        // pour chaque champ
157        spip_log("**** migration 1.8.0 - début ****", "tickets");
158        foreach ($a_migrer as $k=>$v) {
159                // est-ce que la colonne existe encore ?
160                if (!array_key_exists($k,$field))
161                        continue;
162
163                // récupérer la liste de valeurs du champ (base de données ou code)
164                $valeurs = array();
165                $f = 'tickets_liste_'.$k;
166                if (function_exists($f))
167                        $valeurs = $f();
168                if (count($valeurs)) {
169                        // si non vide, créer le groupe de mots
170                        // on regarde dans la meta si on a déjà migré ce champ
171                        $meta = 'tickets/migration_180/champs/'.$k.'/id_groupe';
172                        $meta_err = 'tickets/migration_180/champs/'.$k.'/erreur_groupe';
173                        if (!intval($id_groupe = lire_config($meta))) {
174                                $v['champs_groupe'] = array_merge($v['champs_groupe'], array('tables_liees'=>'tickets','comite'=>'non','forum'=>'non','minirezo'=>'oui'));
175                                $id_groupe = groupemots_inserer();
176                                if ($id_groupe>0 AND $err = groupemots_modifier($id_groupe, $v['champs_groupe'])) {
177                                        ecrire_config($meta_err,'Erreur - '.$err);
178                                        continue;
179                                }
180                                ecrire_config($meta,intval($id_groupe));
181                                spip_log(" champ '".$k."' - création du groupe id_groupe = ".$id_groupe, "tickets");
182                        } else {
183                                spip_log(" champ '".$k."' - groupe id_groupe = ".$id_groupe." déjà créé", "tickets");
184                        }
185                        // créer un mot-clé pour chaque valeur
186                        foreach ($valeurs as $kv=>$vv) {
187                                // on regarde si on a déjà migré ce mot
188                                $meta = 'tickets/migration_180/champs/'.$k.'/valeurs/'.$kv.'/id_mot';
189                                $meta_err = 'tickets/migration_180/champs/'.$k.'/valeurs/'.$kv.'/erreur_mot';
190                                if (!intval($id_mot = lire_config($meta))) {
191                                        $id_mot = mot_inserer($id_groupe);
192                                        if ($id_mot>0 AND $err = mot_modifier($id_mot, array('titre'=>$vv))) {
193                                                ecrire_config($meta_err,'Erreur - '.$err);
194                                                continue;
195                                        }
196                                        ecrire_config($meta,intval($id_mot));
197                                        spip_log("   valeur '".$kv."' - création du mot id_mot = ".$id_mot, "tickets");
198                                } else {
199                                        spip_log("   valeur '".$kv."' - mot id_mot = ".$id_mot." déjà créé", "tickets");
200                                }
201                                // lier les tickets correspondant à ce mot-clé
202                                $ids_tickets = array_map('array_shift',sql_allfetsel(id_table_objet('ticket'), table_objet_sql('ticket'), $k."='".$kv."'"));
203                                $nb_lies = mot_associer($id_mot, array('ticket'=>$ids_tickets));
204                                spip_log('     '.$nb_lies.' tickets liés','tickets');
205                        }
206                }
207                // supprimer la configuration du champ dans spip_meta
208                if (array_key_exists('meta',$v)) {
209                        effacer_config($v['meta']);
210                        spip_log('   valeurs du champs "'.$k.'" supprimées dans la meta "'.$v['meta'].'"','tickets');
211                }
212                // supprimer la colonne de la table spip_tickets
213                sql_alter("TABLE ".table_objet_sql('ticket')." DROP ".$k);
214                spip_log('   colonne "'.$k.'" supprimée','tickets');
215        }
216        spip_log("**** migration 1.8.0 - fin ****", "tickets");
217}
218
219function nettoyer_migration_champs_vers_mots_cles() {
220        include_spip('inc/autoriser');
221        include_spip('action/editer_mot');
222
223        $c = lire_config('tickets/migration_180/champs', array());
224        $supprimer_groupe_mots = charger_fonction('supprimer_groupe_mots','action');
225
226        spip_log("**** nettoyage de la migration 1.8.0 - début ****", "tickets");
227        foreach ($c as $k=>$v) {
228                $meta = 'tickets/migration_180/champs/'.$k.'/valeurs';
229                if (is_array($valeurs = lire_config($meta))) {
230                        foreach ($valeurs as $kv=>$vv) {
231                                $meta = 'tickets/migration_180/champs/'.$k.'/valeurs/'.$kv.'/id_mot';
232                                if (intval($id_mot = lire_config($meta))) {
233                                        spip_log("   valeur '".$kv."' - suppression du mot id_mot=".$id_mot,"tickets");
234                                        mot_supprimer($id_mot);
235                                        effacer_config('tickets/migration_180/champs/'.$kv.'/valeurs/'.$kv);
236                                }
237                        }
238                }
239                $meta = 'tickets/migration_180/champs/'.$k.'/id_groupe';
240                if (intval($id_groupe = lire_config($meta))) {
241                        spip_log(" champ '".$k."' - suppression de groupe id_groupe=".$id_groupe,"tickets");
242                        $supprimer_groupe_mots($id_groupe);
243                }
244                effacer_config('tickets/migration_180/champs/'.$k);
245        }
246        effacer_config('tickets/migration_180/champs');
247        effacer_config('tickets/migration_180');
248        spip_log("**** nettoyage de la migration 1.8.0 - fin ****", "tickets");
249}
250
251function tickets_liste_projet(){
252        return tickets_liste_champ('_TICKETS_LISTE_PROJETS','tickets/general/projets');
253}
254function tickets_liste_composant(){
255        return tickets_liste_champ('_TICKETS_LISTE_COMPOSANTS','tickets/general/composants');
256}
257function tickets_liste_version(){
258        return tickets_liste_champ('_TICKETS_LISTE_VERSIONS','tickets/general/versions');
259}
260function tickets_liste_jalon(){
261        return tickets_liste_champ('_TICKETS_LISTE_JALONS','tickets/general/jalons');
262}
263function tickets_liste_champ($constante,$meta){
264        $liste = array();
265        if (defined($constante) OR lire_config($meta)) {
266                if (defined($constante))
267                        $liste = explode(":", constant($constante));
268                else
269                        $liste = explode(":", lire_config($meta));
270
271                $liste = array_filter(array_map('trim',$liste));
272                $liste = array_combine($liste, $liste);
273        }
274        return $liste;
275}
276
277?>
Note: See TracBrowser for help on using the repository browser.