~maj plugins
[ptitvelo/web/www.git] / www / plugins / agenda_3_5 / public / agenda.php
1 <?php
2 /**
3 * Plugin Agenda 4 pour Spip 3.0
4 * Licence GPL 3
5 *
6 * 2006-2011
7 * Auteurs : cf paquet.xml
8 */
9
10 if (!defined("_ECRIRE_INC_VERSION")) return;
11
12 /**
13 * #URL_EVENEMENT envoie sur la page de l'evenement
14 * ou sur la page de l'article avec un &id_evenement=xxx
15 * selon la configuration de l'agenda
16 *
17 * @param object $p
18 * @return object
19 */
20 function balise_URL_EVENEMENT_dist($p) {
21
22 include_spip("inc/config");
23 include_spip("balise/url_");
24
25 if (lire_config("agenda/url_evenement",'evenement')!=='article'){
26 $code = generer_generer_url('evenement', $p);
27 }
28 else {
29 $_ide = interprete_argument_balise(1,$p);
30 if (!$_ide)
31 $_ide = champ_sql('id_evenement', $p);
32 $_ida = "generer_info_entite($_ide,'evenement','id_article')";
33
34 $code = generer_generer_url_arg('article', $p, $_ida);
35 $code = "parametre_url($code,'id_evenement',$_ide,'&')";
36 }
37
38 $code = champ_sql('url_evenement', $p, $code);
39 $p->code = $code;
40 if (!$p->etoile)
41 $p->code = "vider_url($code)";
42 $p->interdire_scripts = false;
43
44 return $p;
45 }
46
47
48 /**
49 * fonction sous jacente pour les 3 criteres
50 * fusion_par_jour, fusion_par_mois, fusion_par_annee
51 *
52 * @param string $format
53 * @param strinf $as
54 * @param string $idb
55 * @param object $boucles
56 * @param object $crit
57 */
58 function agenda_critere_fusion_par_xx($format, $as, $idb, &$boucles, $crit){
59 $boucle = &$boucles[$idb];
60 $type = $boucle->type_requete;
61 $_date = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent)
62 : "'".(isset($GLOBALS['table_date'][$type])?$GLOBALS['table_date'][$type]:"date")."'";
63
64 $date = $boucle->id_table. '.' .substr($_date,1,-1);
65
66 // annuler une eventuelle fusion sur cle primaire !
67 foreach($boucles[$idb]->group as $k=>$g)
68 if ($g==$boucle->id_table.'.'.$boucle->primary)
69 unset($boucles[$idb]->group[$k]);
70 $boucles[$idb]->group[] = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format')";
71 $boucles[$idb]->select[] = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format') AS $as";
72 }
73
74 /**
75 * {fusion_par_jour date_debut}
76 * {fusion_par_jour date_fin}
77 *
78 * @param string $idb
79 * @param object $boucles
80 * @param object $crit
81 */
82 function critere_fusion_par_jour_dist($idb, &$boucles, $crit) {
83 agenda_critere_fusion_par_xx('%Y-%m-%d','jour',$idb, $boucles, $crit);
84 }
85
86 /**
87 * {fusion_par_mois date_debut}
88 * {fusion_par_mois date_fin}
89 *
90 * @param string $idb
91 * @param object $boucles
92 * @param object $crit
93 */
94 function critere_fusion_par_mois_dist($idb, &$boucles, $crit) {
95 agenda_critere_fusion_par_xx('%Y-%m','mois',$idb, $boucles, $crit);
96 }
97
98 /**
99 * {fusion_par_annee date_debut}
100 * {fusion_par_annee date_fin}
101 *
102 * @param string $idb
103 * @param object $boucles
104 * @param object $crit
105 */
106 function critere_fusion_par_annee_dist($idb, &$boucles, $crit) {
107 agenda_critere_fusion_par_xx('%Y','annee',$idb, $boucles, $crit);
108 }
109
110 /**
111 * {evenement_a_venir}
112 * {evenement_a_venir #ENV{date}}
113 *
114 * @param string $idb
115 * @param object $boucles
116 * @param object $crit
117 */
118 function critere_evenement_a_venir_dist($idb, &$boucles, $crit) {
119 $boucle = &$boucles[$idb];
120 $id_table = $boucle->id_table;
121
122 $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);
123 $_date = "$id_table.date_debut";
124 $op = $crit->not ? "<=":">";
125
126 // si on ne sait pas si les heures comptent, on utilise toute la journee.
127 // sinon, on s'appuie sur le champ 'horaire=oui'
128 // pour savoir si les dates utilisent les heures ou pas.
129 $where_futur_sans_heure =
130 array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))");
131
132 if (array_key_exists('horaire', $boucle->show['field'])) {
133 $where =
134 array("'OR'",
135 array("'AND'",
136 array("'='", "'horaire'", "sql_quote('oui')"),
137 array("'$op'","'$_date'","sql_quote($_dateref)")
138 ),
139 array("'AND'",
140 array("'!='", "'horaire'", "sql_quote('oui')"),
141 $where_futur_sans_heure
142 )
143 );
144 } else {
145 $where = $where_futur_sans_heure;
146 }
147
148
149 $boucle->where[] = $where;
150 }
151
152 /**
153 * {evenement_passe}
154 * {evenement_passe #ENV{date}}
155 *
156 * @param string $idb
157 * @param object $boucles
158 * @param object $crit
159 */
160 function critere_evenement_passe_dist($idb, &$boucles, $crit) {
161 $boucle = &$boucles[$idb];
162 $id_table = $boucle->id_table;
163
164 $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);
165 $_date = "$id_table.date_fin";
166 $op = $crit->not ? ">=":"<";
167
168 // si on ne sait pas si les heures comptent, on utilise toute la journee.
169 // sinon, on s'appuie sur le champ 'horaire=oui'
170 // pour savoir si les dates utilisent les heures ou pas.
171 $where_passe_sans_heure =
172 array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))");
173
174 if (array_key_exists('horaire', $boucle->show['field'])) {
175 $where =
176 array("'OR'",
177 array("'AND'",
178 array("'='", "'horaire'", "sql_quote('oui')"),
179 array("'$op'","'$_date'","sql_quote($_dateref)")
180 ),
181 array("'AND'",
182 array("'!='", "'horaire'", "sql_quote('oui')"),
183 $where_passe_sans_heure
184 )
185 );
186 } else {
187 $where = $where_passe_sans_heure;
188 }
189
190
191 $boucle->where[] = $where;
192 }
193
194 /**
195 * {evenement_en_cours}
196 * {evenement_en_cours #ENV{date}}
197 *
198 * @param string $idb
199 * @param object $boucles
200 * @param object $crit
201 */
202 function critere_evenement_en_cours_dist($idb, &$boucles, $crit) {
203 $boucle = &$boucles[$idb];
204 $id_table = $boucle->id_table;
205
206 $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);
207 $_date_debut = "$id_table.date_debut";
208 $_date_fin = "$id_table.date_fin";
209
210 // si on ne sait pas si les heures comptent, on utilise toute la journee.
211 // sinon, on s'appuie sur le champ 'horaire=oui'
212 // pour savoir si les dates utilisent les heures ou pas.
213 $where_jour_sans_heure =
214 array("'AND'",
215 array("'<='", "'$_date_debut'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))"),
216 array("'>='", "'$_date_fin'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))")
217 );
218
219 if (array_key_exists('horaire', $boucle->show['field'])) {
220 $where =
221 array("'OR'",
222 array("'AND'",
223 array("'='", "'horaire'", "sql_quote('oui')"),
224 array("'AND'",
225 array("'<='", "'$_date_debut'", "sql_quote($_dateref)"),
226 array("'>='", "'$_date_fin'", "sql_quote($_dateref)")
227 )
228 ),
229 array("'AND'",
230 array("'!='", "'horaire'", "sql_quote('oui')"),
231 $where_jour_sans_heure
232 )
233 );
234 } else {
235 $where = $where_jour_sans_heure;
236 }
237
238 if ($crit->not)
239 $where = array("'NOT'",$where);
240 $boucle->where[] = $where;
241 }
242
243 /**
244 * {evenementrelatif #ENV{choix}}
245 * {evenementrelatif #ENV{choix}, #ENV{date}}
246 * #ENV{choix} peut prendre 6 valeurs : tout, a_venir, en_cours, passe, en_cours_a_venir ou passe_en_cours
247 *
248 * @param string $idb
249 * @param object $boucles
250 * @param object $crit
251 */
252 function critere_evenementrelatif_dist($idb, &$boucles, $crit) {
253 $boucle = &$boucles[$idb];
254 $id_table = $boucle->id_table;
255 if (isset($crit->param[1]))
256 $_dateref = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
257 else
258 $_dateref = "date('Y-m-d H:i:00')";
259 $not = $crit->not ? 'oui' : '';
260 $choix = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) : "''";
261 $horaire = array_key_exists('horaire', $boucle->show['field']) ? 'oui' : '';
262
263 $boucle->where[] = "agenda_calculer_critere_evenementrelatif('$id_table',$_dateref,'$not',$choix,'$horaire')";
264 }
265
266 /**
267 * Fonction interne utilisee par le critere {evenementrelatif}
268 * @param string $id_table
269 * @param string $_dateref
270 * @param string $not
271 * @param string $choix
272 * @param string $horaire
273 * @return array
274 */
275 function agenda_calculer_critere_evenementrelatif($id_table,$_dateref,$not,$choix,$horaire){
276 $_date_debut = "$id_table.date_debut";
277 $_date_fin = "$id_table.date_fin";
278 if ($choix == 'en_cours_a_venir') {
279 $choix = 'passe';
280 $not = ($not) ? '' : 'oui';
281 }
282 if ($choix == 'passe_en_cours') {
283 $choix = 'a_venir';
284 $not = ($not) ? '' : 'oui';
285 }
286
287 switch($choix) {
288 case 'a_venir':
289 $op_a_venir = $not ? "<=":">";
290 $where_a_venir_sans_heure =
291 array($op_a_venir, $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref))));
292 if ($horaire) {
293 $where =
294 array('OR',
295 array('AND',
296 array('=', 'horaire', sql_quote('oui')),
297 array($op_a_venir,$_date_debut,sql_quote($_dateref))
298 ),
299 array('AND',
300 array('!=', 'horaire', sql_quote('oui')),
301 $where_a_venir_sans_heure
302 )
303 );
304 } else {
305 $where = $where_a_venir_sans_heure;
306 }
307 return $where;
308 break;
309
310 case 'passe':
311 $op_passe = $not ? ">=":"<";
312 $where_passe_sans_heure =
313 array($op_passe, $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))));
314 if ($horaire) {
315 $where =
316 array('OR',
317 array('AND',
318 array('=', 'horaire', sql_quote('oui')),
319 array($op_passe,$_date_fin,sql_quote($_dateref))
320 ),
321 array('AND',
322 array('!=', 'horaire', sql_quote('oui')),
323 $where_passe_sans_heure
324 )
325 );
326 } else {
327 $where = $where_passe_sans_heure;
328 }
329 return $where;
330 break;
331
332 case 'en_cours':
333 $where_en_cours_sans_heure =
334 array('AND',
335 array('<=', $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))),
336 array('>=', $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))))
337 );
338 if ($horaire) {
339 $where =
340 array('OR',
341 array('AND',
342 array('=', 'horaire', sql_quote('oui')),
343 array('AND',
344 array('<=', $_date_debut, sql_quote($_dateref)),
345 array('>=', $_date_fin, sql_quote($_dateref))
346 )
347 ),
348 array('AND',
349 array('!=', 'horaire', sql_quote('oui')),
350 $where_en_cours_sans_heure
351 )
352 );
353 } else {
354 $where = $where_en_cours_sans_heure;
355 }
356 return ($not) ? array('NOT' , $where) : $where;
357 break;
358
359 default:
360 return array();
361 break;
362 }
363 }
364
365 /**
366 * Fonction privee pour mutualiser de code des criteres_evenement_*
367 * Retourne le code php pour obtenir la date de reference de comparaison
368 * des evenements a trouver
369 *
370 * @param string $idb
371 * @param object $boucles
372 * @param object $crit
373 *
374 * @return string code PHP concernant la date.
375 **/
376 function agenda_calculer_date_reference($idb, &$boucles, $crit) {
377 if (isset($crit->param[0]))
378 return calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
379 else
380 return "date('Y-m-d H:i:00')";
381 }
382
383
384 /**
385 * Balise #NB_INSCRITS
386 * pour afficher le nombre d'inscrits (qui ont repondu oui) a un evenement
387 *
388 * @param Object $p
389 * @return object
390 */
391 function balise_NB_INSCRITS_dist($p) {
392 $id_evenement = champ_sql('id_evenement', $p);
393 $p->code = "sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement).' AND reponse=\'oui\'')";
394 return $p;
395 }
396
397 ?>