source: spip-zone/_plugins_/_stable_/agenda/1_9_2/inc/agenda_saisie_rapide.php @ 13779

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

bug dans la saisie rapide

File size: 11.0 KB
Line 
1<?php
2
3if ($GLOBALS['spip_version_code']<1.92){
4 function set_request($var, $val = NULL) {
5        unset($_GET[$var]);
6        unset($_POST[$var]);
7        if ($val !== NULL) $_GET[$var] = $val;
8 }
9}
10
11// retourne un tableau de mots ou d'expressions a partir d'un texte
12function Agenda_retourne_liste_mots($texte) {
13        $texte = preg_replace("/[\|\s\t\n\r]+/", " ", $texte);
14        $split = split('"', $texte);
15        $c = count($split);
16        for($i=0; $i<$c; $i++) if ($i & 1) $split[$i] = preg_replace('/[ ,]+/', '+', trim($split[$i]));
17        $texte = join('', $split);
18        $texte = preg_replace("/ *,+ */","\t", $texte);
19        $texte = preg_replace("/\++/"," ", $texte);
20        return array_unique(split("\t", trim($texte)));
21}
22
23define('_format_heure', '([0-2]\d|\d)?:?([0-5]\d|\d)?');
24define('_format_annee', '([12]\d{3}|\d{2}|\d{1})?');
25define('_format_date1', '([0-3]\d|[0-9]\d)/([0-1]\d|[0-9]\d)/?'._format_annee.' ?'._format_heure);
26define('_format_date2', '- ?([0-3]\d|[0-9]\d)/([0-1]\d|[0-9]\d)/?'._format_annee);
27define('_format_descrip', '" ?([^ ^"][^"]*) ?" ?("([^"]*)")? ?("([^"]*)")? ?((MOTS|REP) ?=.*)?');
28
29function Agenda_compile_une_ligne($s0) {
30                $s = trim($s0);
31                $s = preg_replace(",\s+,", " ", $s);
32
33                // recherche de la date_debut
34                if (!preg_match(","._format_date1.",", $s, $r1)) return false;
35                list(,$s) = split($r1[0], $s, 2); $s = trim($s);
36                // annee_debut omise et format
37                if($r1[3]=='') $r1[3]=date('Y', time());
38                        else $r1[3] = date("Y", mktime(0,0,0,1,1,intval($r1[3])));
39                // heure_debut omise
40                $evenement_horaire = $r1[4].$r1[5]!='';
41                if($r1[4]=='') $r1[4]='00';
42                if($r1[5]=='') $r1[5]='00';
43
44                // recherche de la date_fin
45                if (preg_match(","._format_date2.",", $s, $r2)) $s = trim(substr($s, strlen($r2[0])));
46                if (preg_match(',-? ?'._format_heure.',', $s, $r3)) $s = trim(substr($s, strlen($r3[0])));
47                // date_fin omise
48                if($r2[1]=='') $r2[1]=$r1[1];
49                if($r2[2]=='') $r2[2]=$r1[2];
50                if($r2[3]=='') $r2[3]=$r1[3];   
51                        // annee en format 0000
52                        else $r2[3] = date("Y", mktime(0,0,0,1,1,intval($r2[3])));
53                // heure_fin omise
54                $evenement_horaire |= $r3[1].$r3[2]!='';
55                $r2[4]=!intval($r3[1])?'00':$r3[1];
56                $r2[5]=!intval($r3[2])?'00':$r3[2];
57                if("$r2[4]$r2[5]"==="0000" && "$r1[1]$r1[2]$r1[3]"==="$r2[1]$r2[2]$r2[3]")
58                        { $r2[4]=$r1[4]; $r2[5]=$r1[5]; }
59                // date_fin anterieure a date_debut
60                if (mktime($r2[4], $r2[5], 0, $r2[2], $r2[1], $r2[3]) < mktime($r1[4], $r1[5], 0, $r1[2], $r1[1], $r1[3])) {
61                        $temp = array($r2[4], $r2[5], $r2[2], $r2[1], $r2[3]); 
62                        list($r2[4], $r2[5], $r2[2], $r2[1], $r2[3]) = array($r1[4], $r1[5], $r1[2], $r1[1], $r1[3]);
63                        list($r1[4], $r1[5], $r1[2], $r1[1], $r1[3]) = $temp;
64                }
65                // merge et format '00'
66                unset($r2[0]);
67                $r1 = array_merge($r1, $r2);
68                for ($i=1;$i<=10;$i++) if(strlen($r1[$i])<2) $r1[$i] = sprintf("%02d", intval($r1[$i]));
69
70                // recherche du reste de la chaine
71                if (!preg_match(","._format_descrip.",", $s, $r2)) return false;
72                // cas des REP= et MOTS=
73                $listes = preg_split('/(MOTS|REP) *= */', $r2[6], -1, PREG_SPLIT_DELIM_CAPTURE);
74                $selected_rep = $rep = $mots = array();
75                foreach($listes as $i => $valeur) if ($i & 1) {
76                        if ($valeur=='REP' && preg_match('@([0-9 /,]+)@', $listes[$i+1], $regs2))
77                                $rep = array_merge($rep, Agenda_retourne_liste_mots($regs2[1]));
78                        elseif ($valeur=='MOTS')
79                                $mots = array_merge($mots, Agenda_retourne_liste_mots($listes[$i+1]));
80                }
81                // mettre les repetitions au format du textarea du formulaire normal
82                foreach($rep as $k=>$r){
83                        $r =explode("/", $r);
84                        // annee omise : annee de l'evenement source
85                        if(!intval($r[2])) $r[2]=$r1[3];
86                        // mois omis : mois de l'evenement source
87                        if(!intval($r[1])) $r[1]=$r1[2];
88                        $selected_rep[] = sprintf('%02d/%02d/%04d', $r[1], $r[0], $r[2]);
89                        $rep[$k] = mktime($r1[4], $r1[5], 0, $r[1], $r[0], $r[2]);
90                }
91                // on renvoie un tableau avec toutes les donnees interpretees
92                return array(0=>$r1, 'horaire'=>$evenement_horaire?'oui':'non', 
93                        'titre'=>$r2[1], 'lieu'=>$r2[3], 'descrip'=>$r2[5], 'rep'=>$rep, 'selected_rep'=>$selected_rep, 'mots'=>$mots);
94}
95
96function Agenda_compile_texte_saisie_rapide($texte) {
97        $t = preg_split(",[\n\r]+,", html_entity_decode($texte));
98        foreach($t as $e=>$v) {
99                if (!$r = Agenda_compile_une_ligne($v)) {
100                        if (strlen(trim($v))) $t[$e]=array(); else unset($t[$e]);
101                        continue;
102                }
103                // todo : mettre les mots au format des select du formulaire normal
104                // pour faciliter la selection par l'utilisateur
105                $mots_compiles = Agenda_verifie_les_mots_clefs($r['mots']);
106                $selected_rep = join(',', $r['selected_rep']);
107                // remise en forme en doubon : idem a un post ou idem a un spip_query
108                $t[$e]=array_merge(array(
109                        'jour_evenement_debut' => $r[0][1],
110                        'mois_evenement_debut' => $r[0][2],
111                        'annee_evenement_debut' => $r[0][3],
112                        'heure_evenement_debut' => $r[0][4],
113                        'minute_evenement_debut' => $r[0][5],
114                        'jour_evenement_fin' => $r[0][6],
115                        'mois_evenement_fin' => $r[0][7],
116                        'annee_evenement_fin' => $r[0][8],
117                        'heure_evenement_fin' => $r[0][9],
118                        'minute_evenement_fin' => $r[0][10],
119                        'evenement_horaire' => $r['horaire'],
120                        'evenement_titre' => $r['titre'],
121                        'evenement_lieu' => $r['lieu'],
122                        'evenement_descriptif' => $r['descrip'],
123                        'evenement_groupe_mot_select' => $mots_compiles['echo'],
124                        'evenement_repetitions' => $r['rep'],
125                        'selected_date_repetitions' => $selected_rep
126                ), $mots_compiles['post']);
127        } // foreach($t as $e=>$v)
128        return $t;
129}
130
131// retourne le tableau des mots acceptes par groupe
132function Agenda_verifie_les_mots_clefs($mots_envoyes) {
133        $les_mots_ok = $mots_compiles = array();
134        // on recupere tous les mots cles sur les evenements
135        $res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui'");
136        while ($row = spip_fetch_array($res,SPIP_ASSOC)){
137                $id_groupe = $row['id_groupe'];
138                $titre = supprimer_numero($row['titre']);
139                $res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe=".spip_abstract_quote($id_groupe));
140                while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){
141                        $les_mots_ok[]=array(   'nb'=>0, 'id_mot'=>$row2['id_mot'], 'titre_mot'=> $row2['titre'],
142                                                                                        'id_groupe'=>$id_groupe, 'titre_groupe'=> $titre,
143                                                                                        'echo' => $titre.':'.$row2['titre']);
144                }
145        }
146        $mots_compiles = array('echo'=>array(),'post'=>array());
147        // on voit quels mots cles on retient...
148        foreach($mots_envoyes as $mot) {
149                if (preg_match('/((([^:]+):)?(.*))/', $mot, $regs))
150                        foreach($les_mots_ok as $mot_ok=>$tab){
151                                $test_mot_ok = ($tab['titre_mot']==$regs[4]) || ($tab['id_mot']==$regs[4]);
152                                $test_groupe_ok = (''==$regs[3]) || ($tab['titre_groupe']==$regs[3]) || ($tab['id_groupe']==$regs[3]);
153                                if ($test_mot_ok && $test_groupe_ok) {
154                                        $mots_compiles['echo'][$tab['id_mot']] = $tab['echo'];
155                                        $mots_compiles['post']["evenement_groupe_mot_select_".$tab['id_groupe']][$tab['id_mot']] = $tab['id_mot'];
156                                        break;
157                                }
158                        }
159        }
160        return $mots_compiles;
161}
162
163function Agenda_formulaire_saisie_rapide_previsu() {
164        global $spip_lang_right;
165        $out = "";
166        if ($evenements_saisie_rapide = _request('evenements_saisie_rapide')){
167                $t = Agenda_compile_texte_saisie_rapide($evenements_saisie_rapide);
168                $out .= "<div class='liste liste-evenements'>";
169                $out .= "<table width='100%' cellpadding='3' cellspacing='0' border='0' background=''>";
170                $table = array();
171                $table[] = array('',
172                        '<strong>'._T('agenda:evenement_titre').'</strong>',
173                        '<strong>'. _T('agenda:evenement_lieu').'</strong>',
174                        '<strong>'._T('agenda:evenement_descriptif').'</strong>');
175                foreach($t as $id_eve=>$eve) if (count($eve)) {
176                        $vals = array();
177                        $titre = typo($eve['evenement_titre']);
178                        $lieu = typo($eve['evenement_lieu']);
179                        $descriptif = typo($eve['evenement_descriptif']);
180                        $horaire = $eve['evenement_horaire'];
181                        $date_debut = mktime($eve['heure_evenement_debut'], $eve['minute_evenement_debut'], 0, 
182                                $eve['mois_evenement_debut'], $eve['jour_evenement_debut'], $eve['annee_evenement_debut']);
183                        $date_fin = mktime($eve['heure_evenement_fin'], $eve['minute_evenement_fin'], 0,
184                                $eve['mois_evenement_fin'], $eve['jour_evenement_fin'], $eve['annee_evenement_fin']);
185
186                        $s = Agenda_afficher_date_evenement($date_debut, $date_fin, $horaire);
187                        if ($c = count($eve['evenement_repetitions'])){
188                                $s_rep = "";
189                                foreach($eve['evenement_repetitions'] as $rep){
190                                        $rep_date_debut = $rep;
191                                        $rep_date_fin = $rep_date_debut + $date_fin - $date_debut;
192                                        $s_rep .= Agenda_afficher_date_evenement($rep_date_debut, $rep_date_fin, $horaire)."<br/>";
193                                }
194                                $s .= "<br/><div style=\"\">".bouton_block_invisible("repetitions_evenement_rapide_{$id_eve}");
195                                if ($c>1) $s .= _T('agenda:nb_repetitions', array('nb' => $c));
196                                        else $s .= _T('agenda:une_repetition');
197                                $s .= debut_block_invisible("repetitions_evenement_rapide_{$id_eve}");
198                                $s .= $s_rep;
199                                $s .= fin_block().'</div>';
200                        }
201                        $vals[] = $s;
202                        $vals[] = $titre;
203                        $vals[] = $lieu;
204                        $s = '';
205                        if ($c = count($eve['evenement_groupe_mot_select'])){
206                                $s .= "<br/>".bouton_block_invisible("mots_evenement_rapide_{$id_eve}");
207                                if ($c>1) $s .= _T('agenda:nb_mots_clefs', array('nb' => $c));
208                                        else $s .= _T('agenda:un_mot_clef');
209                                $s .= debut_block_invisible("mots_evenement_rapide_{$id_eve}");
210                                $s .= implode(", ", $eve['evenement_groupe_mot_select']);
211                                $s .= fin_block();
212                        }
213                        $vals[] = propre($descriptif) . $s;
214                        $table[] = $vals;
215
216                } // foreach($t as $id_eve=>$eve) if (count($eve))
217                else $table[] = array('', '?', '', '');
218
219                $largeurs = array('', '', '', '');
220                $styles = array('arial11', 'arial11', 'arial11', 'arial11');
221                $out .= afficher_liste($largeurs, $table, $styles);
222
223                $out .= "</table></div>\n";
224                $out .= "<span style='display:none'>";
225                $out .= "<textarea name='evenements_saisie_rapide' rows='10' class='forml' >";
226                $out .= _request('evenements_saisie_rapide');
227                $out .= "</textarea>";
228                $out .= "</span>";
229                $out .= "<div style='text-align:$spip_lang_right;'><input class='fondo' type='submit' value='"._T('bouton_enregistrer')."'></div>";
230        }
231        return $out;
232}
233
234function Agenda_formulaire_saisie_rapide() {
235        global $spip_lang_right, $id_article;
236        $out = "";
237        //$out .= debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png",true, "", _T('saisierapide:saisie_rapide_votre_liste'));
238        $out .= _T('saisierapide:votre_liste_infos');
239        $out .= "<input type='hidden' name='saisie_rapide' value='1' />";
240        $out .= "<textarea name='evenements_saisie_rapide' rows='10' class='forml' >";
241        $out .= _request('evenements_saisie_rapide');
242        $out .= "</textarea>";
243        $out .= ajax_action_auteur('editer_evenement',"$id_article-creer-0", $script, "id_article=$id_article&saisie_rapide=1", array(_T("saisierapide:reset"),''));
244        $out .= "<div style='text-align:$spip_lang_right;'><input class='fondo' type='submit' value='"._T('previsualiser')."'></div>";
245        $out .= "<p>";
246  //$out .= fin_cadre_enfonce(true);
247
248  $out .= debut_cadre_formulaire('',true);
249  $out .= propre(_T('saisierapide:explications'))
250                        . '<hr />'
251                        . propre(_T('saisierapide:exemples', array('Y' => date('Y', time()))));
252  $out .= fin_cadre_formulaire(true);
253  return $out;
254}
255
256?>
Note: See TracBrowser for help on using the repository browser.