source: spip-zone/_plugins_/diogene/diogene/trunk/diogene_pipelines.php @ 97999

Last change on this file since 97999 was 97999, checked in by kent1@…, 3 years ago

Nettoyage

File size: 36.7 KB
Line 
1<?php
2/**
3 * Plugin Diogene
4 *
5 * Auteurs :
6 * b_b
7 * kent1 (http://www.kent1.info - kent1@arscenic.info)
8 *
9 * Distribue sous licence GNU/GPL
10 *
11 * Utilisation des pipelines par Diogene
12 *
13 * @package SPIP\Diogenes\Pipelines
14 **/
15
16if (!defined('_ECRIRE_INC_VERSION')) {
17        return;
18}
19
20/**
21 * Insertion dans le pipeline jqueryui_plugins (jQuery UI)
22 * On ajoute le datepicker pour être sûr de bénéficier des styles pour le datepicker
23 *
24 * @param $plugins array
25 *              La liste des plugins jqueryui à insérer
26 * @return $plugins array
27 *              La liste des plugins complétée
28 */
29function diogene_jqueryui_plugins($plugins) {
30        $plugins[] = 'jquery.ui.datepicker';
31        return $plugins;
32}
33/**
34 * Insertion dans le pipeline insert_head_css (SPIP)
35 *
36 * Compromis entre faire deux hits pour de petits fichiers sur la page d'upload
37 * ou les trimballer sur tout le site dans une css compressée pour quelques octets (on choisi la 2)
38 *
39 * @param $flux string
40 *              Le contenu de la balise #INSERT_HEAD_CSS
41 * @return $flux string
42 *              Le contenu de la balise modifié
43 */
44function diogene_insert_head_css($flux) {
45        $diogene_css = direction_css(find_in_path('css/diogene.css'), lang_dir());
46        $flux .= "<link rel='stylesheet' type='text/css' media='all' href='$diogene_css' />\n";
47        return $flux;
48}
49/**
50 * Insertion dans le pipeline editer_contenu_objet (SPIP)
51 *
52 * Insère ou enlève les champs dans le formulaire
53 * que l'on souhaite ajouter ou supprimer
54 *
55 * @param array $flux
56 *              Le contexte du pipeline
57 * @return array $flux
58 *              Le contexte du pipeline modifié
59 */
60function diogene_editer_contenu_objet($flux) {
61        $args = $flux['args'];
62        $type = $args['type'];
63        $pipeline = pipeline('diogene_objets', array());
64        if (in_array($type, array_keys($pipeline))) {
65                $langues_dispos = explode(',', $GLOBALS['meta']['langues_multilingue']);
66
67                /**
68                 * Recherche de l'id_secteur afin de trouver le bon diogène
69                 * - soit on a un id_secteur > 0 dans le contexte;
70                 * - soit on a un id_parent dans le contexte et on cherche son secteur
71                 */
72                $id_secteur = ($args['contexte']['id_secteur'] > 0) ?
73                        $args['contexte']['id_secteur'] :
74                        sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique='.intval($args['contexte']['id_parent']));
75
76                /**
77                 * Cas des pages uniques
78                 *
79                 * On n'a pas d'id_secteur et on a un id_parent dans le contexte soit = 0 soit = -1
80                 * Du coup c'est le cas d'une page unique, on change donc le type en "page", id_secteur en "0"
81                 */
82                if (!$id_secteur
83                        and (($args['contexte']['id_parent'] == 0)
84                                or ($args['contexte']['id_parent'] == '-1')
85                                or (!$args['contexte']['id_parent'] and !$args['contexte']['parents']))
86                        and ($type=='article')) {
87                        $id_secteur='0';
88                        $type = 'page';
89                }
90
91                /**
92                 * Création de la clause Where de la requète pour trouver dans quel diogène on est
93                 */
94                if ($type == 'article') {
95                        if ($id_diogene = intval(_request('id_diogene'))) {
96                                $where = 'id_diogene = '.intval($id_diogene).' AND id_secteur='.intval($id_secteur)." AND objet IN ('article','emballe_media')";
97                        } else {
98                                $where = 'id_secteur='.intval($id_secteur)." AND objet IN ('article','emballe_media')";
99                        }
100                }
101
102                if (!$where) {
103                        if ((!$id_secteur) && $pipeline[$type]['diogene_max'] == 1) {
104                                $where = 'objet=' . sql_quote($type);
105                        } else {
106                                $where = 'id_secteur='.intval($id_secteur).' AND objet='.sql_quote($type);
107                        }
108                }
109
110                /**
111                 * On n'agit que si on a trouvé un diogene
112                 */
113                if ($diogene = sql_fetsel('*', 'spip_diogenes', $where)) {
114                        /**
115                         * On ajoute dans l'environnement les champs ajoutés par diogènes et ses sous plugins
116                         */
117                        if (unserialize($diogene['champs_ajoutes']) == 'false') {
118                                $args['diogene_ajouts'] = array();
119                        } else {
120                                $args['diogene_ajouts'] = unserialize($diogene['champs_ajoutes']);
121                        }
122
123                        /**
124                         * On ajoute dans l'environnement les options des complements
125                         */
126                        if (unserialize($diogene['options_complements']) == 'false') {
127                                $args['options_complements'] = array();
128                        } else {
129                                $args['options_complements'] = unserialize($diogene['options_complements']);
130                        }
131
132                        /**
133                         * On vire les champs que l'on ne souhaite pas
134                         */
135                        if ($diogene['objet'] == 'page') {
136                                $diogene['champs_caches']['id_parent'];
137                        }
138
139                        /**
140                         * Si on a des champs à cacher :
141                         * - On les enlève si présents dans la conf
142                         * - Avant de les enlever, on vérifie bien qu'ils ne soient pas remplis, si ils le sont,
143                         * on laisse le champ jusqu'à ce qu'il soit vide
144                         */
145                        if (is_array($champs_caches = unserialize($diogene['champs_caches']))) {
146                                foreach ($champs_caches as $champ) {
147                                        if ($champ == 'urlref') {
148                                                $champ = 'liens_sites';
149                                        }
150                                        if (($champ == 'liens_sites') && preg_match(",<li [^>]*class=[\"']editer editer_($champ).*<fieldset>.*<\/fieldset>.*<\/li>,Uims", $flux['data'], $regs)) {
151                                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer (editer_$champ).*<fieldset>.*<\/fieldset>.*<\/li>),Uims", '', $flux['data'], 1);
152                                        } elseif (($champ != 'liens_site')
153                                                and (!isset($args['contexte'][$champ])
154                                                        or (strlen($args['contexte'][$champ]) == 0))
155                                                and preg_match(",<li [^>]*class=[\"']editer editer_($champ).*<\/li>,Uims", $flux['data'], $regs)) {
156                                                $flux['data'] = preg_replace(",<li [^>]*class=[\"']editer editer_$champ.*<\/li>,Uims", '', $flux['data'], 1);
157                                        }
158                                }
159                        }
160
161                        if ($type == 'page') {
162                                $type='article';
163                                $args['type'] = 'article';
164                                $old_type = 'page';
165                        }
166
167                        /**
168                         * On ajoute ce que l'on souhaite ajouter avant le formulaire
169                         *
170                         * Pour cela, on utilise un pipeline diogene_avant_formulaire utilisable à partir d'autres plugins
171                         *
172                         * Par défaut :
173                         * - Si on trouve un fichier javascript/$type.js ($type étant le type d'objet : article, rubrique...), on le charge en amont
174                         * - Si on trouve un fichier javascript/$diogene['type'].js ($diogene['type'] étant l'identifiant du diogene), on le charge en amont
175                         */
176                        if (preg_match(",<div [^>]*class=[\"'][^>]*formulaire_editer_($type),Uims", $flux['data'], $regs)) {
177                                $args['champs_ajoutes'] = $diogene['champs_ajoutes'];
178                                $args['diogene_identifiant'] = $diogene['type'];
179                                $ajouts = pipeline('diogene_avant_formulaire', array('args' => $args,'data' => ''));
180                                if ($js = find_in_path('javascript/'.$type.'.js')) {
181                                        $ajouts .= "<script type='text/javascript' src='$js'></script>\n";
182                                } elseif ($js = find_in_path('javascript/'.$type.'.js.html')) {
183                                        $js = produire_fond_statique('javascript/'.$type.'.js', array('type_objet' => $type));
184                                        $ajouts .= "<script type='text/javascript' src='$js'></script>\n";
185                                } elseif ($js = find_in_path('javascript/'.$diogene['type'].'.js')) {
186                                        $ajouts .= "<script type='text/javascript' src='$js'></script>\n";
187                                } elseif ($js = find_in_path('javascript/'.$diogene['type'].'.js.html')) {
188                                        $js = produire_fond_statique('javascript/'.$diogene['type'].'.js', array('type_objet' => $diogene['type']));
189                                        $ajouts .= "<script type='text/javascript' src='$js'></script>\n";
190                                }
191                                $flux['data'] = preg_replace(",(<div [^>]*class=[\"'][^>]*formulaire_editer_$type),Uims", $ajouts."\\1", $flux['data'], 1);
192                        }
193                        /**
194                         * On ajoute le formulaire de langue sur les articles
195                         */
196                        if ($old_type) {
197                                $type=$old_type;
198                                $args['type'] = $old_type;
199                        }
200                        if (in_array($type, array('article','page'))
201                                and (count($langues_dispos)>1)) {
202                                $saisie_langue = recuperer_fond('formulaires/selecteur_langue', array('langues_dispos' => $langues_dispos, 'id_article' => $args['contexte']['id_article']));
203                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_titre.*<\/li>),Uims", "\\1".$saisie_langue, $flux['data'], 1);
204                        }
205                        /**
206                         * On remplace le selecteur de rubrique par le notre dans le public
207                         * On fait attention au fait qu'il y ait ou pas polyhiérarchie
208                         * On laisse le séleceteur normal dans le prive pour pouvoir changer l'objet de place
209                         */
210                        if (!test_espace_prive()
211                                and preg_match(",<li [^>]*class=[\"']editer editer_parent,Uims", $flux['data'], $regs)
212                                and (!preg_match(",<li [^>]*class=[\"']editer editer_parents,Uims", $flux['data'], $regs2)
213                                or ($args['options_complements']['polyhier_desactiver'] == 'on'))) {
214                                $contexte_selecteur = array(
215                                        'id_rubrique_limite'=>$id_secteur,
216                                        'type' => $type,
217                                        'id_parent'=>$args['contexte']['id_parent'],
218                                        'rubrique_principale' => $rubrique_principale);
219                                if ($type == 'rubrique') {
220                                        $contexte_selecteur['id_rubrique'] = $args['contexte']['id_rubrique'];
221                                }
222
223                                if (count($regs2) > 0) {
224                                        $class = 'editer editer_parents';
225                                        $contexte_selecteur['selecteur_type'] = 'polyhier';
226                                        $contexte_selecteur['parents'] = $args['contexte']['parents'];
227                                } else {
228                                        $class = 'editer editer_parent';
229                                        $contexte_selecteur['selecteur_type'] = 'normal';
230                                }
231                                $contexte_selecteur['rubrique_principale'] = 'oui';
232                                if ($diogene['objet'] == 'emballe_media') {
233                                        $contexte_selecteur['rubrique_principale'] = 'non';
234                                }
235
236                                $saisie_rubrique = recuperer_fond('formulaires/selecteur_rubrique', $contexte_selecteur);
237                                if ($args['contexte']['id_parent'] > 0) {
238                                        $flux['data'] = preg_replace(",(<li [^>]*class=[\"']$class.*)(<li [^>]*class=[\"'](editer|fieldset).*),Uims", $saisie_rubrique."\\2", $flux['data'], 1);
239                                } else {
240                                        $flux['data'] = preg_replace(",(<li [^>]*class=[\"']$class.*)(<li [^>]*class=[\"'](editer|fieldset).*),Uims", "\\2", $flux['data'], 1);
241                                }
242                                if (($class == 'editer editer_parents')
243                                        and ($args['options_complements']['polyhier_desactiver'] == 'on')) {
244                                        $sous_rub_count = sql_countsel('spip_rubriques', 'id_secteur='.intval($args['id_secteur']));
245                                        if ($sous_rub_count == 0) {
246                                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_parent.*)(<li [^>]*class=[\"']editer.*),Uims", ''."\\2", $flux['data'], 1);
247                                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_parents.*)(<li [^>]*class=[\"']editer.*),Uims", ''."\\2", $flux['data'], 1);
248                                        } else {
249                                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_parents.*)(<li [^>]*class=[\"']editer.*),Uims", ''."\\2", $flux['data'], 1);
250                                        }
251                                }
252                        } else if (!test_espace_prive()
253                                and ($type != 'page')
254                                and preg_match(",<li [^>]*class=[\"']editer editer_parents,Uims", $flux['data'], $regs)) {
255                                $contexte = $args['contexte'];
256                                $contexte['id_rubrique'] = $diogene['id_secteur'];
257                                $contexte['limite_branche'] = $diogene['id_secteur'];
258                                $saisie_rubrique = recuperer_fond('formulaires/inc-selecteur-parents_diogene', $contexte);
259                                $flux['data'] = preg_replace(",(<li [^>]*class=[\"']editer editer_parents.*)(<li [^>]*class=[\"']editer.*),Uims", $saisie_rubrique."\\2", $flux['data'], 1);
260                        }
261                        /**
262                         * On ajoute en fin de formulaire les blocs supplémentaires
263                         */
264
265                        if (strpos($flux['data'], '<!--extra-->') !== false) {
266                                $saisie = pipeline('diogene_ajouter_saisies', array('args' => $args,'data' => ''));
267                                /**
268                                 * On ajoute encore à la fin le sélecteur de statuts à la fin du formulaire
269                                 * Uniquement si l'on n'est pas dans le privé
270                                 */
271                                if ($type=='page') {
272                                        $type='article';
273                                }
274
275                                if ($args['options_complements']['workflow_simplifie'] == 'on') {
276                                        $args['contexte']['workflow_simplifie'] = 'on';
277                                }
278
279                                $contexte = array(id_table_objet($type) => $args['contexte'][id_table_objet($type)], 'statut' => $args['contexte']['statut'], 'workflow_simplifie' => $args['contexte']['workflow_simplifie']);
280                                if (!test_espace_prive()
281                                        and find_in_path('formulaires/selecteur_statut_'.$diogene['objet'].'.html')) {
282                                        $saisie .= trim(recuperer_fond('formulaires/selecteur_statut_'.$diogene['objet'], $contexte));
283                                } elseif (!test_espace_prive()
284                                        and find_in_path('formulaires/selecteur_statut_'.$type.'.html')) {
285                                        $saisie .= trim(recuperer_fond('formulaires/selecteur_statut_'.$type, $contexte));
286                                } elseif (!test_espace_prive()
287                                        and find_in_path('formulaires/selecteur_statut_objet.html') and $type != 'rubrique') {
288                                        $args['contexte']['type'] = $type;
289                                        $saisie .= trim(recuperer_fond('formulaires/selecteur_statut_objet', $contexte));
290                                }
291                                $flux['data'] = preg_replace(',(.*)(<!--extra-->),ims', "\\1<ul>".$saisie."</ul>\\2", $flux['data'], 1);
292                        }
293                        if (($champs_sup = unserialize($diogene['champs_ajoutes']))
294                                and is_array($champs_sup)
295                                and in_array('logo', $champs_sup)
296                                and !preg_match(',<form.*enctype=.*>,Uims', $flux['data'], $regs)) {
297                                $flux['data'] = preg_replace(',<(form.*[^>])>,Uims', '<\\1 enctype=\'multipart/form-data\'>', $flux['data'], 1);
298                        }
299                } else {
300                        spip_log('pas de diogene', 'diogene.'._LOG_ERREUR);
301                }
302        }
303        return $flux;
304}
305
306/**
307 * Insertion dans le pipeline formulaire_charger (SPIP)
308 *
309 * Charge des valeurs spécifiques dans le formulaire d'édition en cours
310 * Les sous plugins peuvent se brancher sur le pipeline spécifique à Diogene : diogene_charger
311 * Diogène ajoute dans le $flux de départ l'id_diogene correspondant à l'objet édité ($flux['data']['id_diogene'])
312 * ainsi que l'id_diogene dans les hidden.
313 *
314 * @param array $flux
315 *              Le contexte d'environnement du pipeline
316 * @return array $flux
317 *              Le contexte d'environnement modifié
318 */
319function diogene_formulaire_charger($flux) {
320        if (isset($flux['args']['form']) and $flux['args']['form'] == 'editer_diogene') {
321                $complements = unserialize($flux['data']['options_complements']);
322                $valeurs = array();
323                if (is_array($complements)) {
324                        foreach ($complements as $complement => $valeur) {
325                                if (is_array(unserialize($valeur))) {
326                                        $valeurs[$complement] = unserialize($valeur);
327                                } else {
328                                        $valeurs[$complement] = $valeur;
329                                }
330                        }
331                }
332                if ($flux['data']['objet'] == 'page') {
333                        $diogene_orig = _request('id_diogene');
334                        if ($diogene = sql_getfetsel('id_diogene', 'spip_diogenes', "objet = 'page' AND id_diogene != ".intval($diogene_orig))) {
335                                $flux['data']['editable'] = false;
336                                $flux['data']['message_erreur'] = _T('diogene:erreur_diogene_multiple_page');
337                        } else {
338                                $flux['data']['_hidden'] .= "\n<input type='hidden' name='id_secteur' value='0' />\n";
339                        }
340                }
341                $flux['data'] = array_merge($flux['data'], $valeurs);
342        } else {
343                $pipeline = pipeline('diogene_objets', array());
344                if (isset($flux['args']['form'])
345                        and substr($flux['args']['form'], 0, 7) == 'editer_'
346                        and ($objet = substr($flux['args']['form'], 7))
347                        and in_array($objet, array_keys($pipeline))) {
348                        $id_table_objet = id_table_objet($objet);
349                        $id_objet = $flux['data'][$id_table_objet];
350                        $flux['data']['id_objet'] = $id_objet;
351                        $id_secteur = (intval($flux['data']['id_secteur']) > 0) ? $flux['data']['id_secteur'] : ((intval($flux['data']['id_parent']) > 0) ? $flux['data']['id_parent'] : false);
352
353                        /**
354                         * Cas spécifique pour les pages uniques
355                         * -* Uniquement dans l'espace public
356                         */
357                        if (($flux['args']['form'] == 'editer_article')
358                                and !$flux['args']['id_parent']) {
359                                $type_objet= _request('type_objet');
360                                $id_secteur = sql_getfetsel('id_secteur', 'spip_diogenes', 'type='.sql_quote($type_objet));
361                                if (!$flux['args']['id_parent'] and is_numeric($flux['args']['args'][1])) {
362                                        $flux['data']['id_parent'] = $flux['args']['args'][1];
363                                        $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique='.$flux['data']['id_parent']);
364                                }
365                        }
366
367                        if (!test_espace_prive()
368                                and (($flux['args']['form'] == 'editer_article')
369                                and ($flux['data']['id_parent'] == '-1')
370                                or ($id_secteur == 0))) {
371                                $flux['data']['type'] = 'page';
372                        }
373
374                        if (intval($id_secteur)) {
375                                if ($objet == 'article') {
376                                        $diogene = sql_fetsel('id_diogene,objet', 'spip_diogenes', 'id_secteur='.intval($id_secteur).' AND objet IN ("article","emballe_media")');
377                                        $id_diogene = $diogene['id_diogene'];
378                                        $type_diogene = $diogene['objet'];
379                                } else {
380                                        $id_diogene = sql_getfetsel('id_diogene', 'spip_diogenes', 'id_secteur='.intval($id_secteur).' AND objet ='.sql_quote($objet));
381                                        $type_diogene = $objet;
382                                }
383                        } elseif ($pipeline[$objet]['diogene_max'] == 1) {
384                                $id_diogene = sql_getfetsel('id_diogene', 'spip_diogenes', 'objet ='.sql_quote($objet));
385                        }
386
387                        /**
388                         * On est effectivement dans un diogene
389                         * On ajoute deux input hidden :
390                         * -* id_diogene qui est l'id_diogene
391                         * -* type_diogene qui est le champ 'objet' de la table spip_diogene
392                         * Ces deux informations peuvent être intéressantes dans d'autres pipeline comme formulaire_traiter ...
393                         */
394                        if (intval($id_diogene)) {
395                                $flux['data']['_hidden'] .= "<input type='hidden' name='id_diogene' value='".$id_diogene."' />\n";
396                                $flux['data']['_hidden'] .= "<input type='hidden' name='type_diogene' value='".$type_diogene."' />\n";
397                                $flux['data']['id_diogene'] = $id_diogene;
398                        }
399
400                        $post_valeurs = pipeline(
401                                'diogene_charger',
402                                array(
403                                        'args' => array(
404                                                $id_table_objet => $id_objet,
405                                                'mode' => 'chargement',
406                                                'valeurs' => $flux['data']
407                                        ),
408                                        'data' => array())
409                        );
410
411                        if (is_array($post_valeurs)) {
412                                $flux['data'] = array_merge($flux['data'], $post_valeurs);
413                        }
414                }
415        }
416        return $flux;
417}
418
419/**
420 * Insertion dans le pipeline formulaire_verifier (SPIP)
421 *
422 * Vérifie les valeurs du formulaire avant leur traitement
423 * Les sous plugins peuvent se brancher sur le pipeline spécifique à Diogene : diogene_verifier
424 *
425 * @param array $flux
426 *              Le contexte d'environnement du pipeline
427 * @return array $flux
428 *              Le contexte d'environnement modifié
429 */
430function diogene_formulaire_verifier($flux) {
431        $pipeline = pipeline('diogene_objets', array());
432        if ($objet = substr($flux['args']['form'], 7) and in_array($objet, array_keys($pipeline))) {
433                // On ne fait rien si l'id_parent principal est incoherent (exemple : compat pages uniques)
434                //if (_request('id_parent') < 0) return $flux;
435
436                if ($objet == 'rubrique' and
437                        !strcmp($flux['args']['form'], 'editer_rubrique') and
438                        ($flux['args']['args'][0] == $flux['args']['args'][1])) {
439                                $flux['data']['id_parent'] = _T('diogene:erreur_id_parent_id_rubrique');
440                }
441
442                $flux['data'] = pipeline(
443                        'diogene_verifier',
444                        array(
445                                'args' => array(
446                                        'erreurs' => $flux['data']
447                                ),
448                                'data' => $flux['data']
449                        )
450                );
451                $messages = $flux['data'];
452                unset($messages['message_ok']);
453                if (count($messages) > 0) {
454                        /**
455                         * Si c'est la récupération automatique des infos d'un site, on n'affiche pas de message d'erreur
456                         */
457                        if (count($messages) == 1
458                                and isset($messages['verif_url_auto'])) {
459                                return $flux;
460                        }
461                        $flux['data']['message_erreur'] = _T('diogene:message_erreur_general');
462                }
463        }
464        return $flux;
465}
466
467/**
468 * Insertion dans le pipeline formulaire_traiter (SPIP)
469 *
470 * Insertion à la fin du traitement des formulaires
471 * Les sous plugins peuvent également se brancher sur le pipeline spécifique à Diogene : diogene_traiter
472 * Ce pipeline agit au moment de la pré édition de SPIP
473 *
474 * On ne s'insère que sous certaines conditions :
475 * -* on se trouve dans l'espace public;
476 * -* on est dans le cas d'un formulaire du type #FORMULAIRE_EDITER_xx
477 * -* dans le cas d'un diogene (passé dans le post);
478 * -* le diogène passé dans le post existe bien;
479 *
480 * Ce pipeline agit sur le message de retour et la redirection lors de la validation d'un formulaire
481 * -* On ne redirige pas sur la page de l'objet même si publié;
482 * -* On ajoute un lien pour voir l'objet publié dans le message de retour du formulaire
483 * -* On ajoute un ajaxReload dans le message de retour pour rafraichir certains morceaux de la page (jQuery(".description_$objet,.diogene_$id_diogene"))
484 *
485 * @param array $flux
486 *              Le contexte d'environnement du pipeline
487 * @return array $flux
488 *              Le contexte d'environnement modifié
489 */
490function diogene_formulaire_traiter($flux) {
491        if (!test_espace_prive()
492                and isset($flux['args']['form'])
493                and (substr($flux['args']['form'], 0, 7) == 'editer_')
494                and ($objet = substr($flux['args']['form'], 7))
495                and ($objet != 'diogene')
496                and ($id_diogene = intval(_request('id_diogene')))
497                and ($id_diogene == sql_getfetsel('id_diogene', 'spip_diogenes', 'id_diogene='.intval($id_diogene)))) {
498                $id_table_objet = id_table_objet($objet);
499                $table_objet = table_objet_sql($objet);
500                $id_objet = intval($flux['data'][$id_table_objet]);
501                $statut_objet = sql_getfetsel('statut', $table_objet, $id_table_objet.'='.intval($id_objet));
502
503                /**
504                 * On récupère le titre dans le post que l'on passera aux chaines de langue
505                 * On test 'titre','nom_site','nom' qui sont les 3 plus probables
506                 * En dernier ressort on utilise generer_info_entite() pour trouver quelque chose
507                 * (dans ce cas on doit appeler inc/texte qui pose problème)
508                 */
509                $titre = _request('titre') ? _request('titre') : (_request('nom_site') ? _request('nom_site') : _request('nom'));
510                if (!$titre) {
511                        include_spip('inc/filtres'); // Pour generer_info_entite
512                        $titre = generer_info_entite($id_objet, $objet, 'titre');
513                }
514
515                /**
516                 * Cas de la modification d'un objet
517                 */
518                if ((_request($id_table_objet) == $flux['data'][$id_table_objet])
519                        or (_request('arg') == $flux['data'][$id_table_objet])) {
520                        /**
521                         * TODO Utiliser les fonctions recherchant dans la déclaration des tables pour prendre le bon statut
522                         * ici : refuse est pour les sites et poubelle pour le reste
523                         */
524                        include_spip('inc/filtres');
525                        if (in_array($statut_objet, array('refuse','poubelle'))) {
526                                $flux['data']['message_ok'] = _T('diogene:message_objet_supprime', array('titre' => extraire_multi($titre)));
527                                $flux['data']['redirect'] = parametre_url(self(), $id_table_objet, '');
528                                $flux['data']['editable'] = false;
529                        } else {
530                                $flux['data']['message_ok'] = _T('diogene:message_objet_mis_a_jour', array('titre' => extraire_multi($titre)));
531                                if (objet_test_si_publie($objet, $id_objet)) {
532                                        $url = generer_url_entite($id_objet, $objet);
533                                        $flux['data']['message_ok'] .= '<br />'._T('diogene:message_objet_mis_a_jour_lien', array('url' => $url));
534                                }
535                                if (!defined('_DIOGENE_REDIRIGE_PUBLICATION')) { // TODO : à ajouter dans infos_supp du diogene
536                                        $flux['data']['message_ok'] .= '<script type="text/javascript">if (window.jQuery) jQuery(".description_'.$objet.',.diogene_'.$id_diogene.'").ajaxReload();</script>';
537                                        $flux['data']['editable'] = true;
538                                        $flux['data']['redirect'] = false;
539                                } else {
540                                        $flux['data']['editable'] = false;
541                                        $flux['data']['redirect'] = $url;
542                                }
543                        }
544                } else {
545                        if (defined('_DIOGENE_REDIRIGE_PUBLICATION') and objet_test_si_publie($objet, $id_objet)) {
546                                $flux['data']['redirect'] = generer_url_entite($id_objet, $objet);
547                        } else {
548                                $flux['data']['redirect'] = parametre_url(self(), $id_table_objet, $id_objet);
549                        }
550                        $flux['data']['message_ok'] = _T('diogene:message_objet_cree', array('titre' => extraire_multi($titre)));
551                        $flux['data']['editable'] = false;
552                }
553        }
554        return $flux;
555}
556
557/**
558 * Insertion dans le pipeline pre_insertion (SPIP)
559 *
560 * A la création d'un article on vérifie si on nous envoie la langue
561 * si oui on la met correctement dès l'insertion
562 *
563 * @param array $flux
564 *              Le contexte du pipeline
565 * @return array $flux
566 *              Le contexte modifié
567 */
568function diogene_pre_insertion($flux) {
569        if (($flux['args']['table'] == 'spip_articles') and _request('changer_lang')) {
570                $flux['data']['lang'] = _request('changer_lang');
571                $flux['data']['langue_choisie'] = 'oui';
572        }
573        return $flux;
574}
575
576/**
577 * Insertion dans le pipeline pre_edition (SPIP)
578 *
579 * A la modification d'un article on vérifie si on nous envoie la langue
580 * si elle est différente de celle de l'article on la change
581 *
582 * @param array $flux
583 *              Le contexte du pipeline
584 * @return array $flux
585 *              Le contexte modifié
586 */
587function diogene_pre_edition($flux) {
588        $pipeline = pipeline('diogene_objets', array());
589        if (in_array($flux['args']['type'], array_keys($pipeline)) and ($flux['args']['action']=='modifier')) {
590                $flux = pipeline('diogene_traiter', $flux);
591        }
592
593        /**
594         * Attention au herit envoyé dans le privé
595         */
596        if (($flux['args']['table'] == 'spip_articles')
597                and _request('changer_lang')
598                and _request('changer_lang') != 'herit') {
599                $flux['data']['lang'] = _request('changer_lang');
600                $flux['data']['langue_choisie'] = 'oui';
601        }
602
603        if ($flux['args']['table'] == 'spip_diogenes') {
604                $champs = pipeline('diogene_champs_pre_edition', array('polyhier_desactiver', 'cextras_enleves', 'cacher_heure', 'workflow_simplifie', 'explications_logo'));
605                if (isset($flux['data']['options_complements'])) {
606                        $options_complements = is_array(unserialize($flux['data']['options_complements'])) ? unserialize($flux['data']['options_complements']) : array();
607                }
608
609                foreach (array('champs_ajoutes','champs_caches') as $array) {
610                        if ($val_array = _request($array)) {
611                                if (is_array($val_array)) {
612                                        $flux['data'][$array] = serialize($val_array);
613                                } else {
614                                        $flux['data'][$array] = $val_array;
615                                }
616                        }
617                }
618                foreach ($champs as $champ) {
619                        if (_request($champ)) {
620                                if (is_array($val = _request($champ))) {
621                                        $options_complements[$champ] = serialize($val);
622                                } else {
623                                        $options_complements[$champ] = $val;
624                                }
625                        }
626                }
627                if ($flux['data']['objet'] == 'page') {
628                        $options_complements['polyhier_desactiver'] = 'on';
629                }
630                if ($options_complements) {
631                        $flux['data']['options_complements'] = serialize($options_complements);
632                }
633        }
634        return $flux;
635}
636
637/**
638 * Insertion dans le pipeline post_edition (SPIP)
639 *
640 * On s'insère à la fin des actions d'edition (action/editer_*)
641 * Notamment pour lancer un recalcul de la publication des rubriques
642 *
643 * @param array $flux
644 *              Le contexte du pipeline
645 * @return array $flux
646 *              Le contexte modifié
647 */
648function diogene_post_edition($flux) {
649        /**
650         * On rejoue le calcul des rubriques car il n'a pas lieu avec le bon
651         * id_rubrique au premier coup
652         * C'est un hack ...
653         */
654        if (isset($flux['data']['id_rubrique'])
655                and ($flux['data']['statut'] == 'publie')
656                and ($flux['args']['action'] == 'instituer')) {
657                include_spip('inc/rubriques');
658                calculer_rubriques_if($flux['data']['id_rubrique'], array('statut' => 'publie'), '');
659        }
660        return $flux;
661}
662
663/**
664 * Insertion dans le pipeline diogene_objets (plugin Diogene)
665 *
666 * On ajoute les champs que l'on peut ajouter
667 *
668 * @param array $flux
669 *              Un tableau bidimentionnel listant les champs pouvant être ajoutés aux objets
670 * @return array $flux
671 *              Le tableau modifié
672 */
673function diogene_diogene_objets($flux) {
674        $flux['article']['champs_sup']['logo'] = _T('ecrire:logo_article');
675        $flux['article']['champs_sup']['date'] = _T('diogene:champ_date_publication');
676        if ($GLOBALS['meta']['articles_redac'] !== 'non') {
677                $flux['article']['champs_sup']['date_redac'] = _T('diogene:champ_date_publication_anterieure');
678        }
679        $flux['article']['champs_sup']['forum'] = _T('diogene:champ_forum');
680
681        if (defined('_DIR_PLUGIN_PAGES')) {
682                $flux['page'] = $flux['article'];
683                $flux['page']['type_orig'] = 'article';
684                $flux['page']['diogene_max'] = 1;
685                $flux['page']['ss_rubrique'] = true;
686                $flux['article']['champs_sup']['logo'] = _T('ecrire:logo_article');
687        }
688
689        $flux['site'] = array();
690        $flux['site']['champs_sup']['logo'] = _T('ecrire:logo_site');
691
692        $flux['rubrique'] = array();
693        $flux['rubrique']['champs_sup']['logo'] = _T('ecrire:logo_rubrique');
694
695        return $flux;
696}
697
698/**
699 * Insertion dans le formulaire diogene_avant_formulaire (plugin Diogene)
700 *
701 * Insert des scripts javascript nécessaire au bon fonctionnement des formulaires d'édition :
702 * -* prive/javascript/presentation.js
703 * -* formulaires/dateur/inc-dateur.html si une date est présente dans le formulaire
704 *
705 * @param array $flux
706 *              Le contexte du pipeline
707 * @return array $flux
708 *              Le contexte modifié
709 */
710function diogene_diogene_avant_formulaire($flux) {
711        $flux['data'] .= '<script type="text/javascript" src="'.find_in_path('prive/javascript/presentation.js').'"></script>';
712        if (is_array(unserialize($flux['args']['champs_ajoutes']))
713                and (in_array('date', unserialize($flux['args']['champs_ajoutes'])) || in_array('date_redac', unserialize($flux['args']['champs_ajoutes'])))) {
714                $flux['data'] .= recuperer_fond('formulaires/dateur/inc-dateur', $flux['args']);
715        }
716        return $flux;
717}
718
719/**
720 * Insertion dans le formulaire diogene_ajouter_saisies (plugin Diogene)
721 *
722 * Insert les saisies configurées dans le formulaire
723 *
724 * @param array $flux
725 *              Le contexte du pipeline
726 * @return array $flux
727 *              Le contexte modifié
728 */
729function diogene_diogene_ajouter_saisies($flux) {
730        if (is_array(unserialize($flux['args']['champs_ajoutes']))) {
731                $flux['args']['contexte']['objet'] = $flux['args']['type'];
732                if (in_array('date_redac', unserialize($flux['args']['champs_ajoutes'])) && in_array('date', unserialize($flux['args']['champs_ajoutes'])) && ($GLOBALS['meta']['articles_redac'] != 'non')) {
733                        $dates_ajoutees = 'date_full';
734                        if (!$flux['args']['contexte']['date']) {
735                                list($flux['args']['contexte']['date_orig'], $flux['args']['contexte']['heure_orig']) = explode(' ', date('d/m/Y H:i', time()));
736                        } else {
737                                list($flux['args']['contexte']['date_orig'], $flux['args']['contexte']['heure_orig']) = explode(' ', date('d/m/Y H:i', strtotime($flux['args']['contexte']['date'])));
738                        }
739                        if ($flux['args']['contexte']['date_redac']) {
740                                list($flux['args']['contexte']['date_redac_orig'],$flux['args']['contexte']['heure_redac_orig']) = explode(' ', date('d/m/Y H:i', strtotime($flux['args']['contexte']['date_redac'])));
741                        }
742                } elseif (in_array('date_redac', unserialize($flux['args']['champs_ajoutes'])) && ($GLOBALS['meta']['articles_redac'] != 'non')) {
743                        if ($flux['args']['contexte']['date_redac']) {
744                                list($flux['args']['contexte']['date_redac_orig'],$flux['args']['contexte']['heure_redac_orig']) = explode(' ', date('d/m/Y H:i', strtotime($flux['args']['contexte']['date_redac'])));
745                        }
746                        $dates_ajoutees = 'date_redac_orig';
747                } elseif (in_array('date', unserialize($flux['args']['champs_ajoutes']))) {
748                        if (!$flux['args']['contexte']['date']) {
749                                list($flux['args']['contexte']['date_orig'], $flux['args']['contexte']['heure_orig']) = explode(' ', date('d/m/Y H:i', time()));
750                        } else {
751                                list($flux['args']['contexte']['date_orig'],$flux['args']['contexte']['heure_orig']) = explode(' ', date('d/m/Y H:i', strtotime($flux['args']['contexte']['date'])));
752                        }
753                        $dates_ajoutees = 'date_orig';
754                }
755                if ($dates_ajoutees) {
756                        $flux['args']['contexte']['dates_ajoutees'] = $dates_ajoutees;
757                        $flux['args']['contexte']['cacher_heure'] = $flux['args']['options_complements']['cacher_heure'];
758                        $flux['data'] .= recuperer_fond('formulaires/diogene_ajouter_dates', $flux['args']['contexte']);
759                }
760                if (in_array('forum', unserialize($flux['args']['champs_ajoutes']))) {
761                        if (isset($flux['args']['contexte']['id_article']) and is_numeric($flux['args']['contexte']['id_article'])) {
762                                include_spip('formulaires/activer_forums_objet'); // Pour get_forums_publics
763                                $flux['args']['contexte']['forums_actuels'] = get_forums_publics($flux['args']['contexte']['id_article']);
764                        }
765                        $flux['data'] .= recuperer_fond('formulaires/diogene_ajouter_forums', $flux['args']['contexte']);
766                }
767                if (in_array('logo', unserialize($flux['args']['champs_ajoutes']))) {
768                        $flux['args']['contexte']['explications_logo'] = $flux['args']['options_complements']['explications_logo'];
769                        $chercher_logo = charger_fonction('chercher_logo', 'inc');
770                        $etats = array('on');
771                        foreach ($etats as $etat) {
772                                $logo_envoi = $chercher_logo($flux['args']['contexte']['id_objet'], id_table_objet($flux['args']['contexte']['objet']), $etat);
773                                if (is_array($logo_envoi) && count($logo_envoi) > 0) {
774                                        $flux['args']['contexte']['logo_'.$etat] = $logo_envoi[0];
775                                }
776                        }
777                        $flux['data'] .= recuperer_fond('formulaires/diogene_ajouter_logo', $flux['args']['contexte']);
778                }
779        }
780        return $flux;
781}
782
783/**
784 * Insertion dans le formulaire diogene_verifier (plugin Diogene)
785 *
786 * Vérification de saisies du formulaire
787 * -* vérifie principalement les dates "date" et "date_redac"
788 * -* vérifie la valeur pour le forum également
789 *
790 * @param array $flux
791 *              Le contexte du pipeline
792 * @return array $flux
793 *              Le contexte modifié
794 */
795function diogene_diogene_verifier($flux) {
796        if (_request('date_orig') || _request('date_redac_orig')) {
797                /**
798                 * Ce fichier se trouve dans plugins-dist/organiseur/inc/date_gestion.php
799                 * Mériterait une réincorporation dans SPIP?
800                 */
801                include_spip('inc/date_gestion');
802                if (!$flux['args']['erreurs']['date'] && ($date = _request('date_orig'))) {
803                        $date_orig = verifier_corriger_date_saisie('orig', 'oui', $flux['data']);
804                }
805                if (!$flux['args']['erreurs']['date_redac'] && ($date = _request('date_redac_orig'))) {
806                        $date_redac_orig = verifier_corriger_date_saisie('redac_orig', 'oui', $flux['data']);
807                }
808        }
809        if (!$flux['args']['erreurs']['forums']
810                and ($forums = _request('forums')) && !in_array($forums, array('pos','pri','abo','non'))) {
811                $flux['data']['forums'] = _T('diogene:erreur_forums');
812        }
813
814        if (($id_diogene = intval(_request('id_diogene'))) and $id_diogene > 0) {
815                $champs_ajoutes = unserialize(sql_getfetsel('champs_ajoutes', 'spip_diogenes', 'id_diogene='.intval($id_diogene)));
816                if (is_array($champs_ajoutes) && in_array('logo', $champs_ajoutes)) {
817                        include_spip('formulaires/editer_logo');
818                        $sources = formulaire_editer_logo_get_sources();
819                        foreach ($sources as $etat => $file) {
820                                // seulement si une reception correcte a eu lieu
821                                if ($file and $file['error'] == 0) {
822                                        if (!in_array(strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)), array('jpg','png','gif','jpeg'))) {
823                                                $flux['data']['logo'] = _L('Extension non reconnue');
824                                        }
825                                }
826                        }
827                }
828        }
829        return $flux;
830}
831
832/**
833 * Insertion dans le formulaire diogene_traiter (plugin Diogene)
834 *
835 * Traitement de saisies du formulaire
836 * -* traite les dates "date" et "date_redac"
837 * -* traite la valeur pour le forum également, si spécifié à "abo" et
838 * l'inscription des visiteurs n'est pas ouverte, on l'ouvre automatiquement
839 *
840 * @param array $flux
841 *              Le contexte du pipeline
842 * @return array $flux
843 *              Le contexte modifié
844 */
845function diogene_diogene_traiter($flux) {
846        $id_objet = $flux['args']['id_objet'];
847
848        if (_request('date_orig') || _request('date_redac_orig')) {
849                include_spip('inc/date_gestion');
850                if (_request('date_orig')) {
851                        $flux['data']['date'] = date('Y-m-d H:i:s', verifier_corriger_date_saisie('orig', 'oui', $erreurs));
852                        set_request('date', $flux['data']['date']);
853                }
854                if (_request('date_redac_orig')) {
855                        $flux['data']['date_redac'] = date('Y-m-d H:i:s', verifier_corriger_date_saisie('redac_orig', 'oui', $erreurs));
856                }
857        }
858        if ($forums = _request('forums')) {
859                $flux['data']['accepter_forum'] = $forums;
860                if ($forums == 'abo' && ($GLOBALS['meta']['accepter_visiteurs'] != 'oui')) {
861                        ecrire_meta('accepter_visiteurs', 'oui');
862                        include_spip('inc/invalideur');
863                        suivre_invalideur("id='id_forum/$id_objet'");
864                }
865        }
866
867        // effectuer la suppression si demandee d'un logo
868        if (_request('supprimer_logo_on')) {
869                $objet = $flux['args']['type'];
870                $_id_objet = id_table_objet($objet);
871
872                include_spip('inc/chercher_logo');
873                include_spip('inc/flock');
874                $type = type_du_logo($_id_objet);
875                $chercher_logo = charger_fonction('chercher_logo', 'inc');
876
877                $logo = $chercher_logo($flux['args']['id_objet'], $_id_objet, 'on');
878                if ($logo) {
879                        spip_unlink($logo[0]);
880                }
881                set_request('logo_up', ' ');
882        }
883        if (!$_FILES) {
884                $_FILES = $GLOBALS['HTTP_POST_FILES'];
885        }
886
887        if (is_array($_FILES) && isset($_FILES['logo_on'])) {
888                include_spip('formulaires/editer_logo');
889                $objet = $flux['args']['type'];
890                include_spip('action/editer_logo');
891                $sources = formulaire_editer_logo_get_sources();
892                foreach ($sources as $etat => $file) {
893                        if ($file and $file['error'] == 0) {
894                                if ($err = logo_modifier($objet, $flux['args']['id_objet'], $etat, $file)) {
895                                        $flux['message_erreur'] = $err;
896                                }
897                                set_request('logo_up', ' ');
898                        }
899                }
900        }
901        return $flux;
902}
903
904/**
905 * Insertion dans le pipeline ajouter_menus (SPIP)
906 *
907 * Ajouter des boutons dans les menus pour chaque diogène que l'on sait gérer dans l'espace privé
908 *
909 * @param object $boutons_admin
910 *              La description des boutons
911 * @return object $boutons_admin
912 *              La description des boutons complétée
913 */
914function diogene_ajouter_menus($boutons_admin) {
915        if (!function_exists('quete_logo')) {
916                include_spip('public/quete');
917        }
918
919        $diogenes = sql_allfetsel('*', 'spip_diogenes', 'objet != "emballe_media"');
920
921        foreach ($diogenes as $diogene) {
922                if (autoriser('utiliser', 'diogene', $diogene['id_diogene'])) {
923                        $url = false;
924                        if ($diogene['objet'] == 'rubrique') {
925                                $url = generer_url_ecrire('rubrique_edit', 'new=oui&id_parent='.$diogene['id_secteur']);
926                                $icon = find_in_theme('images/rubrique-add-16.png');
927                        } elseif ($diogene['objet'] == 'article') {
928                                $url = generer_url_ecrire('article_edit', 'new=oui&id_rubrique='.$diogene['id_secteur']);
929                                $icon = find_in_theme('images/article-add-16.png');
930                        } elseif ($diogene['objet'] == 'site') {
931                                $url = generer_url_ecrire('site_edit', 'new=oui&id_rubrique='.$diogene['id_secteur']);
932                                $icon = find_in_theme('images/site-add-16.png');
933                        }
934
935                        if ($logo = quete_logo('diogene', 'ON', $diogene['id_diogene'], $diogene['id_secteur'], false)) {
936                                include_spip('inc/filtres_images_mini');
937                                include_spip('filtres/images_transforme');
938                                $icon = extraire_attribut(image_reduire($logo[0], '16', '16'), 'src');
939                        }
940
941                        if ($url) {
942                                $boutons_admin['menu_edition']->sousmenu[$diogene['type']] =
943                                new Bouton($icon, extraire_multi($diogene['titre']), $url);
944                        }
945                }
946        }
947        return $boutons_admin;
948}
Note: See TracBrowser for help on using the repository browser.