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

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

Oups

Ne pas mettre le .html puisqu'on cherche un fond

utiliser type_objet plutôt que type

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