Browse Source

Des branches bien rangées.

2_1_0
marcimat@rezo.net 4 years ago
commit
c624a398cf
  1. 75
      .gitattributes
  2. 9
      _test/test_boucle_evenements.html
  3. 36
      _test/testagenda.html
  4. 334
      action/editer_evenement.php
  5. 19
      action/rubrique_activer_agenda.php
  6. 20
      action/supprimer_evenement.php
  7. 12
      agenda-ical.html
  8. 55
      agenda-rss.html
  9. 1
      agenda-zpip.html
  10. 109
      agenda_autoriser.php
  11. 132
      agenda_fonctions.php
  12. 26
      agenda_options.php
  13. 137
      agenda_pipelines.php
  14. 34
      balise/calendrier_mini.php
  15. 108
      base/agenda_evenements.php
  16. 108
      base/agenda_upgrade.php
  17. 20
      contenu/page-agenda.html
  18. 8
      demo/exemple_navigation_jours.html
  19. 173
      demo_calendrier_mini.html
  20. 46
      exec/agenda_evenements.php
  21. 131
      exec/agenda_inscriptions.php
  22. 82
      exec/evenements_edit.php
  23. 62
      formulaires/calendrier_mini.html
  24. 94
      formulaires/editer_evenement.html
  25. 123
      formulaires/editer_evenement.php
  26. 109
      formulaires/inc-editer_evenement_pickers.html
  27. 12
      formulaires/inc-mots_evenements.html
  28. 21
      formulaires/inc-navigateur-mots_evenements.html
  29. 37
      formulaires/participer_evenement.html
  30. 107
      formulaires/participer_evenement.php
  31. 34
      genie/agenda_nettoyer_base.php
  32. 1
      ical-agenda.html
  33. BIN
      icon.png
  34. BIN
      img_pack/agenda-12.png
  35. BIN
      img_pack/agenda-24.png
  36. BIN
      img_pack/agenda-48.png
  37. BIN
      img_pack/agenda-non-24.png
  38. BIN
      img_pack/agenda-non-48.png
  39. BIN
      img_pack/agenda-ok-48.png
  40. BIN
      img_pack/croix.png
  41. 34
      img_pack/datePicker.css
  42. BIN
      img_pack/picker-16.gif
  43. 26
      img_pack/timePicker.css
  44. BIN
      img_pack/triangle-droite.gif
  45. 281
      inc/agenda_filtres.php
  46. 45
      inc/agenda_gestion.php
  47. 14
      inc/un-evenement-ical.html
  48. 24
      inclure/agenda_jour.html
  49. 7
      inclure/agenda_mois.html
  50. 8
      inclure/agenda_periode.html
  51. 7
      inclure/agenda_semaine.html
  52. 467
      javascript/dates.js
  53. 1061
      javascript/jquery.datePicker.js
  54. 214
      javascript/jquery.timePicker.js
  55. 33
      javascript/mots_evenements.js
  56. 118
      lang/agenda_de.php
  57. 123
      lang/agenda_en.php
  58. 99
      lang/agenda_es.php
  59. 124
      lang/agenda_fr.php
  60. 45
      lang/agenda_nl.php
  61. 10
      modeles/evenement_vevent.html
  62. 14
      navigation/page-agenda.html
  63. 98
      plugin.xml
  64. 27
      prive/contenu/agenda_evenements.html
  65. 4
      prive/contenu/evenements_article.html
  66. 43
      prive/contenu/liste-evenements-post.html
  67. 13
      prive/editer/evenement.html
  68. 10
      prive/listes/mois-evenements.html
  69. 12
      prive/listes/rubriques-agenda.html
  70. 11
      prive/navigation/agenda_evenements.html
  71. 100
      prive/style_prive_plugin_agenda.html
  72. BIN
      prive/themes/spip/images/agenda-evenements-16.png
  73. BIN
      prive/themes/spip/images/agenda-evenements-new-16.png
  74. 477
      public/agenda.php
  75. 26
      style_public_plugin_agenda.html

75
.gitattributes

@ -0,0 +1,75 @@
* text=auto !eol
_test/test_boucle_evenements.html -text
_test/testagenda.html -text
action/editer_evenement.php -text
action/rubrique_activer_agenda.php -text
action/supprimer_evenement.php -text
/agenda-ical.html -text
/agenda-rss.html -text
/agenda-zpip.html -text
/agenda_autoriser.php -text
/agenda_fonctions.php -text
/agenda_options.php -text
/agenda_pipelines.php -text
balise/calendrier_mini.php -text
base/agenda_evenements.php -text
base/agenda_upgrade.php -text
contenu/page-agenda.html -text
demo/exemple_navigation_jours.html -text
/demo_calendrier_mini.html -text
exec/agenda_evenements.php -text
exec/agenda_inscriptions.php -text
exec/evenements_edit.php -text
formulaires/calendrier_mini.html -text
formulaires/editer_evenement.html -text
formulaires/editer_evenement.php -text
formulaires/inc-editer_evenement_pickers.html -text
formulaires/inc-mots_evenements.html -text
formulaires/inc-navigateur-mots_evenements.html -text
formulaires/participer_evenement.html -text
formulaires/participer_evenement.php -text
genie/agenda_nettoyer_base.php -text
/ical-agenda.html -text
/icon.png -text
img_pack/agenda-12.png -text
img_pack/agenda-24.png -text
img_pack/agenda-48.png -text
img_pack/agenda-non-24.png -text
img_pack/agenda-non-48.png -text
img_pack/agenda-ok-48.png -text
img_pack/croix.png -text
img_pack/datePicker.css -text
img_pack/picker-16.gif -text
img_pack/timePicker.css -text
img_pack/triangle-droite.gif -text
inc/agenda_filtres.php -text
inc/agenda_gestion.php -text
inc/un-evenement-ical.html -text
inclure/agenda_jour.html -text
inclure/agenda_mois.html -text
inclure/agenda_periode.html -text
inclure/agenda_semaine.html -text
javascript/dates.js -text
javascript/jquery.datePicker.js -text
javascript/jquery.timePicker.js -text
javascript/mots_evenements.js -text
lang/agenda_de.php -text
lang/agenda_en.php -text
lang/agenda_es.php -text
lang/agenda_fr.php -text
lang/agenda_nl.php -text
modeles/evenement_vevent.html -text
navigation/page-agenda.html -text
/plugin.xml -text
prive/contenu/agenda_evenements.html -text
prive/contenu/evenements_article.html -text
prive/contenu/liste-evenements-post.html -text
prive/editer/evenement.html -text
prive/listes/mois-evenements.html -text
prive/listes/rubriques-agenda.html -text
prive/navigation/agenda_evenements.html -text
prive/style_prive_plugin_agenda.html -text
prive/themes/spip/images/agenda-evenements-16.png -text
prive/themes/spip/images/agenda-evenements-new-16.png -text
public/agenda.php -text
/style_public_plugin_agenda.html -text

9
_test/test_boucle_evenements.html

@ -0,0 +1,9 @@
<BOUCLE_eve(EVENEMENTS)>
#ID_EVENEMENT:
</BOUCLE_eve>
<BOUCLE_rub1(RUBRIQUES){id_rubrique=1}>
<BOUCLE_eve1(EVENEMENTS){branche}>
plop
</BOUCLE_eve1>
</BOUCLE_rub1>

