source: spip-zone/_plugins_/tickets/trunk/tickets_pipelines.php @ 81170

Last change on this file since 81170 was 81162, checked in by severo@…, 5 years ago

tickets - bloc affiche_milieu pour associer des tickets

à tout autre objet (dans la page privée de cet objet).
Adapté du plugin mots et de l'exemple de marcimat
http://marcimat.magraine.net/Chats-2-SPIP-3#Lier-des-chats-a-des-articles

File size: 11.3 KB
Line 
1<?php
2/**
3 * Plugin Tickets
4 * Licence GPL (c) 2008-2013
5 *
6 * @package SPIP\Tickets\Pipelines
7 */
8 
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11/**
12 * Insertion dans le pipeline affiche_aguche (SPIP)
13 *
14 * Affichage du bouton de création de tickets sur la page ?exec=ticket
15 * Affichage de la liste des tickets ouverts et des tickets en cours
16 *
17 * @param array $flux
18 *              Le contexte du pipeline
19 * @return array $flux
20 *              Le contexte du pipeline modifié
21 */
22function tickets_affiche_gauche($flux) {
23        if (isset($flux["args"]["exec"]) && ($flux["args"]["exec"] == "ticket")) {
24                $ret = '';
25               
26                include_spip('inc/autoriser');
27               
28                if (autoriser('ecrire', 'ticket')) {
29                        include_spip('inc/presentation'); # pour icone_horizontale
30                        $ret .= boite_ouvrir('','simple');
31                        $ret .= icone_horizontale(_T('tickets:creer_ticket'), generer_url_ecrire('ticket_edit','new=oui'), 'ticket-24.png', 'creer.gif', false);
32                        $ret .= boite_fermer();
33                }
34       
35                $contexte = array('titre'=>_T('tickets:tous_tickets_ouverts'), 'statut'=>'ouvert', 'bloc'=>'_bloc2');
36                $options = array('ajax'=>true);
37                $page = recuperer_fond('prive/squelettes/inclure/inc_liste_simple', $contexte, $options);
38                $ret .= $page;
39               
40                $flux["data"] .= $ret;
41        }
42        return $flux;
43}
44
45
46/**
47 * Insertion dans le pipeline accueil_informations (SPIP)
48 *
49 * Affichage de l'etat des tickets
50 *
51 * @param string $flux
52 *              Le contexte du pipeline
53 * @return string $flux
54 *              Le contexte du pipeline modifié
55 */
56function tickets_accueil_informations($flux){
57        global $spip_lang_left;
58        include_spip('inc/presentation');
59        $q = sql_select("COUNT(*) AS cnt, statut", 'spip_tickets', '', 'statut', '','', "COUNT(*)<>0");
60
61        $cpt = $cpt2 = array();
62        $defaut = $where ? '0/' : '';
63        while($row = sql_fetch($q)) {
64                $cpt[$row['statut']] = $row['cnt'];
65                $cpt2[$row['statut']] = $defaut;
66        }
67
68        if ($cpt) {
69                if ($where) {
70                        $q = sql_select("COUNT(*) AS cnt, statut", 'spip_tickets', $where, "statut");
71                        while($row = sql_fetch($q)) {
72                                $r = $row['statut'];
73                                $cpt2[$r] = intval($row['cnt']) . '/';
74                        }
75                }
76                $afficher_plus = 'afficher_plus_info';
77                $plus = "";
78                if (!function_exists($afficher_plus))
79                        $afficher_plus = 'afficher_plus';
80               
81                $plus = $afficher_plus(generer_url_ecrire("tickets",""));
82                $res .= "<h4>$plus"._T('tickets:info_tickets')."</h4>";
83                $res .= "<ul class=\"liste-items\">";
84                if (isset($cpt['ouvert'])) $res .= "<li class=\"item\">"._T('tickets:info_tickets_ouvert').": ".$cpt2['ouvert'] .$cpt['ouvert'] . "</li>";
85                $res .= "</ul>";
86        }
87
88        $flux .= "<div class=\"accueil_informations ticket liste\">" . $res . "</div>";
89        return $flux;
90}
91
92/**
93 * Insertion dans le pipeline affiche milieu (SPIP)
94 *
95 * Ajout de la liste des tickets en cours de rédaction
96 *
97 * @param array $flux
98 *              Le contexte du pipeline
99 * @return array $flux
100 *              Le contexte du pipeline modifié
101 */
102function tickets_affiche_milieu($flux){
103        if (isset($flux["args"]["exec"]) && $flux["args"]["exec"] == "accueil") {
104                $flux['data'] .= '<br class="nettoyeur" />';
105                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/inc_classement_accueil', array());
106        }
107
108        // si on est sur une page ou il faut inserer les tickets...
109        if ($en_cours = trouver_objet_exec($flux['args']['exec'])
110                AND $en_cours['edition']!==true // page visu
111                AND $type = $en_cours['type']
112                AND $id_table_objet = $en_cours['id_table_objet']
113                AND ($id = intval($flux['args'][$id_table_objet]))){
114                $texte = recuperer_fond(
115                                'prive/objets/editer/liens',
116                                array(
117                                        'table_source'=>'tickets',
118                                        'objet'=>$type,
119                                        'id_objet'=>$id,
120                                )
121                );
122                if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
123                        $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
124                else
125                        $flux['data'] .= $texte;
126        }
127
128        return $flux;
129}
130
131/**
132 * Insertion dans le pipeline forum_objets_depuis_env (plugin forums balises/formulaire_forum.php)
133 *
134 * Permet de récupérer l'id du ticket dans le formulaire de forum
135 *
136 * @param array $objets
137 * @return array $objets
138 */
139function tickets_forum_objets_depuis_env($objets){
140        $objets['ticket'] = id_table_objet('ticket');
141        return $objets;
142}
143
144/**
145 * Insertion dans le pipeline formulaire_charger (SPIP)
146 * Si on est dans un formulaire de forum sur un ticket, on ajoute l'id_ticket dans les champs chargés
147 * Permet de le récupérer par la suite dans le contexte de recuperer_fond
148 *
149 * @param array $flux Le contexte du formulaire
150 * @return array $flux Le contexte du formulaire modifié
151 */
152function tickets_formulaire_charger($flux){
153        if (($flux['args']['form'] == 'forum') && ($flux['args']['args'][0] == 'ticket')){
154                $flux['data']['objet'] = 'ticket';
155                $flux['data']['id_objet'] = $flux['args']['args'][1];
156                $flux['data']['id_ticket'] = $flux['args']['args'][1];
157                $flux['data']['ticket_statut'] = _request('ticket_statut');
158                $flux['data']['id_assigne'] = _request('id_assigne');
159        }
160        return $flux;
161}
162
163/**
164 * Insertion dans le pipeline recuperer_fond (SPIP)
165 *
166 * Sur le formulaire de forum (public seulement), on ajoute 2 champs quand on commente un ticket :
167 * -* La possibilité de changer le statut;
168 * -* La possibilité de changer l'assignation
169 * Dans le privé, recours au formulaire usuel de l'espace privé, le changement de statut et d'assignation étant
170 * directement disponibles dans la page.
171 *
172 * @param array $flux Le contexte du pipeline
173 */
174function tickets_recuperer_fond($flux){
175        if (($flux['args']['fond'] == 'formulaires/forum')
176                && is_numeric($flux['args']['contexte']['id_ticket'])){
177                $infos_ticket = sql_fetsel('*','spip_tickets','id_ticket='.intval($flux['args']['contexte']['id_ticket']));
178                foreach(objet_info('ticket','champs_editables') as $champ){
179                        if(_request($champ))
180                                $infos_ticket[$champ] = _request($champ);
181                }
182                if(_request('ticket_statut'))
183                        $infos_ticket['ticket_statut'] = _request('ticket_statut');
184                if(is_array($infos_ticket)){
185                        $saisie_ticket = recuperer_fond('inclure/inc-tickets_formulaire_forum',array_merge($flux['args']['contexte'],$infos_ticket));
186                        $flux['data']['texte'] = preg_replace(",(<fieldset>.*<\/fieldset>),Uims","\\1".$saisie_ticket,$flux['data']['texte'],1);
187                }
188        }
189        return $flux;
190}
191
192/**
193 * Insertion dans le pipeline formulaire_verifier (SPIP)
194 *
195 * On ajoute nos valeurs des champs de tickets dans la prévisu de forum
196 *
197 * @param array $flux
198 * @return array $flux
199 */
200function tickets_formulaire_verifier($flux){
201        if (($flux['args']['form']=='forum') AND ($flux['args']['args'][0]=='ticket') && isset($flux['data']['previsu'])) {
202                $flux['data']['previsu'] .= '<input type="hidden" name="ticket_statut" value="'._request('ticket_statut').'" />';
203                foreach(objet_info('ticket','champs_editables') as $champ){
204                        if(_request($champ))
205                                $flux['data']['previsu'] .= '<input type="hidden" name="'.$champ.'" value="'._request($champ).'" />';
206                }
207        }
208        return $flux;
209}
210
211
212/**
213 * Insertion dans le pipeline formulaire_traiter (SPIP)
214 * Si on est dans un formulaire de forum sur un ticket, on récupère le statut et l'assignation si présents
215 * pour modifier le ticket en conséquence.
216 *
217 * De plus, si configuration de tickets, on repercute la configuration des documents joints au plugin medias.
218 *
219 * @param array $flux
220 * @return array $flux
221 */
222function tickets_formulaire_traiter($flux){
223        if (($flux['args']['form']=='forum') AND ($flux['args']['args'][0]=='ticket')) {
224                include_spip('action/editer_ticket');
225                include_spip('inc/autoriser');
226                $id_ticket = $flux['args']['args'][1];
227                $infos_ticket = sql_fetsel('*','spip_tickets','id_ticket='.intval($id_ticket));
228                if(autoriser('modifier','ticket',$id_ticket)){
229                        $set = array();
230                        if(($new_statut = _request('ticket_statut')) && ($new_statut != $infos_ticket['statut']))
231                                $set['statut']= $new_statut;
232                        /**
233                         * On met le $_POST['texte'] à null pour ne pas mettre le texte du forum dans le texte du ticket
234                         */
235                        set_request('texte',NULL);
236                        ticket_modifier($id_ticket,$set);
237                }
238                else if(autoriser('assigner','ticket',$id_ticket)){
239                        if(($new_assigne=_request('id_assigne')) && ($new_assigne != $infos_ticket['id_assigne']))
240                                ticket_modifier($id_ticket, array('id_assigne'=>$new_assigne));
241                }
242        }
243        if ($flux['args']['form']=='configurer_tickets_general') {
244                $config_docs = explode(',',$GLOBALS['meta']['documents_objets']);
245                $cle = array_search('spip_tickets', $config_docs);
246                if ($cle AND !_request('joindre_fichiers')) unset($config_docs[$cle]);
247                if (!$cle AND _request('joindre_fichiers')) $config_docs[] = 'spip_tickets';
248                ecrire_meta('documents_objets',implode(',', $config_docs));
249        }
250        return $flux;
251}
252
253/**
254 * Insertion dans le pipeline notifications_destinataires (Forum)
255 * Ajoute des destinataires dans les notifications
256 *
257 * @param array $flux : le contexte du pipeline
258 * @return array $flux : le contexte modifié
259 */
260function tickets_notifications_destinataires($flux){
261        /**
262         * Notification des auteurs de tickets et des assignés et des autres forumeurs lorsque le post est validé
263         */
264        if(($flux['args']['quoi'] == 'forumvalide' or $flux['args']['quoi'] == 'forumprive')
265                && ($flux['args']['options']['forum']['objet'] == 'ticket') 
266                && ($id_ticket = intval($flux['args']['options']['forum']['id_objet']))){
267                /**
268                 * On notifie l'id_auteur et l'id_assigné du ticket s'ils ne sont pas l'auteur du post en question
269                 */
270                $auteurs = sql_fetsel('id_auteur,id_assigne','spip_tickets','id_ticket='.intval($id_ticket));
271                if(is_array($auteurs)){
272                        foreach($auteurs as $auteur){
273                    $email = sql_getfetsel('email','spip_auteurs','id_auteur='.intval($auteur));
274                        }
275                }
276                /**
277                 * On notifie les autres forumeurs du ticket
278                 * GROUP BY id_auteur
279                 */
280                $id_forums = sql_select('*','spip_forum','objet='.sql_quote('ticket').' AND id_objet='.intval($id_ticket).' AND id_forum != '.intval($flux['args']['options']['forum']['id_forum']),array('id_auteur'));
281                while($forum = sql_fetch($id_forums)){
282                        $email = sql_getfetsel('email','spip_auteurs','id_auteur='.intval($forum['id_auteur']));
283                        $flux['data'][] = $email;
284                }
285        /** On notifie les personnes référencées dans le ticket via [->autXXX] ou [->autWWW]
286        */
287        $match=array();
288        preg_match_all("#\[(.*)->(aut|auteur)(\d*)\]#U",$flux['args']['options']['forum']['texte'],$match);
289        $auteurs = $match[3];
290        foreach($auteurs as $auteur){
291                if ($auteur!=$flux['args']['options']['forum']['id_auteur']){
292                    $email = sql_getfetsel('email','spip_auteurs','id_auteur='.intval($auteur));
293                    $flux['data'][] = $email;
294                }   
295            }
296        }
297        return $flux;
298}
299
300/**
301 * Insertion dans le pipeline revisions_chercher_label (Révisions)
302 * Ajoute les labels des champs qui peuvent être révisés
303 *
304 * @param array $flux
305 *              Le contexte du pipeline
306 * @return array $flux
307 *              Le contexte modifié
308 */
309function tickets_revisions_chercher_label($flux){
310        if($flux['args']['objet'] == 'ticket'){
311                switch ($flux['args']['champ']){
312                        case 'composant':
313                                $flux['data'] = "tickets:champ_composant";
314                                break;
315                        case 'jalon':
316                                $flux['data'] = "tickets:champ_jalon";
317                                break;
318                        case 'navigateur':
319                                $flux['data'] = "tickets:champ_navigateur";
320                                break;
321                        case 'projet':
322                                $flux['data'] = "tickets:champ_projet";
323                                break;
324                        case 'severite':
325                                $flux['data'] = "tickets:champ_severite";
326                                break;
327                        case 'sticked':
328                                $flux['data'] = "tickets:champ_sticked";
329                                break;
330                        case 'tracker':
331                                $flux['data'] = "tickets:champ_type";
332                                break;
333                        case 'version':
334                                $flux['data'] = "tickets:champ_version";
335                                break;
336                }
337        }
338        return $flux;
339}
340?>
Note: See TracBrowser for help on using the repository browser.