source: spip-zone/_plugins_/_stable_/agenda/saisie_rapide/exec/saisie_rapide.php @ 7817

Last change on this file since 7817 was 7817, checked in by patfr@…, 14 years ago
  • resolution d'un bug utf-8
  • retrait de la saisie sur les modifications
  • nouvelle fonction : saisie rapide des mots clés !
File size: 15.9 KB
Line 
1<?php
2/*
3ajout d'une fonctionnalite de saisie rapide au plugin agenda.
4c'est trop penible d'ajouter les evenements un par un qd yen a plus de trois...
5en gros, pour moi, ca me change trop la vie !
6
7j'attends l'avis des developpeurs pour l'inserer eventuellement plus tard au plugin s'ils le desirent.
8Cette extension est testee sous spip 1.9.2 et fonctionne probablement sous spip 1.9.1.
9
10fichiers à 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
15attention : aucune internationalisation pour l'instant !
16
17Patrice VANNEUFVILLE - patrice.vanneufville(arob)laposte(pt)net
18
19Syntaxe :
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
22Les crochets indiquent les éléments facultatifs.
23Les répétitions de l'évènement sont indiquées par 'REP=' suivi d'une liste de dates séparées par des virgules.
24Bien respecter les espaces entre les éléments et ne pas mettre de guillemets dans les textes.
25
26Exemple 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)
28Exemple 2 : 17/08-23/08 "Stage d'été " "Les Salines"
29        (ajoute un évènement cette année, sans description et sur plusieurs jours)
30Exemple 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
35if (!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 &eacute;v&egrave;nements ont bien &eacute;t&eacute; enregistr&eacute;s :", 
43 'saisie_rapide_compiler' => "Compiler et v&eacute;rifier la liste",
44 'saisie_rapide_enregistrer' => "Enregistrer ces &eacute;v&egrave;nements",
45 'saisie_rapide_votre_liste' => "VOTRE LISTE D'EVENEMENTS",
46 'saisie_rapide_votre_liste_infos' => "Indiquer un seul &eacute;v&egrave;nement (&eacute;ventuellement ses r&eacute;p&eacute;titions) par ligne :",
47 'saisie_rapide_article' => "Article propri&eacute;taire : ",
48 'saisie_rapide_compilation' => "COMPILATION DE LA LISTE",
49 'saisie_rapide_compilation_infos' => "Voici votre liste interpr&eacute;t&eacute;e par le compilateur.<br />En absence d'erreur, enregistrez d&eacute;finitivement les &eacute;v&egrave;nements suivants :",
50 'saisie_rapide_occurences' => "Autres occurences :",
51 'saisie_rapide_mots_clefs' => "Mots-cl&eacute;s accept&eacute;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&eacute;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
62global $spip_version_code;
63if ($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
73function 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
85include_spip('inc/agenda_filtres');
86include_spip('inc/agenda_gestion');
87
88function 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
109function 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
119function 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
156function 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
184function 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]:"&nbsp;")."</td><td>".($regs[15]?$regs[15]:"&nbsp;")."</td></tr>\n";
206   if ($regs[16]!="") echo "<tr ><th>&nbsp;</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>&nbsp;</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>&nbsp;</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
234function 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
250function 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> : &quot;jj/mm[/aaaa][-jj/mm[/aaaa]] [hh:mm[-hh:mm]]
266    &quot;Le titre&quot;
267[&quot;Le lieu&quot; [ &quot;La description&quot;]] [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 &eacute;l&eacute;ments facultatifs. <br />
270Les r&eacute;p&eacute;titions de l'&eacute;v&egrave;nement sont indiqu&eacute;es par  'REP=' suivi d'une liste de dates s&eacute;par&eacute;es par des virgules.<br />
271Les mots-cl&eacute;s de l'&eacute;v&egrave;nement sont indiqu&eacute;s par  'MOTS=' suivi d'une liste de mots (&eacute;ventuellement pr&eacute;c&eacute;d&eacute;s de leur groupe) s&eacute;par&eacute;s par des virgules. Attention aux majuscules/minuscules. <br />
272Respectez bien les espaces (ou tabulations) entre les &eacute;l&eacute;ments et ne mettez pas de guillemets &agrave; l'int&eacute;rieur des textes. <br />
273    <br />
274
275    <em>Exemple 1</em> :
27620/09/2006 19:30-22:00 &quot;R&eacute;p&eacute;tition de rentr&eacute;e&quot; &quot;Temple des Gobelins&quot; &quot;Reprise de contact, Durufl&eacute;, et mise au point des calendriers&quot;<br />
277<em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement pr&eacute;cis &agrave; une date pr&eacute;cise, et d'une dur&eacute;e  pr&eacute;cise)</em><br />
278    <em>Exemple 2</em> :
279  17/08-23/08 &quot;Stage d'&eacute;t&eacute;
280  <?=date('Y', time())?>
281&quot; &quot;Les Salines&quot; MOTS=photos, Agenda:priv&eacute;<br />
282  <em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement cette ann&eacute;e, sans description et sur plusieurs jours en ajoutant deux mots-cl&eacute;s)<br />
283  Exemple 3</em> :
284  01/01/2007 &quot;Bonne ann&eacute;e &agrave; tous !&quot; REP=01/01/2008,01/01/2009,01/01/2010<br />
285  <em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ajoute un &eacute;v&egrave;nement sans horaire, sans lieu, &agrave; une date pr&eacute;cise et r&eacute;p&eacute;t&eacute; sur 3 autres dates)</em><br />
286  <em></em> </p>
287  <?php fin_cadre_formulaire(); 
288}
289
290function 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?>
Note: See TracBrowser for help on using the repository browser.