36
_test/testagenda.html

@ -0,0 +1,36 @@
<h1>{id_mot}</h1>
<ul>
<BOUCLE_ListeMots(MOTS)>
<li>#TITRE
<B_Evenements>
<ul>
<BOUCLE_Evenements(EVENEMENTS){id_mot}>
<li>#TITRE</li>
</BOUCLE_Evenements>
</ul>
</B_Evenements>
</li>
</BOUCLE_ListeMots>
</ul>
<h1>{titre_mot}</h1>
<ul>
<BOUCLE_ListeEvenements(EVENEMENTS){titre_mot=mc1}>
<li>#TITRE</li>
</BOUCLE_ListeEvenements>
</ul>
<h1>{branche}</h1>
<ul>
<BOUCLE_ListeSecteurs(RUBRIQUES){racine}>
<li>#TITRE
<B_EvenementsSecteur>
<ul>
<BOUCLE_EvenementsSecteur(EVENEMENTS){branche}>
<li>#TITRE</li>
</BOUCLE_EvenementsSecteur>
</ul>
</B_EvenementsSecteur>
</li>
</BOUCLE_ListeSecteurs>
</ul>

334
action/editer_evenement.php

@ -0,0 +1,334 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return; #securite
function action_editer_evenement_dist(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// si id_article n'est pas un nombre, c'est une creation
// mais on verifie qu'on a toutes les donnees qu'il faut.
if (!$id_evenement = intval($arg)) {
$id_parent = _request('id_parent');
if (!$id_evenement = agenda_action_insert_evenement($id_parent))
return array(false,_L('echec'));
}
$err = action_evenement_set($id_evenement);
return array($id_evenement,$err);
}
function action_evenement_set($id_evenement, $set=null){
$err = '';
if (is_null($set)){
$c = array();
foreach (array(
'titre', 'descriptif', 'lieu', 'id_parent',
'inscription','places','adresse',
) as $champ)
$c[$champ] = _request($champ);
$c['horaire'] = _request('horaire')=='non'?'non':'oui';
include_spip('inc/date_gestion');
$date_debut = verifier_corriger_date_saisie('debut',$c['horaire']=='oui',$erreurs);
$date_fin = verifier_corriger_date_saisie('fin',$c['horaire']=='oui',$erreurs);
$c['date_debut'] = date('Y-m-d H:i:s',$date_debut);
$c['date_fin'] = date('Y-m-d H:i:s',$date_fin);
}
else
$c = $set;
include_spip('inc/modifier');
agenda_action_revision_evenement($id_evenement, $c);
agenda_action_revision_evenement_mots($id_evenement, _request('mots',$set));
agenda_action_revision_evenement_repetitions($id_evenement,_request('repetitions',$set), _request('mots',$set));
// Modification de statut, changement de rubrique ?
$c = array();
foreach (array(
'id_parent'
) as $champ)
$c[$champ] = _request($champ,$set);
$err .= agenda_action_instituer_evenement($id_evenement, $c);
return $err;
}
function agenda_action_revision_evenement_repetitions($id_evenement,$repetitions="",$liste_mots=array()){
include_spip('inc/filtres');
$repetitions = preg_split(",[^0-9\-\/],",$repetitions);
// gestion des repetitions
$rep = array();
foreach($repetitions as $date){
if (strlen($date)){
$date = recup_date($date);
if ($date=mktime(0,0,0,$date[1],$date[2],$date[0]))
$rep[] = $date;
}
}
agenda_action_update_repetitions($id_evenement, $rep, $liste_mots);
}
function agenda_action_update_repetitions($id_evenement,$repetitions,$liste_mots){
// evenement source
if ($row = sql_fetsel("*", "spip_evenements","id_evenement=".intval($id_evenement))){
$titre = $row['titre'];
$descriptif = $row['descriptif'];
$horaire = $row['horaire'];
$lieu = $row['lieu'];
$adresse = $row['adresse'];
$date_debut = strtotime($row['date_debut']);
$date_fin = strtotime($row['date_fin']);
$duree = $date_fin - $date_debut;
$id_evenement_source = $row['id_evenement_source'];
$id_article = $row['id_article'];
$inscription = $row['inscription'];
$places = $row['places'];
if ($id_evenement_source!=0)
return; // pas un evenement source donc rien a faire ici
$repetitions_updated = array();
// mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
$res = sql_select("id_evenement,date_debut","spip_evenements","id_evenement_source=".sql_quote($id_evenement));
while ($row = sql_fetch($res)){
$date = strtotime(date('Y-m-d',strtotime($row['date_debut'])));
if (in_array($date,$repetitions)){
// il est maintenu, on l'update
$repetitions_updated[] = $date;
$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
// TODO : prendre en charge la mise a jour uniquement si conforme a l'original
$update_titre = $titre;
$update_descriptif = $descriptif;
$update_lieu = $lieu;
$update_adresse = $adresse;
$update_inscription = $inscription;
$update_places = $places;
// mettre a jour l'evenement
sql_updateq('spip_evenements',
array(
"titre" => $update_titre,
"descriptif" => $update_descriptif,
"lieu" => $update_lieu,
"adresse" => $update_adresse,
"horaire" => $horaire,
"date_debut" => $update_date_debut,
"date_fin" => $update_date_fin,
"inscription" => $update_inscription,
"places" => $update_places,
"id_article" => $id_article),"id_evenement=".intval($row['id_evenement']));
agenda_action_revision_evenement_mots($row['id_evenement'], $liste_mots);
}
else {
// il est supprime
sql_delete("spip_mots_evenements","id_evenement=".$row['id_evenement']);
sql_delete("spip_evenements","id_evenement=".$row['id_evenement']);
}
}
// regarder les repetitions a ajouter
foreach($repetitions as $date){
if (!in_array($date,$repetitions_updated)){
$update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
$update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
$update_titre = $titre;
$update_descriptif = $descriptif;
$update_lieu = $lieu;
$update_adresse = $adresse;
$update_inscription = $inscription;
$update_places = $places;
if ($id_evenement_new = agenda_action_insert_evenement($id_article,$id_evenement)) {
// mettre a jour l'evenement
sql_updateq('spip_evenements',
array(
"titre" => $update_titre,
"descriptif" => $update_descriptif,
"lieu" => $update_lieu,
"adresse" => $update_adresse,
"horaire" => $horaire,
"date_debut" => $update_date_debut,
"date_fin" => $update_date_fin,
"inscription" => $update_inscription,
"places" => $update_places,
"id_article" => $id_article),"id_evenement=".intval($id_evenement_new));
agenda_action_revision_evenement_mots($id_evenement_new, $liste_mots);
}
}
}
}
}
function agenda_action_revision_evenement_mots($id_evenement,$liste_mots){
// suppression des mots obsoletes
$cond_in = $cond_not_in = "";
if (count($liste_mots)){
$cond_not_in = sql_in('id_mot', join(',',$liste_mots), 'NOT');
$cond_in = sql_in('id_mot', join(',',$liste_mots));
}
sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement) . ($cond_in?" AND ".$cond_not_in:""));
$liste_deja = array();
if ($cond_in)
$liste_deja = sql_allfetsel("id_mot", "spip_mots_evenements", "id_evenement=".intval($id_evenement) . " AND $cond_in");
if (count($liste_deja)) {
$cond_not_in = sql_in('id_mot', join(',',array_map('reset',$liste_deja)), 'NOT');
$liste_mots = sql_allfetsel('id_mot','spip_mots',"$cond_in AND $cond_not_in");
$liste_mots = array_map('reset',$liste_mots);
}
if (count($liste_mots)) {
$ins = array();
foreach($liste_mots as $k=>$id_mot)
$ins[] = array('id_evenement'=>$id_evenement,'id_mot'=>$id_mot);
sql_insertq_multi("spip_mots_evenements", $ins);
}
}
// creer un nouvel evenement
function agenda_action_insert_evenement($id_article,$id_evenement_source = 0){
include_spip('inc/autoriser');
if (!autoriser('creerevenementdans','article',$id_article)){
spip_log("agenda action formulaire article : auteur ".$GLOBALS['visiteur_session']['id_auteur']." n'a pas le droit de creer un evenement dans article $id_article",'agenda');
return false;
}
// nouvel evenement
$id_evenement = sql_insertq("spip_evenements", array("id_evenement_source"=>intval($id_evenement_source), "maj"=>date("Y-m-d H:i:s"), 'id_article'=>intval($id_article)));
if (!$id_evenement){
spip_log("agenda action formulaire article : impossible d'ajouter un evenement",'agenda');
return false;
}
return $id_evenement;
}
// Enregistre une revision d'evenement
function agenda_action_revision_evenement ($id_evenement, $c=false) {
if ($c['id_parent']) {
// Si l'article est publie, invalider les caches et demander sa reindexation
$t = sql_getfetsel("statut", "spip_articles", "id_article=".intval($c['id_parent']));
if ($t == 'publie') {
$invalideur = "id='id_article/$id_article'";
$indexation = true;
}
}
modifier_contenu('evenement', $id_evenement,
array(
'nonvide' => array('titre' => _T('info_sans_titre')),
'invalideur' => $invalideur,
'indexation' => $indexation
),
$c);
return ''; // pas d'erreur
}
// $c est un array ('statut', 'id_parent' = changement de rubrique)
function agenda_action_instituer_evenement($id_evenement, $c) {
include_spip('inc/autoriser');
include_spip('inc/modifier');
$row = sql_fetsel("id_article", "spip_evenements", "id_evenement=".intval($id_evenement));
$id_parent = $row['id_article'];
$champs = array();
if (!autoriser('modifier', 'article', $id_parent)
OR (!autoriser('modifier', 'article', $c['id_parent']))){
spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
return false;
}
// Verifier que la rubrique demandee existe et est differente
// de la rubrique actuelle
if ($c['id_parent']
AND $c['id_parent'] != $id_parent
AND (sql_fetsel('1', "spip_articles", "id_article=".intval($c['id_parent'])))) {
$champs['id_article'] = $c['id_parent'];
}
// Envoyer aux plugins
$champs = pipeline('pre_edition',
array(
'args' => array(
'table' => 'spip_evenements',
'id_objet' => $id_evenement
),
'data' => $champs
)
);
if (!count($champs)) return;
// Envoyer les modifs sur l'evenement et toutes ses repetitons
$ids = array_map('reset',sql_allfetsel('id_evenement','spip_evenements','id_evenement_source='.intval($id_evenement)));
$ids[] = intval($id_evenement);
sql_updateq('spip_evenements',$champs,sql_in('id_evenement',$ids));
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='id_article/$id_parent'");
suivre_invalideur("id='id_article/".$champs['id_article']."'");
// Pipeline
pipeline('post_edition',
array(
'args' => array(
'table' => 'spip_evenements',
'id_objet' => $id_evenement
),
'data' => $champs
)
);
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituerevenement', $id_evenement,
array('id_parent' => $champs['id_article'], 'id_parent_ancien' => $id_parent)
);
}
return ''; // pas d'erreur
}
function agenda_action_supprime_repetitions($supp_evenement){
$res = sql_select("id_evenement", "spip_evenements", "id_evenement_source=".intval($supp_evenement));
while ($row = sql_fetch($res)){
$id_evenement = $row['id_evenement'];
sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
}
}
function agenda_action_supprime_evenement($id_article,$supp_evenement){
$id_evenement = sql_getfetsel("id_evenement", "spip_evenements", array(
"id_article=" . intval($id_article),
"id_evenement=" . intval($supp_evenement)));
if (intval($id_evenement) AND $id_evenement == $supp_evenement){
sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
agenda_action_supprime_repetitions($id_evenement);
}
include_spip('inc/invalideur');
suivre_invalideur("article/$id_article");
$id_evenement = 0;
return $id_evenement;
}
?>

