1 | <?php |
---|
2 | /* |
---|
3 | ajout d'une fonctionnalite de saisie rapide au plugin agenda. |
---|
4 | c'est trop penible d'ajouter les evenements un par un qd yen a plus de trois... |
---|
5 | en gros, pour moi, ca me change trop la vie ! |
---|
6 | |
---|
7 | j'attends l'avis des developpeurs pour l'inserer eventuellement plus tard au plugin s'ils le desirent. |
---|
8 | Cette extension est testee sous spip 1.9.2 et fonctionne probablement sous spip 1.9.1. |
---|
9 | |
---|
10 | fichiers à placer dans le repertoire plugins/agenda : |
---|
11 | exec/saisie_rapide.php : dialogue de saisie rapide |
---|
12 | inc/agenda_gestion.php : fichier d'origine modifie |
---|
13 | SAISIE.TXT : les details. |
---|
14 | |
---|
15 | attention : aucune internationalisation pour l'instant ! |
---|
16 | |
---|
17 | Patrice VANNEUFVILLE - patrice.vanneufville(arob)laposte(pt)net |
---|
18 | |
---|
19 | Syntaxe : |
---|
20 | "jj/mm[/aaaa][-jj/mm[/aaaa]] [hh:mm[-hh:mm]] "Le titre" ["Le lieu" [ "La description"]] [REP=jj/mm/aaaa[,jj/mm/aaaa,etc]] |
---|
21 | |
---|
22 | Les crochets indiquent les éléments facultatifs. |
---|
23 | Les répétitions de l'évènement sont indiquées par 'REP=' suivi d'une liste de dates séparées par des virgules. |
---|
24 | Bien respecter les espaces entre les éléments et ne pas mettre de guillemets dans les textes. |
---|
25 | |
---|
26 | Exemple 1 : 20/09/2006 19:30-22:00 "Répétition de rentrée" "Temple des Gobelins" "Reprise de contact, Duruflé, et mise au point des calendriers" |
---|
27 | (ajoute un évènement précis à une date précise, et d'une durée précise) |
---|
28 | Exemple 2 : 17/08-23/08 "Stage d'été " "Les Salines" |
---|
29 | (ajoute un évènement cette année, sans description et sur plusieurs jours) |
---|
30 | Exemple 3 : 01/01/2007 "Bonne année à tous !" REP=01/01/2008,01/01/2009,01/01/2010 |
---|
31 | (ajoute un évènement sans horaire, sans lieu, à une date précise et répété sur 3 autres dates) |
---|
32 | |
---|
33 | */ |
---|
34 | |
---|
35 | if (!defined("_ECRIRE_INC_VERSION")) return; |
---|
36 | |
---|
37 | // essai d'intertionalisation... |
---|
38 | // les lignes suivantes devront être inclues dans les fichiers de langue |
---|
39 | $test = _T('onchargelalangue'); |
---|
40 | $GLOBALS[$GLOBALS['idx_lang']] += array( |
---|
41 | 'saisie_rapide_entete' => "L'agenda pour les experts", |
---|
42 | 'saisie_rapide_merci' => "Merci, vos évènements ont bien été enregistrés :", |
---|
43 | 'saisie_rapide_compiler' => "Compiler et vérifier la liste", |
---|
44 | 'saisie_rapide_enregistrer' => "Enregistrer ces évènements", |
---|
45 | 'saisie_rapide_votre_liste' => "VOTRE LISTE D'EVENEMENTS", |
---|
46 | 'saisie_rapide_votre_liste_infos' => "Indiquer un seul évènement (éventuellement ses répétitions) par ligne :", |
---|
47 | 'saisie_rapide_article' => "Article propriétaire : ", |
---|
48 | 'saisie_rapide_compilation' => "COMPILATION DE LA LISTE", |
---|
49 | 'saisie_rapide_compilation_infos' => "Voici votre liste interprétée par le compilateur.<br />En absence d'erreur, enregistrez définitivement les évènements suivants :", |
---|
50 | 'saisie_rapide_occurences' => "Autres occurences :", |
---|
51 | 'saisie_rapide_mots_clefs' => "Mots-clés acceptés :", |
---|
52 | 'saisie_rapide_aucun_mot' => "aucun n'existe !", |
---|
53 | 'saisie_rapide_evenement_de' => "EVENEMENTS DE : ", |
---|
54 | 'saisie_rapide_heure_id' => "Id.", |
---|
55 | 'saisie_rapide_heure_debut' => "Heure de début", |
---|
56 | 'saisie_rapide_heure_fin' => "Heure de fin", |
---|
57 | 'saisie_rapide_fermer' => "Fermer", |
---|
58 | 'saisie_rapide_reset' => "Reset", |
---|
59 | ); |
---|
60 | // fin de l'essai !! |
---|
61 | |
---|
62 | global $spip_version_code; |
---|
63 | if ($spip_version_code<1.92) { |
---|
64 | include_spip('inc/presentation'); |
---|
65 | function set_request($var, $val = NULL) { |
---|
66 | unset($_GET[$var]); |
---|
67 | unset($_POST[$var]); |
---|
68 | if ($val !== NULL) $_GET[$var] = $val; |
---|
69 | } |
---|
70 | } else include_spip('inc/commencer_page'); |
---|
71 | |
---|
72 | // retourne un tableau de mots ou d'expressions a partir d'un texte |
---|
73 | function retourne_liste_mots($texte) { |
---|
74 | $texte = filtrer_entites(trim($texte)); |
---|
75 | $texte = preg_replace("/[\|\s\t\n\r]+/", " ", $texte); |
---|
76 | $split = split('"', $texte); |
---|
77 | $c = count($split); |
---|
78 | for($i=0; $i<$c; $i++) if ($i & 1) $split[$i] = preg_replace('/[ ,]+/', '+', trim($split[$i])); |
---|
79 | $texte = join('', $split); |
---|
80 | $texte = preg_replace("/ *,+ */","\t", $texte); |
---|
81 | $texte = preg_replace("/\++/"," ", $texte); |
---|
82 | return array_unique(split("\t", trim($texte))); |
---|
83 | } |
---|
84 | |
---|
85 | include_spip('inc/agenda_filtres'); |
---|
86 | include_spip('inc/agenda_gestion'); |
---|
87 | |
---|
88 | function affiche_et_enregistre(&$t) { |
---|
89 | global $result; |
---|
90 | // affichage recapitulatif |
---|
91 | debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", false, "", _T('saisie_rapide_merci')); |
---|
92 | foreach($t as $e=>$v) if ($t[$e]=="") unset($t[$e]); |
---|
93 | affiche_table_evenements($t); |
---|
94 | fin_cadre_enfonce(); |
---|
95 | echo "<div align='center'><button class='fondo' onClick='javascript:window.close()'>"._T('saisie_rapide_fermer').'</button></div>'; |
---|
96 | // enregistrer les nouveaux evenements |
---|
97 | set_request('evenement_insert', 1); |
---|
98 | foreach ($result as $r) { |
---|
99 | foreach ($r as $r2=>$v) set_request($r2, $v); |
---|
100 | Agenda_action_formulaire_article(_request('id_article')); |
---|
101 | } |
---|
102 | unset($result); |
---|
103 | // affiche_evenements_article(); // Peut-etre pas necessaire... |
---|
104 | echo "<script type=\"text/javascript\"><!-- |
---|
105 | window.opener.location.reload(); |
---|
106 | --></script>"; |
---|
107 | } |
---|
108 | |
---|
109 | function affiche_evenements_article() { |
---|
110 | global $titre_defaut; |
---|
111 | //echo Agenda_formulaire_article(_request('id_article'), false); |
---|
112 | echo "<br />"; |
---|
113 | debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", false, "", _T('saisie_rapide_evenement_de').$titre_defaut); |
---|
114 | list($s, $les_evenements) = Agenda_formulaire_article_afficher_evenements(_request('id_article'), false); |
---|
115 | echo $s; |
---|
116 | fin_cadre_enfonce(); |
---|
117 | } |
---|
118 | |
---|
119 | function compile_t(&$t) { |
---|
120 | foreach($t as $e=>$v) { |
---|
121 | $t[$e]=trim(str_replace("\t", " ", $t[$e])); |
---|
122 | if (ereg ("([0-9]{1,2})/([0-9]{1,2})/?([0-9]{4})?-?([0-9]{1,2})?/?([0-9]{1,2})?/?([0-9]{4})? +". |
---|
123 | "([0-9]{1,2})?:?([0-9]{1,2})?-?([0-9]{1,2})?:?([0-9]{1,2})? *". |
---|
124 | '" *([^ ^"][^"]*) *" *("([^"]*)")? *("([^"]*)")? *'. |
---|
125 | '((MOTS|REP) *=.*)?', $t[$e]=trim($t[$e]), $regs)) { |
---|
126 | // annee_debut omise |
---|
127 | if($regs[3]=='') $regs[3]=date('Y', time()); |
---|
128 | // annee_fin omise |
---|
129 | if($regs[6]=='') $regs[6]=$regs[3]; ; |
---|
130 | // heure_fin omise |
---|
131 | if($regs[9].$regs[10]=='') { $regs[9]=$regs[7]; $regs[10]=$regs[8]; } |
---|
132 | // date_fin omise |
---|
133 | if($regs[4].$regs[5]=='') { $regs[4]=$regs[1]; $regs[5]=$regs[2]; } |
---|
134 | // format complet |
---|
135 | for ($i=0;$i<=10;$i++) $regs[$i]=sprintf("%02d", intval($regs[$i])); |
---|
136 | // cas des REP= et MOTS= |
---|
137 | $listes = preg_split('/(MOTS|REP) *= */', $regs[16], -1, PREG_SPLIT_DELIM_CAPTURE); |
---|
138 | $rep = $mots = array(); |
---|
139 | foreach($listes as $i => $valeur) if ($i & 1) |
---|
140 | foreach($listes as $i => $valeur) if ($i & 1) { |
---|
141 | if ($valeur=='REP' && ereg('([0-9 /,]*)', $listes[$i+1], $regs2)) |
---|
142 | $rep = array_merge($rep, retourne_liste_mots($regs2[1])); |
---|
143 | elseif ($valeur=='MOTS') |
---|
144 | $mots = array_merge($mots, retourne_liste_mots($listes[$i+1])); |
---|
145 | } |
---|
146 | $regs[17] = str_replace(',', ', ', str_replace(' ', '',join(',',$rep))); |
---|
147 | $regs[18] = join(', ',$mots); |
---|
148 | // remise en forme |
---|
149 | $t[$e]="$regs[1]/$regs[2]/$regs[3]-$regs[4]/$regs[5]/$regs[6] $regs[7]:$regs[8]-$regs[9]:$regs[10]". |
---|
150 | " \"$regs[11]\" \"$regs[13]\" \"$regs[15]\" REP=$regs[17] MOTS=$regs[18]"; |
---|
151 | } else { if ($t[$e]!="") $t[$e]=""; else unset($t[$e]); } |
---|
152 | } |
---|
153 | } |
---|
154 | |
---|
155 | // retourne le tableau des mots acceptés par groupe |
---|
156 | function verifie_les_mots_clefs($mots_envoyes) { |
---|
157 | $les_mots_ok = $mots_compiles = array(); |
---|
158 | // on recupere tous les mots cles sur les evenements |
---|
159 | $res = spip_query("SELECT * FROM spip_groupes_mots WHERE evenements='oui'"); |
---|
160 | while ($row = spip_fetch_array($res,SPIP_ASSOC)){ |
---|
161 | $id_groupe = $row['id_groupe']; |
---|
162 | $titre = supprimer_numero($row['titre']); |
---|
163 | $res2= spip_query("SELECT * FROM spip_mots WHERE id_groupe=".spip_abstract_quote($id_groupe)); |
---|
164 | while ($row2 = spip_fetch_array($res2,SPIP_ASSOC)){ |
---|
165 | $les_mots_ok[]=array( 'nb'=>0, 'id_mot'=>$row2['id_mot'], 'titre_mot'=> $row2['titre'], |
---|
166 | 'id_groupe'=>$id_groupe, 'titre_groupe'=> $titre, |
---|
167 | 'echo' => $titre.':'.$row2['titre']); |
---|
168 | } |
---|
169 | } |
---|
170 | // on voit quels mots cles on retient... |
---|
171 | foreach($mots_envoyes as $mot) { if (preg_match('/((([^:]+):)?(.*))/', $mot, $regs)) |
---|
172 | foreach($les_mots_ok as $mot_ok=>$tab) |
---|
173 | if ($tab['titre_mot']==$regs[4] && ($regs[3]=='' || $regs[3]==$tab['titre_groupe'])) |
---|
174 | { ++$les_mots_ok[$mot_ok]['nb']; break; } |
---|
175 | } |
---|
176 | // on renvoie le resultat ! |
---|
177 | foreach($les_mots_ok as $mot_ok=>$tab) if($tab['nb']) { |
---|
178 | $mots_compiles['echo'][] = $tab['echo']; |
---|
179 | $mots_compiles['post'][$tab['id_groupe']][] = $tab['id_mot']; |
---|
180 | } |
---|
181 | return $mots_compiles; |
---|
182 | } |
---|
183 | |
---|
184 | function affiche_table_evenements(&$t) { |
---|
185 | global $result; unset($result); global $result; ?> |
---|
186 | <div class="liste liste-evenements"><table background="" border="0" cellpadding="2" cellspacing="2" width="100%"> |
---|
187 | <tbody><tr class="tr_liste"> |
---|
188 | <th><?=_T('saisie_rapide_heure_id')?></th> |
---|
189 | <th><?=_T('agenda:evenement_date_debut')?></th> |
---|
190 | <th><?=_T('agenda:evenement_date_fin')?></th> |
---|
191 | <th><?=_T('saisie_rapide_heure_debut')?></th> |
---|
192 | <th><?=_T('saisie_rapide_heure_fin')?></th> |
---|
193 | <th><?=_T('agenda:evenement_titre')?></th> |
---|
194 | <th><?=_T('agenda:evenement_lieu')?></th> |
---|
195 | <th><?=_T('agenda:evenement_descriptif')?></th> |
---|
196 | </tr><?php $n=0; |
---|
197 | foreach($t as $e=>$v) { |
---|
198 | echo "<tr ><th>".++$n."</th>"; |
---|
199 | if (ereg ("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})-([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}) ". |
---|
200 | "([0-9]{1,2}):([0-9]{1,2})-([0-9]{1,2}):([0-9]{1,2}) ". |
---|
201 | '"([^"]*)" ("([^"]*)") ("([^"]*)") '. |
---|
202 | 'REP=([0-9 /,]*)? MOTS=(.*)', $t[$e], $regs)) { //print_r($regs); |
---|
203 | echo "<td>$regs[1]/$regs[2]/$regs[3]</td><td>$regs[4]/$regs[5]/$regs[6]</td>"; |
---|
204 | echo "<td><div align=center>$regs[7]:$regs[8]</div></td><td><div align=center>$regs[9]:$regs[10]</div></td>"; |
---|
205 | echo "<td>$regs[11]</td><td>".($regs[13]?$regs[13]:" ")."</td><td>".($regs[15]?$regs[15]:" ")."</td></tr>\n"; |
---|
206 | if ($regs[16]!="") echo "<tr ><th> </th><td colspan=7>"._T('saisie_rapide_occurences')." $regs[16]</td></tr>"; |
---|
207 | $result[$n]['evenement_titre']=$regs[11]; |
---|
208 | $result[$n]['evenement_lieu']=$regs[13]; |
---|
209 | $result[$n]['evenement_descriptif']=$regs[15]; |
---|
210 | $result[$n]['jour_evenement_debut']=$regs[1]; |
---|
211 | $result[$n]['mois_evenement_debut']=$regs[2]; |
---|
212 | $result[$n]['annee_evenement_debut']=$regs[3]; |
---|
213 | $result[$n]['evenement_horaire']="$regs[7]:$regs[8]-$regs[9]:$regs[10]"=="00:00-00:00"?'non':'oui'; |
---|
214 | $result[$n]['heure_evenement_debut']=$regs[7]; |
---|
215 | $result[$n]['minute_evenement_debut']=$regs[8]; |
---|
216 | $result[$n]['jour_evenement_fin']=$regs[4]; |
---|
217 | $result[$n]['mois_evenement_fin']=$regs[5]; |
---|
218 | $result[$n]['annee_evenement_fin']=$regs[6]; |
---|
219 | $result[$n]['heure_evenement_fin']=$regs[9]; |
---|
220 | $result[$n]['minute_evenement_fin']=$regs[10]; |
---|
221 | $result[$n]['selected_date_repetitions']=str_replace(', ',',',$regs[16]); |
---|
222 | $groupes_ok = verifie_les_mots_clefs(split(', ', $regs[17])); |
---|
223 | if (count($groupes_ok['echo'])) { |
---|
224 | $mots_clefs = join(', ', $groupes_ok['echo']); |
---|
225 | echo "<tr ><th> </th><td colspan=7>"._T('saisie_rapide_mots_clefs')." $mots_clefs</td></tr>"; |
---|
226 | foreach($groupes_ok['post'] as $id_groupe=>$mots) $result[$n]["evenement_groupe_mot_select_$id_groupe"]=$mots; |
---|
227 | } elseif ($regs[17]!="") |
---|
228 | echo "<tr ><th> </th><td colspan=7>"._T('saisie_rapide_mots_clefs')." "._T('saisie_rapide_aucun_mot')."</td></tr>"; |
---|
229 | } else echo "<td colspan=7>Format invalide !</td></tr>"; |
---|
230 | } |
---|
231 | ?></tbody></table></div><?php |
---|
232 | } |
---|
233 | |
---|
234 | function affiche_compilation(&$t) { |
---|
235 | debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", false, "", _T('saisie_rapide_compilation')); |
---|
236 | echo _T('saisie_rapide_compilation_infos'); |
---|
237 | ?> |
---|
238 | <form method="POST"> |
---|
239 | <input name='exec' type='hidden' value='saisie_rapide' /> |
---|
240 | <input name='action' type='hidden' value='enregistre' /> |
---|
241 | <input name='id_article' type='hidden' value='<?=_request('id_article')?>' /> |
---|
242 | <input name='liste_evenements' type='hidden' value="<?=htmlspecialchars(_request('liste_evenements'))?>" /> |
---|
243 | <?php affiche_table_evenements($t); ?> |
---|
244 | <div align='right'><input class='fondo' type='submit' value='<?=_T('saisie_rapide_enregistrer')?>'></div> |
---|
245 | </form> |
---|
246 | <?php |
---|
247 | fin_cadre_enfonce(); |
---|
248 | } |
---|
249 | |
---|
250 | function affiche_formulaire() { |
---|
251 | debut_cadre_enfonce("../"._DIR_PLUGIN_AGENDA."/img_pack/agenda-24.png", false, "", _T('saisie_rapide_votre_liste')); |
---|
252 | echo _T('saisie_rapide_votre_liste_infos'); |
---|
253 | ?> |
---|
254 | |
---|
255 | <form method="POST"> |
---|
256 | <input name='exec' type='hidden' value='saisie_rapide' /> |
---|
257 | <input name='action' type='hidden' value='compile' /> |
---|
258 | <input name='id_article' type='hidden' value='<?=_request('id_article')?>' /> |
---|
259 | <textarea name="liste_evenements" style="width: 99%;" rows="10" class="forml" ><?=_request('liste_evenements')?></textarea> |
---|
260 | <a href="<?=generer_url_ecrire("saisie_rapide", "id_article="._request("id_article"))?>"><?=_T('saisie_rapide_reset')?></a> |
---|
261 | <div align='right'><input class='fondo' type='submit' value='<?=_T('saisie_rapide_compiler')?>'></div></form> |
---|
262 | <p> |
---|
263 | <?php fin_cadre_enfonce(); |
---|
264 | debut_cadre_formulaire(); ?> |
---|
265 | <strong>Syntaxe</strong> : "jj/mm[/aaaa][-jj/mm[/aaaa]] [hh:mm[-hh:mm]] |
---|
266 | "Le titre" |
---|
267 | ["Le lieu" [ "La description"]] [REP=jj/mm/aaaa[,jj/mm/aaaa,etc.]] [MOTS=[groupe1:]mot1[,[groupe2:]mot2,etc.]]<br /> |
---|
268 | <br /> |
---|
269 | <strong>Notes</strong> : Les crochets indiquent les éléments facultatifs. <br /> |
---|
270 | Les répétitions de l'évènement sont indiquées par 'REP=' suivi d'une liste de dates séparées par des virgules.<br /> |
---|
271 | Les mots-clés de l'évènement sont indiqués par 'MOTS=' suivi d'une liste de mots (éventuellement précédés de leur groupe) séparés par des virgules. Attention aux majuscules/minuscules. <br /> |
---|
272 | Respectez bien les espaces (ou tabulations) entre les éléments et ne mettez pas de guillemets à l'intérieur des textes. <br /> |
---|
273 | <br /> |
---|
274 | |
---|
275 | <em>Exemple 1</em> : |
---|
276 | 20/09/2006 19:30-22:00 "Répétition de rentrée" "Temple des Gobelins" "Reprise de contact, Duruflé, et mise au point des calendriers"<br /> |
---|
277 | <em> (ajoute un évènement précis à une date précise, et d'une durée précise)</em><br /> |
---|
278 | <em>Exemple 2</em> : |
---|
279 | 17/08-23/08 "Stage d'été |
---|
280 | <?=date('Y', time())?> |
---|
281 | " "Les Salines" MOTS=photos, Agenda:privé<br /> |
---|
282 | <em> (ajoute un évènement cette année, sans description et sur plusieurs jours en ajoutant deux mots-clés)<br /> |
---|
283 | Exemple 3</em> : |
---|
284 | 01/01/2007 "Bonne année à tous !" REP=01/01/2008,01/01/2009,01/01/2010<br /> |
---|
285 | <em> (ajoute un évènement sans horaire, sans lieu, à une date précise et répété sur 3 autres dates)</em><br /> |
---|
286 | <em></em> </p> |
---|
287 | <?php fin_cadre_formulaire(); |
---|
288 | } |
---|
289 | |
---|
290 | function exec_saisie_rapide_dist() |
---|
291 | { global $titre_defaut; |
---|
292 | header("Content-Type: text/html; charset=utf-8"); |
---|
293 | //echo _DOCTYPE_ECRIRE, html_lang_attributes(); |
---|
294 | //echo "<head><title>", "L'agenda pour les experts", "</title></head>\n"; |
---|
295 | |
---|
296 | // s'assurer que les tables sont crees |
---|
297 | Agenda_install(); |
---|
298 | |
---|
299 | include_spip('inc/headers'); |
---|
300 | http_no_cache(); |
---|
301 | echo init_entete(_T('saisie_rapide_entete'), 0); |
---|
302 | |
---|
303 | echo "<body>"; |
---|
304 | $titre_defaut = ""; |
---|
305 | $res = spip_query("SELECT titre FROM spip_articles where id_article=".spip_abstract_quote(_request('id_article'))); |
---|
306 | if ($row = spip_fetch_array($res)) $titre_defaut = $row['titre']; |
---|
307 | echo '<h3>'._T('saisie_rapide_article')._request('id_article').". $titre_defaut</h3>"; |
---|
308 | $t=split("\n",html_entity_decode(_request('liste_evenements'))); |
---|
309 | // print_r($t); |
---|
310 | compile_t($t); |
---|
311 | if (_request('action')=='enregistre') |
---|
312 | affiche_et_enregistre($t); |
---|
313 | else { |
---|
314 | if (_request('liste_evenements')) affiche_compilation($t); |
---|
315 | affiche_formulaire(); |
---|
316 | affiche_evenements_article(); |
---|
317 | } |
---|
318 | |
---|
319 | echo "</body></html>"; |
---|
320 | } |
---|
321 | ?> |
---|