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

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

Faire fonctionner l'édition de logo en 3.1.x

Version 1.8.0

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