19
action/rubrique_activer_agenda.php

@ -0,0 +1,19 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_rubrique_activer_agenda_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (intval($arg)!=0) {
if (intval($arg)>0)
sql_updateq('spip_rubriques',array('agenda'=>1),'id_rubrique='.intval($arg));
else
sql_updateq('spip_rubriques',array('agenda'=>0),'id_rubrique='.(-intval($arg)));
}
}
?>

20
action/supprimer_evenement.php

@ -0,0 +1,20 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_supprimer_evenement_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_evenement,$id_article) = preg_split(',[^0-9],',$arg);
include_spip('inc/autoriser');
if (intval($id_article) AND intval($id_evenement) AND autoriser('supprimer','evenement',$id_evenement,null,array('id_article'=>$id_article))){
include_spip("action/editer_evenement");
agenda_action_supprime_evenement($id_article,$id_evenement);
}
}
?>

12
agenda-ical.html

@ -0,0 +1,12 @@
#HTTP_HEADER{Content-type:text/calendar; charset=utf-8}#CACHE{3600}BEGIN:VCALENDAR
VERSION:2.0
X-WR-TIMEZONE:Europe/Paris
CALSCALE:GREGORIAN
PRODID:-//SPIP/Plugin #PLUGIN{AGENDA,nom}//NONSGML v1.0//FR
X-WR-CALNAME;VALUE=TEXT:[(#NOM_SITE_SPIP|filtrer_ical)] -- Agenda[
X-WR-CALDESC:(#DESCRIPTIF_SITE_SPIP|supprimer_tags|filtrer_ical)]
X-WR-RELCALID:[(#URL_SITE_SPIP|filtrer_ical)]
<BOUCLE_evenement2(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {age_fin<=0} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{adresse})]
</BOUCLE_evenement2><BOUCLE_evenement3(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {age_fin>=0} {inverse} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{adresse})]
</BOUCLE_evenement3><BOUCLE_evenement(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin} {inverse} {0,50} {doublons}>[(#INCLURE{fond=inc/un-evenement-ical}{evtitre=#TITRE}{id_evenement}{date_debut}{horaire}{date_fin}{id_article}{descriptif}{lieu}{adresse})]
</BOUCLE_evenement>END:VCALENDAR

55
agenda-rss.html

@ -0,0 +1,55 @@
[(#HTTP_HEADER{Content-type: text/xml[; charset=(#CHARSET)]})]<?xml
version="1.0"[ encoding="(#CHARSET)"]?>
<rss version="2.0" [(#REM) rss 2.0.9)]
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
>
<channel[ xml:lang="(#LANG)"]>
[<title>Agenda (#NOM_SITE_SPIP|texte_backend)</title>]
<link>#URL_SITE_SPIP/</link>
[<description>(#DESCRIPTIF_SITE_SPIP|supprimer_tags|texte_backend)</description>]
<language>#LANG</language>
<generator>SPIP - www.spip.net</generator>
[ <image>
<title>[(#NOM_SITE_SPIP|texte_backend)]</title>
<url>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{src}|url_absolue|texte_backend)</url>
<link>#URL_SITE_SPIP/</link>
[<height>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{height})</height>]
[<width>(#LOGO_SITE_SPIP||image_reduire{150,150}|extraire_attribut{width})</width>]
</image>
]
<BOUCLE_evenement(EVENEMENTS) {branche ?}{id_article ?} {statut=publie}{par date_fin}{age<7} {0,60}>
<item>
[<title>(#TITRE|texte_backend)</title>]
<link>[(#URL_ARTICLE|parametre_url{id_evenement,#ID_EVENEMENT}|url_absolue)]</link>
[<guid isPermaLink="true">(#URL_ARTICLE|parametre_url{id_evenement,#ID_EVENEMENT}|url_absolue)</guid>]
<date>#DATE_DEBUT</date>
[<dc:date>(#DATE_DEBUT|date_iso)</dc:date>]
<dc:format>text/html</dc:format>
[<dc:language>(#LANG)</dc:language>]
[(#REM) Le bloc qui suit diffuse l'evenement a la mode RSS ]
<description>
[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
[(#DESCRIPTIF|texte_backend)]
</description>
[(#REM) Le bloc qui suit diffuse aussi le texte integral de l'evenement,
ce qui permet une syndication plus riche (mais plus "lourde").
Fonction desactivable depuis les reglages du site.]
[(#CONFIG{syndication_integrale}|=={oui}|?{' ',''})<content:encoded>
[(#LOGO_ARTICLE|right||texte_backend)]
&lt;div class='rss_texte'&gt;
[(#DATE_DEBUT|Agenda_affdate_debut_fin{#DATE_FIN,#HORAIRE}|texte_backend)][ - (#LIEU|PtoBR|texte_backend)]
[(#DESCRIPTIF|texte_backend)]
&lt;/div&gt;
</content:encoded>]
</item>
</BOUCLE_evenement>
</channel>
</rss>

1
agenda-zpip.html

@ -0,0 +1 @@
<INCLURE{fond=structure}{env}{type=page}{composition=agenda} />

109
agenda_autoriser.php

@ -0,0 +1,109 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
/* pour que le pipeline ne rale pas ! */
function agenda_autoriser(){}
function autoriser_evenement_creer_bouton_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL){
if (isset($opt['contexte']['id_article']))
return autoriser('creerevenementdans','article',$opt['contexte']['id_article'],$qui);
return true;
}
/**
* Autorisation d'ajout d'un evenement a un article
*
* @param string $faire
* @param string $quoi
* @param int $id
* @param int $qui
* @param array $options
* @return bool
*/
function autoriser_article_creerevenementdans_dist($faire,$quoi,$id,$qui,$options){
if (!$id) return false; // interdit de creer un evenement sur un article vide !
// si on a le droit de modifier l'article alors on a peut-etre le droit d'y creer un evenement
$afficher = false;
if (autoriser('modifier','article',$id,$qui)) {
$afficher = true;
// un article avec des evenements a toujours le droit
if (!sql_countsel('spip_evenements','id_article='.intval($id))){
// si au moins une rubrique a le flag agenda
if (sql_countsel('spip_rubriques','agenda=1')){
// alors il faut le flag agenda dans cette branche !
$afficher = false;
include_spip('inc/agenda_gestion');
$in = calcul_hierarchie_in(sql_getfetsel('id_rubrique','spip_articles','id_article='.intval($id)));
$afficher = sql_countsel('spip_rubriques',sql_in('id_rubrique',$in)." AND agenda=1");
}
}
}
return $afficher;
}
/**
* Autorisation de modifier un evenement : autorisations de l'article parent
*
* @param string $faire
* @param string $quoi
* @param int $id
* @param int $qui
* @param array $options
* @return bool
*/
function autoriser_evenement_modifier_dist($faire,$quoi,$id,$qui,$options){
if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
$id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
if (!$id_article) return false;
return autoriser('modifier','article',$id_article,$qui);
}
/**
* Autorisation de voir un evenement : autorisations de l'article parent
*
* @param string $faire
* @param string $quoi
* @param int $id
* @param int $qui
* @param array $options
* @return bool
*/
function autoriser_evenement_voir_dist($faire,$quoi,$id,$qui,$options){
if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
$id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
if (!$id_article) return false;
return autoriser('voir','article',$id_article,$qui);
}
/**
* Autorisation de supprimer un evenement : autorisations de l'article parent
*
* @param string $faire
* @param string $quoi
* @param int $id
* @param int $qui
* @param array $options
* @return bool
*/
function autoriser_evenement_supprimer_dist($faire,$quoi,$id,$qui,$options){
if (!isset($options['id_article']) OR !$id_article=$options['id_article'])
$id_article = sql_getfetsel('id_article','spip_evenements','id_evenement='.intval($id));
if (!$id_article) {
if ($qui['statut']=='0minirezo')
return true;
else
return false;
}
return autoriser('modifier','article',$id_article,$qui);
}
?>

132
agenda_fonctions.php

@ -0,0 +1,132 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/agenda_filtres');
function agenda_mini($i) {
$args = func_get_args();
$une_date = array_shift($args); // une date comme balise
$sinon = array_shift($args);
if (!$une_date) return $sinon;
$type = 'mini';
$agenda = Agenda_memo_full(0);
$evt = array();
foreach (($args ? $args : array_keys($agenda)) as $k) {
if (is_array($agenda[$k]))
foreach($agenda[$k] as $d => $v) {
$evt[$d] = $evt[$d] ? (array_merge($evt[$d], $v)) : $v;
}
}
$la_date = mktime(0, 0, 0, mois($une_date), 1, annee($une_date));
include_spip('inc/agenda');
return http_calendrier_init($la_date, $type, '', '', '', array('', $evt));
}
function http_calendrier_mini($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) {
list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
if ($sansduree)
foreach($sansduree as $d => $r) {
$evenements[$d] = !$evenements[$d] ? $r :
array_merge($evenements[$d], $r);
}
if (!$premier_jour) $premier_jour = '01';
if (!$dernier_jour) {
$dernier_jour = 31;
while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
}
// affichage du debut de semaine hors periode
$ligne = '';
$debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
for ($i=$debut ? $debut : 7;$i>1;$i--) {
$mois_precedent = mktime(1,1,1,$mois-1,1,$annee);
$jour_mois_precedent = date('t', $mois_precedent)+2-$i;
$ligne .= "\n\t<td class=\"horsperiode\">$jour_mois_precedent</td>";
}
$total = '';
for ($j=$premier_jour; $j<=$dernier_jour; $j++) {
$nom = mktime(1,1,1,$mois,$j,$annee);
$jour = date("d",$nom);
$jour_semaine = date("w",$nom);
$mois_en_cours = date("m",$nom);
$annee_en_cours = date("Y",$nom);
$amj = date("Y",$nom) . $mois_en_cours . $jour;
if ($jour_semaine==1 AND $ligne != '') {
$total .= "\n<tr>$ligne\n</tr>";
$ligne = '';
}
$evts = $evenements[$amj];
$class="";
if ($evts) {
$nb_elmts= @count($evts);
if ($nb_elmts>1){
$evts = "<a rel='nofollow' href='".$evts[0]['URL']."' title='".$nb_elmts." ".utf8_encode(_T('agenda:evenements'))."'>".intval($jour)."</a>";
}
else{
$evts = "<a rel='nofollow' href='".$evts[0]['URL']."' title='".$evts[0]['SUMMARY'].
"'>".intval($jour)."</a>";
}
$class='occupe';
}
else {
$evts = intval($jour);
$class='libre';
}
$ligne .= "\n\t<td class='$class".($amj == date("Ymd")?' today':'')."'>" . $evts . "\n\t</td>";
}
$jour_mois_suivant=1;
// affichage de la fin de semaine hors periode
for($j=$jour_semaine ? $jour_semaine : 7; $j<7; $j++) {
$ligne .= "\n\t<td class=\"horsperiode\">".$jour_mois_suivant++."</td>";
}
return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
}
/**
* #NB_INSCRITS
* pour afficher le nombre d'inscrits (qui ont repondu oui) a un evenement
*
* @param <type> $p
* @return <type>
*/
function balise_NB_INSCRITS_dist($p) {
$id_evenement = champ_sql('id_evenement', $p);
$p->code = "sql_countsel('spip_evenements_participants','id_evenement='.intval($id_evenement).' AND reponse=\'oui\'')";
return $p;
}
/**
* Raccourcis [->evenement12] et [->evt12]
*/
function generer_url_evenement($id, $args='', $ancre='') {
return array('evenement', $id);
}
function generer_url_ecrire_evenement($id, $args='', $ancre='', $statut='', $connect='') {
$a = "id_evenement=" . intval($id);
$h = ($connect)
? generer_url_entite_absolue($id, 'evenement', $args, $ancre, $connect)
: (generer_url_ecrire('agenda_evenements',$a . ($args ? "&$args" : ''))
. ($ancre ? "#$ancre" : ''));
return $h;
}
?>

26
agenda_options.php

@ -0,0 +1,26 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_DIR_PLUGIN_BANDO')) {
function exec_calendrier(){
$mode = _request('mode');
// si $echelle dans l'url, c'est une page du mode editorial aussi
if (($mode == 'editorial') or _request('echelle')){
include_spip('exec/calendrier');
exec_calendrier_dist();
}
else {
$var_f = charger_fonction('agenda_evenements');
$var_f();
}
}
}
?>

137
agenda_pipelines.php

@ -0,0 +1,137 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function agenda_ajouter_onglets($flux) {
if($flux['args']=='calendrier' AND !defined('_DIR_PLUGIN_BANDO')){
$flux['data']['agenda']= new Bouton(
_DIR_PLUGIN_AGENDA.'/img_pack/agenda-24.png', _T('agenda:agenda'),
generer_url_ecrire("calendrier","type=semaine"));
$flux['data']['calendrier']= new Bouton(
'cal-rv.png', _T('agenda:activite_editoriale'),
generer_url_ecrire("calendrier","mode=editorial&type=semaine"));
}
return $flux;
}
function agenda_affiche_milieu($flux) {
$exec = $flux['args']['exec'];
if ($exec=='naviguer'
AND $id_rubrique = intval($flux['args']['id_rubrique'])){
$activer = true;
$res = "";
$actif = sql_getfetsel('agenda','spip_rubriques','id_rubrique='.intval($id_rubrique));
$statut="-48";
$voir = "";
if (!sql_countsel('spip_rubriques','agenda=1'))
$res .= _T('agenda:aucune_rubrique_mode_agenda').'<br />';
else {
include_spip('inc/agenda_gestion');
if (sql_countsel('spip_rubriques',sql_in('id_rubrique',calcul_hierarchie_in($id_rubrique))." AND agenda=1 AND id_rubrique<>".intval($id_rubrique))){
$res .= _T('agenda:rubrique_dans_une_rubrique_mode_agenda').'<br />';
$activer = false;
$statut="-ok-48";
$voir = _T('agenda:voir_evenements_rubrique');
}
elseif(!$actif) {
$res .= _T('agenda:rubrique_sans_gestion_evenement').'<br />';
$statut="-non-24";
}
if ($actif){
$res .= _T('agenda:rubrique_mode_agenda').'<br />';
$statut="-ok-48";
$voir = _T('agenda:voir_evenements_rubrique');
}
}
if (!$actif){
if($activer){
$res .= "<a href='".generer_action_auteur('rubrique_activer_agenda',$id_rubrique,self())."'>"._T('agenda:rubrique_activer_agenda').'</a>';
}
}
else
$res .= "<a href='".generer_action_auteur('rubrique_activer_agenda',"-$id_rubrique",self())."'>"._T('agenda:rubrique_desactiver_agenda').'</a>';
if ($voir)
$res .= "<p><a href='".generer_url_ecrire('calendrier',"id_rubrique=$id_rubrique")."'>$voir</a></p>";
if ($res)
$flux['data'] .= "<div class='verdana2'><img src='".find_in_path("img_pack/agenda$statut.png")."' class='agenda-statut' alt='' />$res<div class='nettoyeur'></div></div>";
}
elseif ($exec=='articles'){
$id_article = $flux['args']['id_article'];
$afficher = autoriser('creerevenementdans','article',$id_article);
if ($afficher) {
$contexte = array();
foreach($_GET as $key=>$val)
$contexte[$key] = $val;
$evenements = recuperer_fond('prive/contenu/evenements_article',$contexte);
$flux['data'] .= $evenements;
}
}
elseif ($exec=='mots_edit'){
$id_mot = $flux['args']['id_mot'];
foreach($_GET as $key=>$val)
$contexte[$key] = $val;
$evenements = recuperer_fond('prive/contenu/agenda_evenements',$contexte);
$flux['data'] .= $evenements;
}
return $flux;
}
function agenda_taches_generales_cron($taches_generales){
$taches_generales['agenda_nettoyer_base'] = 3600*48;
return $taches_generales;
}
function agenda_editer_contenu_objet($flux){
if ($flux['args']['type']=='groupe_mot'){
// ajouter l'input sur les evenements
$checked = in_array('evenements',$flux['args']['contexte']['tables_liees']);
$checked = $checked?" checked='checked'":'';
$input = "<div class='choix'><input type='checkbox' class='checkbox' name='tables_liees&#91;&#93;' value='evenements'$checked id='evenements' /><label for='evenements'>"._T('agenda:item_mots_cles_association_evenements')."</label></div>";
$flux['data'] = str_replace('<!--choix_tables-->',"$input\n<!--choix_tables-->",$flux['data']);
}
return $flux;
}
function agenda_libelle_association_mots($libelles){
$libelles['evenements'] = 'agenda:info_evenements';
return $libelles;
}
function agenda_objets_extensibles($objets){
return array_merge($objets, array('evenement' => _T('agenda:evenements')));
}
function agenda_afficher_nombre_objets_associes_a($flux){
if ($flux['args']['objet']=='mot'
AND $id_mot=$flux['args']['id_objet']){
$aff_articles = sql_in('A.statut', ($GLOBALS['connect_statut'] =="0minirezo") ? array('prepa','prop','publie') : array('prop','publie'));
$nb = sql_countsel("spip_mots_evenements AS L LEFT JOIN spip_evenements AS E ON E.id_evenement=L.id_evenement LEFT JOIN spip_articles AS A ON E.id_article=A.id_article", "L.id_mot=".intval($id_mot)." AND $aff_articles");
if ($nb)
$flux['data'][] = singulier_ou_pluriel($nb, "agenda:info_un_evenement", "agenda:info_nombre_evenements");
}
return $flux;
}
function agenda_rechercher_liste_des_champs($tables){
$tables['evenement'] = array(
'titre' => 8,
'descriptif' => 5,
'lieu' => 5,
'adresse' => 3
);
return $tables;
}
/**
* Declarer evenement comme un objet interpretable dans les url
* ?evenement12
*
* @param array $objets
* @return array
*/
function agenda_declarer_url_objets($objets){
$objets[] = 'evenement';
return $objets;
}
?>

34
balise/calendrier_mini.php

@ -0,0 +1,34 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return; #securite
// Pas besoin de contexte de compilation
global $balise_CALENDRIER_MINI_collecte;
$balise_CALENDRIER_MINI_collecte = array('id_rubrique','id_article','id_mot');
function balise_CALENDRIER_MINI ($p) {
return calculer_balise_dynamique($p,'CALENDRIER_MINI', array('id_rubrique','id_article', 'id_mot'));
}
function balise_CALENDRIER_MINI_stat($args, $filtres) {
return $args;
}
function balise_CALENDRIER_MINI_dyn($id_rubrique=0, $id_article = 0, $id_mot = 0,$date, $var_date = 'date', $url = '') {
if(!$url)
$url = self();
// nettoyer l'url qui est passee par htmlentities pour raison de securités
$url = str_replace("&amp;","&",$url);
return array('formulaires/calendrier_mini', 0,
array(
'date' => $date,
'id_rubrique' => $id_rubrique,
'id_article' => $id_article,
'id_mot' => $id_mot,
'var_date' => $var_date,
'self' => $url,
));
}
?>

108
base/agenda_evenements.php

@ -0,0 +1,108 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
function agenda_declarer_tables_interfaces($interface){
// 'spip_' dans l'index de $tables_principales
$interface['table_des_tables']['evenements']='evenements';
//-- Jointures ----------------------------------------------------
$interface['tables_jointures']['spip_evenements'][]= 'mots'; // a placer avant la jointure sur articles
$interface['tables_jointures']['spip_articles'][]= 'evenements';
$interface['tables_jointures']['spip_evenements'][] = 'articles';
$interface['tables_jointures']['spip_mots'][]= 'mots_evenements';
$interface['tables_jointures']['spip_evenements'][] = 'mots_evenements';
$interface['tables_jointures']['spip_evenements'][] = 'evenements_participants';
$interface['tables_jointures']['spip_auteurs'][] = 'evenements_participants';
$interface['table_des_traitements']['LIEU'][]= 'expanser_liens(typo(%s))';
$interface['table_des_traitements']['ADRESSE'][]= 'propre(%s)';
// permet d'utiliser les criteres racine, meme_parent, id_parent
$interface['exceptions_des_tables']['evenements']['id_parent']='id_evenement_source';
$interface['exceptions_des_tables']['evenements']['id_rubrique']=array('spip_articles', 'id_rubrique');
$interface['table_date']['evenements'] = 'date_debut';
// des titres pour certains jeux d'URL (propre, arborescent...)
$interface['table_titre']['evenements'] = 'titre, "" AS lang';
return $interface;
}
function agenda_declarer_tables_principales($tables_principales){
//-- Table EVENEMENTS ------------------------------------------
$evenements = array(
"id_evenement" => "bigint(21) NOT NULL",
"id_article" => "bigint(21) DEFAULT '0' NOT NULL",
"date_debut" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"date_fin" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"titre" => "text NOT NULL DEFAULT ''",
"descriptif" => "text NOT NULL DEFAULT ''",
"lieu" => "text NOT NULL DEFAULT ''",
"adresse" => "text NOT NULL DEFAULT ''",
"inscription" => "tinyint(1) DEFAULT 0 NOT NULL",
"places" => "int(11) DEFAULT 0 NOT NULL",
"horaire" => "varchar(3) DEFAULT 'oui' NOT NULL",
"id_evenement_source" => "bigint(21) NOT NULL",
//"idx" => "ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL",
"maj" => "TIMESTAMP"
);
$evenements_key = array(
"PRIMARY KEY" => "id_evenement",
"KEY date_debut" => "date_debut",
"KEY date_fin" => "date_fin",
"KEY id_article" => "id_article"
);
$tables_principales['spip_evenements'] =
array('field' => &$evenements, 'key' => &$evenements_key, 'join'=>array('id_evenement'=>'id_evenement','id_article'=>'id_article'));
$tables_principales['spip_rubriques']['field']['agenda'] = 'tinyint(1) DEFAULT 0 NOT NULL';
return $tables_principales;
}
function agenda_declarer_tables_auxiliaires($tables_auxiliaires){
//-- Table de relations MOTS_EVENEMENTS----------------------
$spip_mots_evenements = array(
"id_mot" => "BIGINT (21) DEFAULT '0' NOT NULL",
"id_evenement" => "BIGINT (21) DEFAULT '0' NOT NULL");
$spip_mots_evenements_key = array(
"PRIMARY KEY" => "id_mot, id_evenement",
"KEY id_evenement" => "id_evenement");
$tables_auxiliaires['spip_mots_evenements'] = array(
'field' => &$spip_mots_evenements,
'key' => &$spip_mots_evenements_key);
//-- Table des participants ----------------------
$spip_evenements_participants = array(
"id_evenement" => "BIGINT (21) DEFAULT '0' NOT NULL",
"id_auteur" => "BIGINT (21) DEFAULT '0' NOT NULL",
"date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"reponse" => "char(3) default '?' NOT NULL", // oui, non, ?
);
$spip_evenements_participants_key = array(
"PRIMARY KEY" => "id_evenement, id_auteur",
"KEY id_auteur" => "id_auteur");
$tables_auxiliaires['spip_evenements_participants'] = array(
'field' => &$spip_evenements_participants,
'key' => &$spip_evenements_participants_key);
return $tables_auxiliaires;
}
?>

108
base/agenda_upgrade.php

@ -0,0 +1,108 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return; #securite
$GLOBALS['agenda_base_version'] = 0.23;
function agenda_verifier_base(){
$version_base = $GLOBALS['agenda_base_version'];
$current_version = 0.0;
if ( (!isset($GLOBALS['meta']['agenda_base_version']) )
|| (($current_version = $GLOBALS['meta']['agenda_base_version'])!=$version_base)){
include_spip('base/agenda_evenements');
if ($current_version==0.0){
include_spip('base/create');
include_spip('base/abstract_sql');
creer_base();
maj_tables('spip_rubriques');
ecrire_meta('agenda_base_version',$current_version=$version_base,'non');
}
if (version_compare($current_version,"0.11","<")){
sql_alter("TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`");
ecrire_meta('agenda_base_version',$current_version=0.11,'non');
}
if (version_compare($current_version,"0.12","<")){
sql_alter("TABLE spip_evenements ADD `id_article` bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`");
sql_alter("TABLE spip_evenements ADD INDEX ( `id_article` )");
$res = sql_select("*", "spip_evenements_articles");
while ($row = sql_fetch($res)){
$id_article = $row['id_article'];
$id_evenement = $row['id_evenement'];
sql_update("spip_evenements", "id_article=$id_article", "id_evenement=$id_evenement");
}
sql_drop_table("spip_evenements_articles");
ecrire_meta('agenda_base_version',$current_version=0.12,'non');
}
if (version_compare($current_version,"0.13","<")){
include_spip('base/create');
include_spip('base/abstract_sql');
creer_base();
ecrire_meta('agenda_base_version',$current_version=0.13,'non');
}
if (version_compare($current_version,"0.18","<")){
include_spip('base/create');
include_spip('base/abstract_sql');
creer_base();
sql_update('spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'evenements,')"),"evenements='oui'");
sql_alter("TABLE spip_groupes_mots DROP evenements");
ecrire_meta('agenda_base_version',$current_version=0.18,'non');
}
if (version_compare($current_version,"0.20","<")){
include_spip('base/abstract_sql');
sql_alter("TABLE spip_rubriques ADD agenda tinyint(1) DEFAULT 0 NOT NULL");
ecrire_meta('agenda_base_version',$current_version=0.20,'non');
}
if (version_compare($current_version,"0.21","<")){
include_spip('base/abstract_sql');
sql_alter("TABLE spip_evenements ADD adresse text NOT NULL");
sql_alter("TABLE spip_evenements ADD inscription text NOT NULL");
sql_alter("TABLE spip_evenements ADD places text NOT NULL");
ecrire_meta('agenda_base_version',$current_version=0.21,'non');
}
if (version_compare($current_version,"0.22","<")){
include_spip('base/abstract_sql');
include_spip('base/create');
include_spip('base/auxiliaires');
maj_tables('spip_evenements_participants');
ecrire_meta('agenda_base_version',$current_version=0.22,'non');
}
if (version_compare($current_version,"0.23","<")){
include_spip('base/abstract_sql');
sql_alter("TABLE spip_evenements CHANGE titre titre text NOT NULL DEFAULT ''");
sql_alter("TABLE spip_evenements CHANGE descriptif descriptif text NOT NULL DEFAULT ''");
sql_alter("TABLE spip_evenements CHANGE lieu lieu text NOT NULL DEFAULT ''");
sql_alter("TABLE spip_evenements CHANGE adresse adresse text NOT NULL DEFAULT ''");
ecrire_meta('agenda_base_version',$current_version=0.23,'non');
}
}
}
function agenda_vider_tables() {
include_spip('base/agenda_evenements');
include_spip('base/abstract_sql');
sql_drop_table("spip_evenements");
sql_drop_table("spip_mots_evenements");
sql_alter("TABLE spip_rubriques DROP COLUMN agenda");
effacer_meta('agenda_base_version');
}
function agenda_install($action){
$version_base = $GLOBALS['agenda_base_version'];
switch ($action){
case 'test':
return (isset($GLOBALS['meta']['agenda_base_version']) AND (version_compare($GLOBALS['meta']['agenda_base_version'],$version_base,">=")));
break;
case 'install':
agenda_verifier_base();
break;
case 'uninstall':
agenda_vider_tables();
break;
}
}
?>

20
contenu/page-agenda.html

@ -0,0 +1,20 @@
[(#REM)
Squelette
(c) 2009 xxx
Distribue sous licence GPL
]
<B_ev>
[<h1>(#TOTAL_BOUCLE|singulier_ou_pluriel{agenda:info_un_evenement,agenda:info_nombre_evenements})</h1>]
<ul class="liste-items evenements">
<BOUCLE_ev(EVENEMENTS){!evenement_passe #ENV{date_debut,#ENV{date}}}{!evenement_a_venir #ENV{date_debut,#ENV{date}}|agenda_moisdecal{1,'Y-m-d H:i:00'}}{par date_debut}{id_article?}{id_rubrique?}{id_mot?}{id_evenement_source?}>
<li class="item">
#MODELE{evenement_vevent}
</li>
</BOUCLE_ev>
</ul>
</B_ev>
<h1><:agenda:info_aucun_evenement:></h1>
<//B_ev>

8
demo/exemple_navigation_jours.html

@ -0,0 +1,8 @@
[<a href="(#URL_PAGE{jour}|parametre_url{date,[(#VAL{Y-m-d}|date{#VAL{-1 day}|strtotime{#ENV{date}|affdate{U}}})]})" title="jour précédent">
[(#VAL{Y-m-d}|date{#VAL{-1 day}|strtotime{#ENV{date}|affdate{U}}}|nom_jour)]&nbsp;&#8249;</a>]
[(#EVAL{' '}|concat{[(#ENV{date}|nom_jour) ],#ENV{date}|jour})]
[<a href="(#URL_PAGE{jour}|parametre_url{date,[(#VAL{Y-m-d}|date{#VAL{+1 day}|strtotime{#ENV{date}|affdate{U}}})]})"
title="jour suivant">&#8250;&nbsp; [(#VAL{Y-m-d}|date{#VAL{+1 day}|strtotime{#ENV{date}|affdate{U}}}|nom_jour)]</a>]

173
demo_calendrier_mini.html

@ -0,0 +1,173 @@
#CACHE{86400}
<BOUCLE_article_principal(ARTICLES) {id_article}><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="#LANG_DIR" lang="#LANG">
<head>
<title>[(#TITRE|textebrut)][ - (#NOM_SITE_SPIP|textebrut)]</title>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
[<meta name="description" content="(#INTRODUCTION|couper{150}|attribut_html)" />]
<meta name="generator" content="SPIP" />
[<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />]
<!-- Lien vers le backend pour navigateurs eclaires -->
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>" href="#URL_PAGE{backend}" />
<!-- Ceci est la feuille de style par defaut pour le code genere par SPIP -->
<link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" media="all" />
<!-- Feuille de styles CSS pour l'affichage du site sur ecran -->
<link rel="stylesheet" href="[(#CHEMIN{habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
<!-- Feuille de styles CSS pour l'impression -->
<link rel="stylesheet" href="[(#CHEMIN{impression.css}|direction_css)]" type="text/css" media="print" />
</head>
<body class="page_article">
<div id="page">
[(#REM) Entete de la page + titre du site ]
<INCLURE{fond=inc-entete}{lang}>
[(#REM) Fil d'Ariane ]
<div id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><BOUCLE_ariane(HIERARCHIE){id_article}> &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a></BOUCLE_ariane>[ &gt; (#TITRE|couper{80})]</div>
<div id="conteneur">
[(#REM) Contenu principal : contenu de l'article ]
<div id="contenu">
<style type='text/css'>
td.occupe a {font-weight:bold;text-decoration:underline;}
td.horsperiode {color:#878787;font-size:.9em;}
</style>
[(#REM) mini calendrier :
1er arg la date,
2eme le nom de la variable date (optionel : 'date' par defaut)
3eme l'url sur laquelle boucler (optionel : url courante par defaut) ]
#CALENDRIER_MINI{#ENV{date},'date',#SELF}
<div class="cartouche">
#DEBUT_SURLIGNE
[(#LOGO_ARTICLE||image_reduire{200,200})]
[<p class="surtitre">(#SURTITRE)</p>]
<h1 class="titre">#TITRE</h1>
[<p class="soustitre">(#SOUSTITRE)</p>]
#FIN_SURLIGNE
<p><small>[(#DATE|nom_jour) ][(#DATE|affdate)][, <:par_auteur:> (#LESAUTEURS)]</small></p>
[(#REM) Traductions de l'article ]
<B_traductions>
<div class="traductions">
<p><:trad_article_traduction:></p>
<ul>
<li[ class="(#EXPOSE)"]>[(#LANG|traduire_nom_langue)]</li>
<BOUCLE_traductions(ARTICLES){traduction}{exclus}>
<li><a[ href="(#URL_ARTICLE|url_absolue)"] rel="alternate" hreflang="#LANG"[ title="(#TITRE|couper{80}|texte_backend)"]><span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR">[(#LANG|traduire_nom_langue)]</span></a></li>
</BOUCLE_traductions>
</ul>
</div>
</B_traductions>
</div>
#DEBUT_SURLIGNE
[<div class="chapo">(#CHAPO)</div>]
<br class="nettoyeur" />
[<p class="lien"><:voir_en_ligne:> : <a href="(#URL_SITE)" class="spip_out">[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})]</a></p>]
[<div class="texte">(#TEXTE|image_reduire{520,0})</div>]
#FIN_SURLIGNE
[(#REM) Portfolio : album d'images ]
<B_documents_portfolio>
<div id="documents_portfolio">
<h2><:info_portfolio:></h2>
<BOUCLE_documents_portfolio(DOCUMENTS) {id_article}
{mode=document} {extension IN png,jpg,gif} {par date}
{doublons}>
[<a href="#URL_DOCUMENT" type="#MIME_TYPE"
onclick="this.href='[(#URL_ARTICLE|parametre_url{id_document,#ID_DOCUMENT})]#documents_portfolio';return true;"[title="(#TITRE|couper{80}|texte_backend)"]>(#LOGO_DOCUMENT||image_reduire{0,60}|inserer_attribut{alt,[(#TITRE|couper{80}|texte_backend)]})</a>]
</BOUCLE_documents_portfolio>
</div>
</B_documents_portfolio>
<BOUCLE_afficher_document(DOCUMENTS) {id_document}
{mode=document}{extension IN png,jpg,gif}>
<div class="spip_documents spip_documents_center" id="document_actif">
#EMBED_DOCUMENT
[<div class="spip_doc_titre">(#TITRE)</div>]
[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]
</div>
</BOUCLE_afficher_document>
[<div class="ps"><h2><:info_ps:></h2>#DEBUT_SURLIGNE(#PS)#FIN_SURLIGNE</div>]
[(#REM) Autres documents joints a l'article ]
<B_documents_joints>
<div id="documents_joints">
<h2><:titre_documents_joints:></h2>
<ul>
<BOUCLE_documents_joints(DOCUMENTS) {id_article} {mode=document} {par date} {doublons}>
<li>
<div class="spip_doc_titre"><a href="#URL_DOCUMENT" title="<:bouton_telecharger:>" type="#MIME_TYPE">[(#TITRE|sinon{<:info_document:>})]</a> <small>(#TYPE_DOCUMENT[ - (#TAILLE|taille_en_octets)])</small></div>
[<div class="spip_doc_descriptif">(#DESCRIPTIF)</div>]</li>
<br class="nettoyeur" />
</BOUCLE_documents_joints>
</ul>
</div>
</B_documents_joints>
[(#REM) Petition :
La petition ayant une PAGINATION il faut absolument lui passer SELF]
[ #REM Conserver cet invalideur invisible : (#PETITION|?{'',''}) ]
<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>
[<div class="notes"><h2><:info_notes:></h2>#DEBUT_SURLIGNE(#NOTES)#FIN_SURLIGNE</div>]
[(#REM) Forum de l'article ]
[<h2 class="forum-repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)"><:repondre_article:></a></h2>]
<INCLURE{fond=inc-forum}{id_article}>
</div><!-- fin contenu -->
[(#REM) Menu de navigation laterale ]
<div id="navigation">
<h1 class="invisible"><:navigation:></h1>
[(#REM) Menu de navigation par rubriques ]
<INCLURE{fond=inc-rubriques}{lang}{id_rubrique}>
[(#REM) Articles dans la meme rubrique ]
<B_articles_rubrique>
<div class="breves">
<h2 class="menu-titre"><a href="#URL_RUBRIQUE"><:meme_rubrique:></a></h2>
<ul>
<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {par date}{inverse} {0,10}>
<li><a href="#URL_ARTICLE"[ class="(#EXPOSE)"]>#TITRE</a></li>
</BOUCLE_articles_rubrique>
</ul>
</div>
</B_articles_rubrique>
[(#REM) Menu de navigation mots-cles ]
<B_mots>
<div class="divers">
<h2 class="menu-titre"><:mots_clefs:></h2>
<ul>
<BOUCLE_mots(MOTS) {id_article} {par titre}>
<li><a href="#URL_MOT" rel="tag">#TITRE</a></li>
</BOUCLE_mots>
</ul>
</div>
</B_mots>
</div><!-- fin navigation -->
</div><!-- fin conteneur -->
[(#REM) Pied de page ]
<INCLURE{fond=inc-pied}{lang}>
</div><!-- fin page -->
</body>
</html>
</BOUCLE_article_principal>

46
exec/agenda_evenements.php

@ -0,0 +1,46 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
function exec_agenda_evenements_dist(){
/*$ajouter_id_article = intval(_request('ajouter_id_article'));
$flag_editable = article_editable($ajouter_id_article);*/
/*$annee = intval(_request('annee'));
$mois = intval(_request('mois'));
$jour = intval(_request('jour'));
$date = date("Y-m-d", time());
if ($annee&&$mois&&$jour)
$date = date("Y-m-d", strtotime("$annee-$mois-$jour"));*/
$commencer_page = charger_fonction('commencer_page', 'inc');
$out = $commencer_page(_T('agenda:tous_les_evenements'), "agenda", "calendrier");
$out .= barre_onglets("calendrier", "agenda");
$contexte = array();
foreach($_GET as $key=>$val)
$contexte[$key] = $val;
$out .= debut_gauche("agenda",true);
$out .= recuperer_fond("prive/navigation/agenda_evenements",$contexte);
$out .= debut_droite('agenda',true);
$out .= recuperer_fond("prive/contenu/agenda_evenements",$contexte);
$out .= fin_gauche('agenda',true);
$out .= fin_page();
echo $out;
}
?>

131
exec/agenda_inscriptions.php

@ -0,0 +1,131 @@
<?php
/**
* Plugin Agenda pour Spip 2.0
* Liste des inscriptions
*
* Pour le moment, seul les administrateurs ont accès à cette page.
*
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @author Julien Tessier <julien@cahri.com>
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
function exec_agenda_inscriptions_dist()
{
$id_evenement = intval(_request('id_evenement'));
$evenement = sql_fetsel(array('titre',