[PLUGINS] +les plugins de bases
[ptitvelo/web/www.git] / www / plugins / agenda_3_5 / public / agenda.php
diff --git a/www/plugins/agenda_3_5/public/agenda.php b/www/plugins/agenda_3_5/public/agenda.php
new file mode 100644 (file)
index 0000000..d138999
--- /dev/null
@@ -0,0 +1,397 @@
+<?php\r
+/**\r
+ * Plugin Agenda 4 pour Spip 3.0\r
+ * Licence GPL 3\r
+ *\r
+ * 2006-2011\r
+ * Auteurs : cf paquet.xml\r
+ */\r
+\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+/**\r
+ * #URL_EVENEMENT envoie sur la page de l'evenement\r
+ * ou sur la page de l'article avec un &id_evenement=xxx\r
+ * selon la configuration de l'agenda\r
+ *\r
+ * @param object $p\r
+ * @return object\r
+ */\r
+function balise_URL_EVENEMENT_dist($p) {\r
+\r
+       include_spip("inc/config");\r
+       include_spip("balise/url_");\r
+\r
+       if (lire_config("agenda/url_evenement",'evenement')!=='article'){\r
+               $code = generer_generer_url('evenement', $p);\r
+       }\r
+       else {\r
+               $_ide = interprete_argument_balise(1,$p);\r
+               if (!$_ide)\r
+                       $_ide = champ_sql('id_evenement', $p);\r
+               $_ida = "generer_info_entite($_ide,'evenement','id_article')";\r
+\r
+               $code = generer_generer_url_arg('article', $p, $_ida);\r
+               $code = "parametre_url($code,'id_evenement',$_ide,'&')";\r
+       }\r
+\r
+       $code = champ_sql('url_evenement', $p, $code);\r
+       $p->code = $code;\r
+       if (!$p->etoile)\r
+               $p->code = "vider_url($code)";\r
+       $p->interdire_scripts = false;\r
+\r
+       return $p;\r
+}\r
+\r
+\r
+/**\r
+ * fonction sous jacente pour les 3 criteres\r
+ * fusion_par_jour, fusion_par_mois, fusion_par_annee\r
+ * \r
+ * @param string $format\r
+ * @param strinf $as\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function agenda_critere_fusion_par_xx($format, $as, $idb, &$boucles, $crit){\r
+       $boucle = &$boucles[$idb];\r
+       $type = $boucle->type_requete;\r
+       $_date = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent)\r
+         : "'".(isset($GLOBALS['table_date'][$type])?$GLOBALS['table_date'][$type]:"date")."'";\r
+\r
+       $date = $boucle->id_table. '.' .substr($_date,1,-1);\r
+\r
+       // annuler une eventuelle fusion sur cle primaire !\r
+       foreach($boucles[$idb]->group as $k=>$g)\r
+               if ($g==$boucle->id_table.'.'.$boucle->primary)\r
+                       unset($boucles[$idb]->group[$k]);\r
+       $boucles[$idb]->group[]  = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format')";\r
+       $boucles[$idb]->select[] = 'DATE_FORMAT('.$boucle->id_table.'.".'.$_date.'.", ' . "'$format') AS $as";\r
+}\r
+\r
+/**\r
+ * {fusion_par_jour date_debut}\r
+ * {fusion_par_jour date_fin}\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_jour_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y-%m-%d','jour',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {fusion_par_mois date_debut}\r
+ * {fusion_par_mois date_fin}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_mois_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y-%m','mois',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {fusion_par_annee date_debut}\r
+ * {fusion_par_annee date_fin}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_fusion_par_annee_dist($idb, &$boucles, $crit) {\r
+       agenda_critere_fusion_par_xx('%Y','annee',$idb, $boucles, $crit);\r
+}\r
+\r
+/**\r
+ * {evenement_a_venir}\r
+ * {evenement_a_venir #ENV{date}}\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_a_venir_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+       \r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date = "$id_table.date_debut";\r
+       $op = $crit->not ? "<=":">";\r
+       \r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_futur_sans_heure =\r
+               array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))");\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'$op'","'$_date'","sql_quote($_dateref)")\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_futur_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_futur_sans_heure;\r
+       }\r
+       \r
+       \r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenement_passe}\r
+ * {evenement_passe #ENV{date}}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_passe_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+\r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date = "$id_table.date_fin";\r
+       $op = $crit->not ? ">=":"<";\r
+       \r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_passe_sans_heure =\r
+               array("'$op'", "'$_date'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))");\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'$op'","'$_date'","sql_quote($_dateref)")\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_passe_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_passe_sans_heure;\r
+       }\r
+       \r
+       \r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenement_en_cours}\r
+ * {evenement_en_cours #ENV{date}}\r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenement_en_cours_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+\r
+       $_dateref = agenda_calculer_date_reference($idb, $boucles, $crit);\r
+       $_date_debut = "$id_table.date_debut";\r
+       $_date_fin = "$id_table.date_fin";\r
+\r
+       // si on ne sait pas si les heures comptent, on utilise toute la journee.\r
+       // sinon, on s'appuie sur le champ 'horaire=oui'\r
+       // pour savoir si les dates utilisent les heures ou pas.        \r
+       $where_jour_sans_heure =\r
+               array("'AND'",\r
+                       array("'<='", "'$_date_debut'", "sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))"),\r
+                       array("'>='", "'$_date_fin'", "sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref)))")\r
+               );\r
+               \r
+       if (array_key_exists('horaire', $boucle->show['field'])) {\r
+               $where =\r
+                       array("'OR'",\r
+                               array("'AND'",\r
+                                       array("'='", "'horaire'", "sql_quote('oui')"),\r
+                                       array("'AND'",\r
+                                               array("'<='", "'$_date_debut'", "sql_quote($_dateref)"),\r
+                                               array("'>='", "'$_date_fin'", "sql_quote($_dateref)")\r
+                                       )\r
+                               ),              \r
+                               array("'AND'",\r
+                                       array("'!='", "'horaire'", "sql_quote('oui')"),\r
+                                       $where_jour_sans_heure\r
+                               )\r
+                       );\r
+       } else {\r
+               $where = $where_jour_sans_heure;\r
+       }\r
+\r
+       if ($crit->not)\r
+               $where = array("'NOT'",$where);\r
+       $boucle->where[] = $where;\r
+}\r
+\r
+/**\r
+ * {evenementrelatif #ENV{choix}}\r
+ * {evenementrelatif #ENV{choix}, #ENV{date}}\r
+ * #ENV{choix} peut prendre 6 valeurs : tout, a_venir, en_cours, passe, en_cours_a_venir ou passe_en_cours\r
+ * \r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ */\r
+function critere_evenementrelatif_dist($idb, &$boucles, $crit) {\r
+       $boucle = &$boucles[$idb];\r
+       $id_table = $boucle->id_table;\r
+       if (isset($crit->param[1]))\r
+               $_dateref = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);\r
+       else\r
+               $_dateref = "date('Y-m-d H:i:00')";\r
+       $not = $crit->not ? 'oui' : '';\r
+       $choix = isset($crit->param[0]) ? calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) : "''";\r
+       $horaire = array_key_exists('horaire', $boucle->show['field']) ? 'oui' : '';\r
+       \r
+       $boucle->where[] = "agenda_calculer_critere_evenementrelatif('$id_table',$_dateref,'$not',$choix,'$horaire')";\r
+}\r
+\r
+/**\r
+ * Fonction interne utilisee par le critere {evenementrelatif}\r
+ * @param string $id_table\r
+ * @param string $_dateref\r
+ * @param string $not\r
+ * @param string $choix\r
+ * @param string $horaire\r
+ * @return array\r
+ */\r
+function agenda_calculer_critere_evenementrelatif($id_table,$_dateref,$not,$choix,$horaire){\r
+       $_date_debut = "$id_table.date_debut";\r
+       $_date_fin = "$id_table.date_fin";\r
+       if ($choix == 'en_cours_a_venir') {\r
+               $choix = 'passe';\r
+               $not = ($not) ? '' : 'oui';\r
+       }\r
+       if ($choix == 'passe_en_cours') {\r
+               $choix = 'a_venir';\r
+               $not = ($not) ? '' : 'oui';\r
+       }\r
+       \r
+       switch($choix) {\r
+               case 'a_venir':\r
+                       $op_a_venir = $not ? "<=":">";\r
+                       $where_a_venir_sans_heure =\r
+                               array($op_a_venir, $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref))));\r
+                       if ($horaire) {\r
+                               $where =\r
+                               array('OR',\r
+                                       array('AND',\r
+                                               array('=', 'horaire', sql_quote('oui')),\r
+                                               array($op_a_venir,$_date_debut,sql_quote($_dateref))\r
+                                       ),              \r
+                                       array('AND',\r
+                                               array('!=', 'horaire', sql_quote('oui')),\r
+                                               $where_a_venir_sans_heure\r
+                                       )\r
+                               );\r
+                       } else {\r
+                               $where = $where_a_venir_sans_heure;\r
+                       }\r
+                       return $where;\r
+                       break;\r
+\r
+               case 'passe':\r
+                       $op_passe = $not ? ">=":"<";\r
+                       $where_passe_sans_heure =\r
+                               array($op_passe, $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))));\r
+                       if ($horaire) {\r
+                               $where =\r
+                                       array('OR',\r
+                                               array('AND',\r
+                                                       array('=', 'horaire', sql_quote('oui')),\r
+                                                       array($op_passe,$_date_fin,sql_quote($_dateref))\r
+                                               ),              \r
+                                               array('AND',\r
+                                                       array('!=', 'horaire', sql_quote('oui')),\r
+                                                       $where_passe_sans_heure\r
+                                               )\r
+                                       );\r
+                       } else {\r
+                               $where = $where_passe_sans_heure;\r
+                       }\r
+                       return $where;\r
+                       break;\r
+\r
+               case 'en_cours':\r
+                       $where_en_cours_sans_heure =\r
+                               array('AND',\r
+                                       array('<=', $_date_debut, sql_quote(date('Y-m-d 23:59:59', strtotime($_dateref)))),\r
+                                       array('>=', $_date_fin, sql_quote(date('Y-m-d 00:00:00', strtotime($_dateref))))\r
+                               );\r
+                                               if ($horaire) {\r
+                               $where =\r
+                                       array('OR',\r
+                                               array('AND',\r
+                                                       array('=', 'horaire', sql_quote('oui')),\r
+                                                       array('AND',\r
+                                                               array('<=', $_date_debut, sql_quote($_dateref)),\r
+                                                               array('>=', $_date_fin, sql_quote($_dateref))\r
+                                                       )\r
+                                               ),              \r
+                                               array('AND',\r
+                                                       array('!=', 'horaire', sql_quote('oui')),\r
+                                                       $where_en_cours_sans_heure\r
+                                               )\r
+                                       );\r
+                       } else {\r
+                               $where = $where_en_cours_sans_heure;\r
+                       }\r
+                       return ($not) ? array('NOT' , $where) : $where;\r
+                       break;\r
+\r
+               default:\r
+                       return array();\r
+                       break;\r
+       }\r
+}\r
+\r
+/**\r
+ * Fonction privee pour mutualiser de code des criteres_evenement_*\r
+ * Retourne le code php pour obtenir la date de reference de comparaison\r
+ * des evenements a trouver \r
+ *\r
+ * @param string $idb\r
+ * @param object $boucles\r
+ * @param object $crit\r
+ * \r
+ * @return string code PHP concernant la date.\r
+**/\r
+function agenda_calculer_date_reference($idb, &$boucles, $crit) {\r
+       if (isset($crit->param[0]))\r
+               return calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);\r
+       else\r
+               return "date('Y-m-d H:i:00')";\r
+}\r
+\r
+\r
+/**\r
+ * Balise #NB_INSCRITS\r
+ * pour afficher le nombre d'inscrits (qui ont repondu oui) a un evenement\r
+ *\r
+ * @param Object $p\r
+ * @return object\r
+ */\r
+function balise_NB_INSCRITS_dist($p) {\r
+        $id_evenement = champ_sql('id_evenement', $p);\r
+        $p->code = "sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement).' AND reponse=\'oui\'')";\r
+        return $p;\r
+}\r
+\r
+?>\r