source: spip-zone/_plugins_/groupes_mots_arborescents/gma_pipelines.php @ 63401

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

Plugin «Groupes de mots arborescents» de préfixe «gma» qui permet de faire des hiérarchies de groupes de mots.

Il ne fonctionne pour l'instant qu'avec la version trunk du plugin mots.

On peut donc créer une arborescence de groupes de mots, et mettre des mots dans chaque groupe.

  • Les propriétés d'un sous groupe de mots héritent automatiquement du groupe racine (et ne sont pas modifiable hors du groupe racine)
  • Le squelettes de liaison des mots clés sont sur surchargés pour ne lister que les groupes racines, et afficher dans les sélecteurs l'arborescence complète des groupes et mots.
  • On ne peut supprimer un groupe que si le groupe n'a pas de sous groupe

Par ailleurs, on utilise une implémentation de QueryPath? (http://querypath.org/) (non sans mal) pour modifier le code HTML du formulaire de groupes de mots.

Cette librairie quoi que très bien s'appuie sur la classe domDocument elle même s'appuyant sur libxml2 qui a un léger bug lors de l'import d'un texte HTML qui possède des CDATA dans des scripts : la librairie double alors ces échappements par des nouveaux ! Du coup, on les enlève avant d'utiliser la librairie (qui de toutes façons les remets).

Cette librairie pourrait être mise dans un plugin spécifique car très pratique une fois les soucis réglés (CDATA et passer le texte en unicode avant importation).

File size: 7.2 KB
Line 
1<?php
2/**
3 * Plugin Groupes arborescents de mots clés
4 * (c) 2012 Marcillaud Matthieu
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return;
9
10
11/**
12 * Ajoute la liste des sous groupes et un bouton de création de
13 * sous groupe sur la vue d'un groupe.
14 *
15 * @param array $flux
16 *              Données du pipeline
17 * @return array
18 *              Données du pipeline complétées
19**/
20function gma_afficher_complement_objet($flux) {
21        // sur la vue d'un groupe de mot
22        if ($flux['args']['type'] == 'groupemots') {
23                $id = $flux['args']['id'];
24                // completer la vue avec les informations des sous groupes
25                $flux['data'] .= recuperer_fond(
26                        "prive/squelettes/contenu/inc-groupes_mots", array('id_parent' => $id), "ajax"
27                );
28        }
29        return $flux;
30}
31
32
33/**
34 * Ajoute le parent dans l'environnement d'un nouveau groupe de mot
35 * s'il est connu
36 *
37 * @param array $flux
38 *              Données du pipeline
39 * @return array
40 *              Données du pipeline complétées
41**/
42function gma_formulaire_charger($flux) {
43        // sur le formulaire d'édition de groupe de mot
44        if ($flux['args']['form'] == 'editer_groupe_mot') {
45                // si c'est un nouveau groupe
46                if ($flux['data']['id_groupe'] == 'oui') {
47                        // le parent est dans l'url ?
48                        if ($id_parent = _request('id_parent')) {
49                                $flux['data']['id_parent'] = $id_parent;
50                        }
51                }
52        }
53        return $flux;
54}
55
56
57/**
58 * Verifie que le parent d'un groupe de mot
59 * n'est pas ce groupe lui-même !
60 *
61 * @param array $flux
62 *              Données du pipeline
63 * @return array
64 *              Données du pipeline complétées
65**/
66function gma_formulaire_verifier($flux) {
67        // sur le formulaire d'édition de groupe de mot
68        if ($flux['args']['form'] == 'editer_groupe_mot') {
69                // tester que le parent ne vaut pas le groupe
70                if ($id_parent = _request('id_parent')
71                and $id_groupe = _request('id_groupe')
72                and $id_parent == $id_groupe) {
73                                $flux['data']['id_parent'] = _T('gma:erreur_parent_sur_groupe');
74                }
75        }
76        return $flux;
77}
78
79
80/**
81 * Modifie les champs du formulaire de groupe de mot
82 * pour :
83 * - ajouter le sélecteur de parenté
84 * - n'afficher les options techniques que sur la racine
85 *
86 * @param array $flux
87 *              Données du pipeline
88 * @return array
89 *              Données du pipeline complétées
90**/
91function gma_formulaire_fond($flux) {
92        // sur le formulaire d'édition de groupe de mot
93        if ($flux['args']['form'] == 'editer_groupe_mot') {
94
95
96                $html = $flux['data'];
97                $env = $flux['args']['contexte'];
98               
99                // charger QueryPath
100                include_spip('inc/querypath');
101                $qp = spip_query_path($html, 'body');
102
103                // la parenté sur tous
104                // on recupere le selecteur et on l'ajoute après le titre...
105                $selecteur_parent = recuperer_fond('formulaires/selecteur_groupe_parent', $env);
106                $qp->top('body')->find('li.editer_titre')->after($selecteur_parent);
107
108                // les paramètres techniques sont uniquement sur les groupes racine
109                if ($env['id_parent']) {
110                        $qp->top('body')->find('li.fieldset_config')->remove();
111                }
112
113                // retourner le HTML modifie
114                $flux['data'] = $qp->top('body>div')->xhtml();
115        }
116        return $flux;
117}
118
119
120/**
121 * Insère des modifications lors de la création de groupes et de mots
122 *
123 * Lors de la création d'un groupe de mot :
124 * - Ajoute l'id_groupe_racine et l'id_parent
125 *
126 * Lors de la création d'un mot
127 * - Définit l'id_groupe_racine
128 *
129 * @param array $flux
130 *              Données du pipeline
131 * @return array
132 *              Données du pipeline complétées
133**/
134function gma_pre_insertion($flux) {
135        // lors de la création d'un groupe
136        if ($flux['args']['table'] == 'spip_groupes_mots')
137        {
138                if ($id_parent = _request('id_parent')) {
139                        $id_racine = sql_getfetsel('id_groupe_racine', 'spip_groupes_mots', 'id_groupe=' . sql_quote($id_parent));
140                        // si et seulement si le parent demandé existe
141                        if ($id_racine) {
142                                $flux['data']['id_parent'] = $id_parent;
143                                $flux['data']['id_groupe_racine'] = $id_racine;
144                        }
145                }
146        }
147
148        // lors de la création d'un mot
149        if ($flux['args']['table'] == 'spip_mots')
150        {
151                // on récupère la racine et on l'ajoute
152                $id_groupe = $flux['data']['id_groupe'];
153                $id_racine = sql_getfetsel('id_groupe_racine', 'spip_groupes_mots', 'id_groupe=' . sql_quote($id_groupe));
154                $flux['data']['id_groupe_racine'] = $id_racine;
155        }
156        return $flux;
157}
158
159/**
160 * Insère des modifications lors de l'édition des groupes ou des mots
161 *
162 * Lors de l'édition d'un groupe de mot :
163 * - Modifie l'id_parent choisi et définit l'id_groupe_racine
164 *
165 * Lors de l'édition d'un mot
166 * - Définit l'id_groupe_racine
167 *
168 * @param array $flux
169 *              Données du pipeline
170 * @return array
171 *              Données du pipeline complétées
172**/
173function gma_pre_edition($flux) {
174        // lors de l'édition d'un groupe
175        $table = 'spip_groupes_mots';
176        if ($flux['args']['table'] == $table
177        and $flux['args']['action'] == 'modifier')
178        {
179                $id_groupe = $flux['args']['id_objet'];
180                $id_parent_ancien  = sql_getfetsel('id_parent', $table, 'id_groupe=' . sql_quote($id_groupe));
181                $id_parent_nouveau = _request('id_parent');
182                // uniquement s'ils sont différents
183                if ($id_parent_ancien != $id_parent_nouveau
184                // que le nouveau parent n'est pas notre groupe !
185                and $id_groupe != $id_parent_nouveau
186                ) {
187                        $id_racine = '';
188                        // soit c'est la racine
189                        if (!$id_parent_nouveau) {
190                                // auquel cas l'identifiant racine est le meme que notre groupe, qui migre à la racine
191                                $id_racine = $id_groupe;
192                        // soit le groupe existe
193                        } else {
194                                $id_racine = sql_getfetsel('id_groupe_racine', $table, 'id_groupe=' . sql_quote($id_parent_nouveau));
195                        }
196                        if ($id_racine) {
197                                $flux['data']['id_parent']        = $id_parent_nouveau;
198                                $flux['data']['id_groupe_racine'] = $id_racine;
199                                // pour le pipeline de post_edition. Permet entre autre de savoir
200                                // qu'il faudra actualiser les mots de la branche
201                                set_request('gma_definir_heritages', true);
202                        }
203                }
204        }
205
206        // lors de l'édition d'un mot
207        $table = 'spip_mots';
208        if ($flux['args']['table'] == $table
209        and $flux['args']['action'] == 'instituer')
210        {
211                $id_mot = $flux['args']['id_objet'];
212                // on récupère le nouveau groupe (et l'ancien)
213                $id_groupe_nouveau = $flux['data']['id_groupe'];
214                $id_groupe_ancien  = sql_getfetsel('id_groupe', $table, 'id_mot=' . sql_quote($id_mot));
215                // s'il a changé, on insère la nouvelle racine dans le mot
216                if ($id_groupe_nouveau != $id_groupe_ancien) {
217                        $id_racine = sql_getfetsel('id_groupe_racine', 'spip_groupes_mots', 'id_groupe=' . sql_quote($id_groupe_nouveau));
218                        $flux['data']['id_groupe_racine'] = $id_racine;
219                }
220        }
221        return $flux;
222}
223
224/**
225 * Modifie les données héritées d'un groupe de mot
226 *
227 * Modifie les héritages lorsqu'un parent change ou lorsqu'on modifie
228 * un groupe racine qui a pu changer des paramètres de config
229 *
230 * @param array $flux
231 *              Données du pipeline
232 * @return array
233 *              Données du pipeline complétées
234**/
235function gma_post_edition($flux) {
236        // lors de l'édition d'un groupe
237        $table = 'spip_groupes_mots';
238        if ($flux['args']['table']  == $table
239        and $flux['args']['action'] == 'modifier'
240        // soit le parent a change, soit le groupe racine est modifie
241        and (_request('gma_definir_heritages')
242            OR !isset($flux['data']['id_parent'])
243            OR !$flux['data']['id_parent']))
244        {
245                $id_groupe = $flux['args']['id_objet'];
246                include_spip('gma_fonctions');
247                // ne mettre à jour les mots que lorsque le parent a change
248                $update_mots = (bool) _request('gma_definir_heritages');
249                gma_definir_heritages($id_groupe, null, $update_mots);
250        }
251        return $flux;
252}
253
254?>
Note: See TracBrowser for help on using the repository browser.