source: spip-zone/_plugins_/polyhierarchie/trunk/polyhier_pipeline.php @ 125334

Last change on this file since 125334 was 125334, checked in by Cerdic, 5 weeks ago

eviter une fatale si charger() a renvoye une erreur sous forme de string

File size: 10.1 KB
Line 
1<?php
2/*
3 * Plugin Polyhierarchie
4 * (c) 2009-2010 Cedric Morin
5 * Distribue sous licence GPL
6 *
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11/**
12 * Afficher le chemin, avec liens indirects
13 *
14 * @param array $flux
15 * @return array
16 */
17function polyhier_affiche_hierarchie($flux){
18        $objet = $flux['args']['objet'];
19        if (in_array(table_objet_sql($objet),array_keys(lister_tables_objets_sql()))){
20                $id_objet = $flux['args']['id_objet'];
21                include_spip('inc/polyhier');
22                $parents = polyhier_get_parents($id_objet,$objet,$serveur='');
23                if (!function_exists('lire_config')) {
24                        include_spip('inc/config');
25                }
26                $profondeur = lire_config('polyhier/profondeur_chemin', 1);
27                $out = array();
28                foreach($parents as $p) {
29                        $c = array($profondeur==1?"[->rubrique$p]":"<b>[->rubrique$p]</b>");
30                        $i=1;
31                        while (($i++<$profondeur or !$profondeur) and $p) {
32                                if ($p = quete_parent_lang('spip_rubriques', $p)
33                                  and $p = $p['id_parent']) {
34                                        array_unshift($c, "[->rubrique$p]");
35                                }
36                        }
37                        $out[] = implode("&gt;", $c);
38                }
39                if ($autre = count($out)){
40                        $out = implode(', ',$out);
41                        $out = ($autre > 1) ? _T('polyhier:label_autres_parents')." ".$out : _T('polyhier:label_autre_parent')." ".$out;
42                        $out = PtoBR(propre($out));
43                        $flux['data'] .= "<div id='chemins_transverses'>$out</div>";
44                }
45
46        }
47        return $flux;
48}
49
50/**
51 * Afficher les enfants indirects d'une rubrique
52 *
53 * @param array $flux
54 * @return array
55 */
56function polyhier_affiche_enfants($flux) {
57        if (isset($flux['args']['id_rubrique']) and $id_rubrique = $flux['args']['id_rubrique']) {
58                include_spip('inc/autoriser');
59                $flux['data'] .= recuperer_fond("prive/squelettes/inclure/rubrique-enfants-indirects",$_GET, array('ajax'=>true));
60        }
61        return $flux;
62}
63
64/**
65 * Pipeline pour charger les parents transverses dans le formulaire
66 * d'edition article et rubrique
67 *
68 * @param array $flux
69 * @return array
70 */
71function polyhier_formulaire_charger($flux){
72        $form = $flux['args']['form'];
73        if (
74                (isset($flux['data']['_polyhier']) AND $objet = $flux['data']['_polyhier'] AND in_array($objet,array('article','rubrique')))
75                OR (is_array($flux['data']) and $objet = substr($form,7) AND in_array($form,array('editer_article','editer_rubrique')))
76                ){
77                // On ne fait rien si l'id_parent principal est incoherent (exemple : compat pages uniques)
78                if ($flux['data']['id_parent'] < 0) return $flux;
79
80                $id_table_objet = id_table_objet($objet);
81
82                // on met en tete l'id_parent principal
83                // pour unifier la saisie
84                $flux['data']['parents'] = array("rubrique|".$flux['data']['id_parent']);
85                if ($id_objet = intval($flux['data'][$id_table_objet])){
86                        include_spip('inc/polyhier');
87                        $parents = polyhier_get_parents($id_objet,$objet,$serveur='');
88                        foreach($parents as $p)
89                                $flux['data']['parents'][] = "rubrique|$p";
90                }
91                $flux['data']['_hidden'] .= "<input type='hidden' name='_polyhier' value='$objet' />";
92        }
93        return $flux;
94}
95
96
97/**
98 * Pipeline pour verifier les parents transverses dans le formulaire
99 * d'edition article et rubrique
100 *
101 * @param array $flux
102 * @return array
103 */
104function polyhier_formulaire_verifier($flux){
105        $form = $flux['args']['form'];
106        if ($objet = _request('_polyhier')
107                AND in_array($objet,array('article','rubrique'))){
108                // On ne fait rien si l'id_parent principal est incoherent (exemple : compat pages uniques)
109                if (_request('id_parent') < 0) return $flux;
110
111                $id_table_objet = id_table_objet($objet);
112
113                // on verifie qu'au moins un parent est present si c'est un article
114                if ((!_request('parents') or !count(_request('parents'))) AND $objet=='article'){
115                        $flux['data']['parents'] = _T('polyhier:parent_obligatoire');
116                        set_request('parents',array()); // eviter de revenir au choix initial
117                }
118                // sinon, c'est ok, on rebascule le premier parent[] dans id_parent
119                // ou on est a la racine..
120                else {
121                        $id_parent = _request('parents');
122                        $id_parent = explode('|',is_array($id_parent)?reset($id_parent):"rubrique|0");
123                        set_request('id_parent',intval(end($id_parent)));
124                        // Puisque c'est ok, on enlève l'éventuelle erreur que SPIP aurait mis sur "id_parent"
125                        unset($flux['data']['id_parent']);
126                }
127
128        }
129        return $flux;
130}
131
132/**
133 * Inserer le selecteur de rubriques trasnverses dans les formulaires d'edition
134 * article et rubrique
135 *
136 * @param string $flux
137 * @return string
138 */
139function polyhier_editer_contenu_objet($flux){
140        $args = $flux['args'];
141        $type = $args['type'];
142        if (in_array($type,array('rubrique','article'))){
143                // On ne fait rien si l'id_parent principal est incoherent (exemple : compat pages uniques)
144                if ($args['contexte']['id_parent'] < 0) return $flux;
145                $saisie = recuperer_fond("formulaires/inc-selecteur-parents",$args['contexte']);
146                if (strpos($flux['data'],'<!--polyhier-->')!==FALSE)
147                        $flux['data'] = preg_replace(',(.*)(<!--polyhier-->),ims',"\\1$saisie\\2",$flux['data'],1);
148                elseif (preg_match(",<(div|li) [^>]*class=[\"']editer editer_(descriptif|virtuel|chapo|liens_sites|texte),Uims",$flux['data'],$regs)){
149                        $flux['data'] = preg_replace(",(<(div|li) [^>]*class=[\"']editer editer_".$regs[2]."),Uims",$saisie."\\1",$flux['data'],1);
150                }
151                elseif (strpos($flux['data'],'<!--extra-->')!==FALSE)
152                        $flux['data'] = preg_replace(',(.*)(<!--extra-->),ims',"\\1$saisie\\2",$flux['data'],1);
153                else
154                        $flux['data'] = preg_replace(',(.*)(</fieldset>),ims',"\\1\\\$saisie",$flux['data'],1);
155        }
156        return $flux;
157}
158
159/**
160 * Appliquer les changements de polyhierarchie avant edition d'une rubrique ou
161 * d'un article
162 * On passe avant car si aucun autre champ n'est modifie, post_edition n'est pas appele
163 *
164 * @param array $flux
165 * @return array
166 */
167function polyhier_pre_edition($flux){
168        $objet = isset($flux['args']['type']) ? $flux['args']['type'] : '';
169
170        if (_request('_polyhier')
171                AND in_array($objet,array('article','rubrique'))
172                AND $flux['args']['action'] !== 'controler'){
173                $id_objet = $flux['args']['id_objet'];
174                $serveur = $flux['args']['serveur'];
175                $id_parents = _request('parents');
176                $id_parent = _request('id_parent');
177                if (!$id_parents)
178                        $id_parents = array();
179
180                $ids = array();
181                foreach($id_parents as $sel){
182                        $sel = explode("|",$sel);
183                        if (reset($sel)=='rubrique')
184                                $ids[] = intval(end($sel));
185                }
186
187                // on enleve le parent principal qui est gere par SPIP
188                $id_parents = array_diff($ids,array($id_parent));
189
190                include_spip('inc/polyhier');
191                $changed = polyhier_set_parents($id_objet,$objet,$id_parents,$serveur);
192                if (count($changed['add']) OR count($changed['remove'])){
193                        $statut = sql_getfetsel("statut", table_objet_sql($objet), id_table_objet($objet)."=".intval($id_objet));
194                        // si l'objet est publie, repercuter le statut sur les rubriques quittes ou ajoutees
195                        if ($statut=='publie')
196                                polyhier_calculer_rubriques_if ($id_parents, $changed,$statut);
197                }
198        }
199
200        return $flux;
201}
202
203
204/**
205 * Appliquer les changements de statut sur les rubriques polyhierarchique
206 *
207 * @param array $flux
208 * @return array
209 */
210function polyhier_post_edition($flux){
211        if (empty($flux['args']['table'])) {
212                return $flux;
213        }
214
215        $objet = objet_type($flux['args']['table']);
216
217        if (in_array($objet, array('article', 'rubrique'))
218                AND $flux['args']['action']=='instituer'
219                AND $statut_ancien = $flux['args']['statut_ancien']
220                AND isset($flux['data']['statut'])
221                AND $statut = $flux['data']['statut']){
222
223                $id_objet = $flux['args']['id_objet'];
224                $serveur = isset($flux['args']['serveur']) ? $flux['args']['serveur'] : '';
225
226                include_spip('inc/polyhier');
227                $id_parents = polyhier_get_parents($id_objet,$objet,$serveur);
228                $postdate = (isset($flux['data']['date']) AND strtotime($flux['data']['date'])>time());
229
230                polyhier_calculer_rubriques_if ($id_parents, array('statut'=>$statut,'add'=>array(),'remove'=>array()),$statut_ancien,$postdate);
231        }
232
233        return $flux;
234}
235
236/**
237 * Compter les enfants indirects d'une rubrique
238 *
239 * @param array $flux
240 * @return array
241 */
242function polyhier_objet_compte_enfants($flux) {
243
244        if ($flux['args']['objet']=='rubrique'){
245                $statut = (isset($flux['args']['statut'])?" AND A.statut=".sql_quote($flux['args']['statut']):"");
246                $postdates = ($GLOBALS['meta']["post_dates"] == "non") ?
247                        " AND A.date <= ".sql_quote(date('Y-m-d H:i:s')) : '';
248
249                if (!isset($flux['data']['articles_indirects'])) {
250                        $flux['data']['articles_indirects'] = 0;
251                        $flux['data']['rubriques_indirectes'] = 0;
252                }
253
254                $flux['data']['articles_indirects']+= sql_countsel(
255                                                "spip_rubriques_liens as RL join spip_articles as A ON (RL.objet='article' AND RL.id_objet=A.id_article)",
256                                                'RL.id_parent='.$flux['args']['id_objet'].$statut.$postdates);
257
258                $statut = (isset($flux['args']['statut'])?" AND R.statut=".sql_quote($flux['args']['statut']):"");
259
260                $flux['data']['rubriques_indirectes']+= sql_countsel(
261                                                "spip_rubriques_liens as RL join spip_rubriques as R ON (RL.objet='rubrique' AND RL.id_objet=R.id_rubrique)",
262                                                'RL.id_parent='.$flux['args']['id_objet'].$statut);
263        }
264        return $flux;
265}
266
267
268function polyhier_calculer_rubriques($flux) {
269
270        // d'abord les articles indirects
271        $r = sql_select("rub.id_rubrique AS id, max(fille.date) AS date_h",
272                                        "spip_rubriques AS rub
273                                                JOIN spip_rubriques_liens as RL ON rub.id_rubrique = RL.id_parent
274                                                JOIN spip_articles as fille ON (RL.objet='article' AND RL.id_objet=fille.id_article)",
275                                        "fille.statut='publie' AND rub.date_tmp <= fille.date",
276                                        "rub.id_rubrique");
277        while ($row = sql_fetch($r)) {
278                sql_updateq("spip_rubriques", array("statut_tmp" => 'publie', "date_tmp" => $row['date_h']), "id_rubrique=".$row['id']);
279        }
280
281        // puis les rubriques qui ont une rubrique fille indirecte plus recente
282        // on tourne tant que les donnees remontent vers la racine.
283        do {
284                $continuer = false;
285                $r = sql_select("rub.id_rubrique AS id, max(fille.date_tmp) AS date_h",
286                                                "spip_rubriques AS rub
287                                                        JOIN spip_rubriques_liens as RL ON rub.id_rubrique = RL.id_parent
288                                                        JOIN spip_rubriques as fille ON (RL.objet='rubrique' AND RL.id_objet=fille.id_rubrique)",
289                                                "fille.statut_tmp='publie' AND (rub.date_tmp < fille.date_tmp OR rub.statut_tmp<>'publie')",
290                                                "rub.id_rubrique");
291                while ($row = sql_fetch($r)) {
292                  sql_updateq('spip_rubriques', array('statut_tmp'=>'publie', 'date_tmp'=>$row['date_h']),"id_rubrique=".$row['id']);
293                        $continuer = true;
294                }
295        } while ($continuer);
296
297        return $flux;
298}
299
300/* pour que le pipeline ne rale pas ! */
301function polyhier_autoriser(){}
302
303?>
Note: See TracBrowser for help on using the repository browser.