Compare commits

...

No commits in common. 'master' and '2_1_0' have entirely different histories.

  1. 191
      .gitattributes
  2. 0
      _test/test_boucle_evenements.html
  3. 0
      _test/testagenda.html
  4. 33
      action/activer_agenda_rubrique.php
  5. 594
      action/editer_evenement.php
  6. 19
      action/rubrique_activer_agenda.php
  7. 26
      action/separer_evenement_repetition.php
  8. 30
      action/supprimer_evenement.php
  9. 28
      action/supprimer_evenement_participant.php
  10. 12
      agenda-ical.html
  11. 55
      agenda-rss.html
  12. 0
      agenda-zpip.html
  13. 153
      agenda_administrations.php
  14. 137
      agenda_autoriser.php
  15. 346
      agenda_fonctions.php
  16. 26
      agenda_options.php
  17. 584
      agenda_pipelines.php
  18. 34
      balise/calendrier_mini.php
  19. 214
      base/agenda_evenements.php
  20. 108
      base/agenda_upgrade.php
  21. 4
      contenu/page-agenda.html
  22. 36
      css/spip.agenda.css
  23. 0
      demo_calendrier_mini.html
  24. 46
      exec/agenda_evenements.php
  25. 131
      exec/agenda_inscriptions.php
  26. 82
      exec/evenements_edit.php
  27. 62
      formulaires/calendrier_mini.html
  28. 185
      formulaires/configurer_agenda.html
  29. 231
      formulaires/editer_evenement.html
  30. 245
      formulaires/editer_evenement.php
  31. 109
      formulaires/inc-editer_evenement_pickers.html
  32. 23
      formulaires/inc-modif_synchro_source.html
  33. 12
      formulaires/inc-mots_evenements.html
  34. 21
      formulaires/inc-navigateur-mots_evenements.html
  35. 102
      formulaires/migrer_agenda.html
  36. 182
      formulaires/migrer_agenda.php
  37. 50
      formulaires/participer_evenement.html
  38. 146
      formulaires/participer_evenement.php
  39. 40
      genie/agenda_effacer_evenements_passes.php
  40. 34
      genie/agenda_nettoyer_base.php
  41. 0
      ical-agenda.html
  42. BIN
      icon.png
  43. BIN
      img_pack/agenda-12.png
  44. BIN
      img_pack/agenda-24.png
  45. BIN
      img_pack/agenda-48.png
  46. BIN
      img_pack/agenda-non-24.png
  47. BIN
      img_pack/agenda-non-48.png
  48. BIN
      img_pack/agenda-ok-48.png
  49. BIN
      img_pack/croix.png
  50. 34
      img_pack/datePicker.css
  51. BIN
      img_pack/picker-16.gif
  52. 26
      img_pack/timePicker.css
  53. BIN
      img_pack/triangle-droite.gif
  54. 281
      inc/agenda_filtres.php
  55. 45
      inc/agenda_gestion.php
  56. 205
      inc/agenda_timezone.php
  57. 115
      inc/agenda_vieilles_def.php
  58. 46
      inc/date_gestion.php
  59. 16
      inc/un-evenement-ical.html
  60. 64
      inc/un-evenement-ical_fonctions.php
  61. 82
      inclure/agenda-vue-calendrier.html
  62. 24
      inclure/agenda_jour.html
  63. 7
      inclure/agenda_mois.html
  64. 8
      inclure/agenda_periode.html
  65. 7
      inclure/agenda_semaine.html
  66. 31
      inclure/liste_participants_evenement.html
  67. 467
      javascript/dates.js
  68. 461
      javascript/jquery-ui.multidatespicker.js
  69. 1061
      javascript/jquery.datePicker.js
  70. 214
      javascript/jquery.timePicker.js
  71. 33
      javascript/mots_evenements.js
  72. 59
      lang/agenda.xml
  73. 142
      lang/agenda_ar.php
  74. 148
      lang/agenda_br.php
  75. 288
      lang/agenda_de.php
  76. 149
      lang/agenda_en.php
  77. 257
      lang/agenda_es.php
  78. 133
      lang/agenda_eu.php
  79. 200
      lang/agenda_fr.php
  80. 198
      lang/agenda_ja.php
  81. 229
      lang/agenda_nl.php
  82. 184
      lang/agenda_pt_br.php
  83. 168
      lang/agenda_ru.php
  84. 170
      lang/agenda_sk.php
  85. 22
      lang/configureragenda.xml
  86. 45
      lang/configureragenda_en.php
  87. 47
      lang/configureragenda_fr.php
  88. 49
      lang/configureragenda_nl.php
  89. 40
      lang/configureragenda_pt_br.php
  90. 18
      lang/migreragenda.xml
  91. 40
      lang/migreragenda_en.php
  92. 40
      lang/migreragenda_fr.php
  93. 41
      lang/migreragenda_nl.php
  94. 42
      lang/migreragenda_pt_br.php
  95. 33
      lang/paquet-agenda.xml
  96. 16
      lang/paquet-agenda_de.php
  97. 16
      lang/paquet-agenda_en.php
  98. 16
      lang/paquet-agenda_es.php
  99. 14
      lang/paquet-agenda_fr.php
  100. 16
      lang/paquet-agenda_ja.php

191
.gitattributes

@ -1,162 +1,75 @@
* text=auto !eol
action/activer_agenda_rubrique.php -text
_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
action/supprimer_evenement_participant.php -text
/agenda_administrations.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
css/spip.agenda.css -text
demo/agenda_calendrier_mini.html -text
base/agenda_upgrade.php -text
contenu/page-agenda.html -text
demo/exemple_navigation_jours.html -text
demo/test/test_boucle_evenements.html -text
demo/test/testagenda.html -text
formulaires/configurer_agenda.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/migrer_agenda.html -text
formulaires/migrer_agenda.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_effacer_evenements_passes.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/date_gestion.php -text
inc/agenda_gestion.php -text
inc/un-evenement-ical.html -text
inclure/agenda-vue-calendrier.html -text svneol=unset#text/plain
inclure/liste_participants_evenement.html -text
javascript/jquery-ui.multidatespicker.js -text
lang/agenda.xml -text
lang/agenda_ar.php -text
lang/agenda_br.php -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_ja.php -text
lang/agenda_nl.php -text
lang/agenda_pt_br.php -text
lang/agenda_ru.php -text
lang/agenda_sk.php -text
lang/configureragenda.xml -text
lang/configureragenda_en.php -text
lang/configureragenda_fr.php -text
lang/configureragenda_nl.php -text
lang/configureragenda_pt_br.php -text
lang/migreragenda.xml -text
lang/migreragenda_en.php -text
lang/migreragenda_fr.php -text
lang/migreragenda_nl.php -text
lang/migreragenda_pt_br.php -text
lang/paquet-agenda.xml -text
lang/paquet-agenda_de.php -text
lang/paquet-agenda_en.php -text
lang/paquet-agenda_es.php -text
lang/paquet-agenda_fr.php -text
lang/paquet-agenda_ja.php -text
lang/paquet-agenda_nl.php -text
lang/paquet-agenda_pt_br.php -text
lang/paquet-agenda_ru.php -text
lang/paquet-agenda_sk.php -text
lang/paquet-albums.xml -text
lang/saisie_evenements.xml -text
lang/saisie_evenements_en.php -text
lang/saisie_evenements_fr.php -text
modeles/evenement_vevent.html -text
notifications/evenement_propose.html -text
notifications/evenement_publie.html -text
notifications/inc-evenement.html -text
notifications/instituerevenement.php -text
/paquet.xml -text
prive/listes/corbeille_evenements.html -text
prive/objets/contenu/article-evenements.html -text
prive/objets/contenu/evenement.html -text
prive/objets/editer/rubrique-agenda.html -text
prive/objets/infos/evenement.html -text
prive/objets/liste/evenement_participants.html -text
prive/objets/liste/evenements-post.html -text
prive/objets/liste/evenements.html -text
prive/squelettes/contenu/agenda_inscriptions.html -text
prive/squelettes/contenu/configurer_agenda.html -text
prive/squelettes/contenu/evenement_edit.html -text
prive/squelettes/contenu/evenements.html -text
prive/squelettes/extra/agenda_inscriptions.html -text
prive/squelettes/inclure/agenda-navigation-mois.html -text
prive/squelettes/inclure/agenda-rubriques.html -text
prive/squelettes/navigation/agenda_inscriptions.html -text
prive/squelettes/navigation/evenement.html -text
prive/squelettes/navigation/evenements.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-16.png -text
prive/themes/spip/images/agenda-24.png -text
prive/themes/spip/images/agenda-32.png -text
prive/themes/spip/images/agenda-add-16.png -text
prive/themes/spip/images/agenda-add-24.png -text
prive/themes/spip/images/agenda-add-32.png -text
prive/themes/spip/images/agenda-del-16.png -text
prive/themes/spip/images/agenda-del-24.png -text
prive/themes/spip/images/agenda-del-32.png -text
prive/themes/spip/images/agenda-edit-16.png -text
prive/themes/spip/images/agenda-edit-24.png -text
prive/themes/spip/images/agenda-edit-32.png -text
prive/themes/spip/images/agenda-new-16.png -text
prive/themes/spip/images/agenda-new-24.png -text
prive/themes/spip/images/agenda-new-32.png -text
prive/themes/spip/images/agenda-non-32.png -text
prive/themes/spip/images/agenda-ok-32.png -text
prive/themes/spip/images/evenement-16.png -text
prive/themes/spip/images/evenement-24.png -text
prive/themes/spip/images/evenement-32.png -text
prive/themes/spip/images/evenement-add-16.png -text
prive/themes/spip/images/evenement-add-24.png -text
prive/themes/spip/images/evenement-add-32.png -text
prive/themes/spip/images/evenement-del-16.png -text
prive/themes/spip/images/evenement-del-24.png -text
prive/themes/spip/images/evenement-del-32.png -text
prive/themes/spip/images/evenement-edit-16.png -text
prive/themes/spip/images/evenement-edit-24.png -text
prive/themes/spip/images/evenement-edit-32.png -text
prive/themes/spip/images/evenement-new-16.png -text
prive/themes/spip/images/evenement-new-24.png -text
prive/themes/spip/images/evenement-new-32.png -text
prive/themes/spip/images/repetition-16.png -text
prive/themes/spip/images/repetition-24.png -text
prive/themes/spip/images/repetition-32.png -text
prive/transmettre/evenement_participants.html -text
prive/transmettre/evenements_participants.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
saisies-vues/evenements.html -text
saisies/evenements.html -text
saisies/evenements.yaml -text
saisies/evenements_fonctions.php -text
squelettes/agenda-ical.html -text
squelettes/agenda-rss.html -text
squelettes/agenda-zpip.html -text
squelettes/aside/agenda.html -text
squelettes/breadcrumb/agenda.html -text
squelettes/calendrier_mini_event.json.html -text
squelettes/calendrier_mini_event.json_fonctions.php -text
squelettes/content/agenda.html -text
squelettes/content/article-evenement.html -text
squelettes/content/evenement.html -text
squelettes/content/jour.html -text
squelettes/content/rubrique-agenda.html -text
squelettes/contenu/page-agenda.html -text
squelettes/contenu/page-jour.html -text
squelettes/extra/agenda.html -text
squelettes/extra/evenement.html -text
squelettes/extra/jour.html -text
squelettes/extra/rubrique-agenda.html -text
squelettes/extra1/agenda.html -text
squelettes/extra1/evenement.html -text
squelettes/extra1/jour.html -text
squelettes/extra1/rubrique-agenda.html -text
squelettes/ical-agenda.html -text
squelettes/inc-rss-item-evenement.html -text
squelettes/inclure/agenda-evenements-meme-article.html -text
squelettes/inclure/agenda-liste.html -text
squelettes/inclure/resume/evenement.html -text
squelettes/navigation/page-agenda.html -text
squelettes/style_public_plugin_agenda.html -text
/style_public_plugin_agenda.html -text

0
demo/test/test_boucle_evenements.html → _test/test_boucle_evenements.html

0
demo/test/testagenda.html → _test/testagenda.html

33
action/activer_agenda_rubrique.php

@ -1,33 +0,0 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_activer_agenda_rubrique_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// A-t-on vraiment le droit de modifier la rubrique en question ?
if (!autoriser('modifier', 'rubrique', abs(intval($arg)))) {
include_spip('inc/minipres');
echo minipres(_T('info_acces_interdit'));
exit;
}
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)));
}
}
}

594
action/editer_evenement.php

@ -1,445 +1,296 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined("_ECRIRE_INC_VERSION")) return; #securite
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_editer_evenement_dist(){
/**
* Edition d'un evenement
* @param string $arg
* @return array
*/
function action_editer_evenement_dist($arg = null) {
if (is_null($arg)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
// si id_evenement n'est pas un nombre, c'est une creation
// 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 = evenement_inserer($id_parent)) {
if (!$id_evenement = agenda_action_insert_evenement($id_parent))
return array(false,_L('echec'));
}
}
$err = evenement_modifier($id_evenement);
$err = action_evenement_set($id_evenement);
return array($id_evenement,$err);
}
/**
* Creer un nouvel evenement
*
* @param int $id_article
* @param array $set
* @return int
*/
function evenement_inserer($id_article, $set=null) {
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;
}
function action_evenement_set($id_evenement, $set=null){
$err = '';
// support pour l'ancien format avec $id_evenement_source en second argument
if (is_scalar($set) and intval($set)) {
$set = array(
'id_evenement_source' => intval($set),
);
}
if (is_null($set)){
$c = array();
foreach (array(
'titre', 'descriptif', 'lieu', 'id_parent',
'inscription','places','adresse',
) as $champ)
$c[$champ] = _request($champ);
$champs = array();
if ($set and is_array($set)) {
$champs = $set;
}
$champs['id_article'] = intval($id_article);
if (empty($champs['statut'])) {
$champs['statut'] = 'prop';
}
$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);
// Envoyer aux plugins
$champs = pipeline(
'pre_insertion',
array(
'args' => array(
'table' => 'spip_evenements',
),
'data' => $champs
)
);
// nouvel evenement
$id_evenement = sql_insertq('spip_evenements', $champs);
pipeline(
'post_insertion',
array(
'args' => array(
'table' => 'spip_evenements',
'id_objet' => $id_evenement
),
'data' => $champs
)
);
if (!$id_evenement) {
spip_log("agenda action formulaire evenement : impossible d'ajouter un evenement", 'agenda');
return false;
$c['date_debut'] = date('Y-m-d H:i:s',$date_debut);
$c['date_fin'] = date('Y-m-d H:i:s',$date_fin);
}
return $id_evenement;
}
/**
* Modifier un evenement existant
*
* @param int $id_evenement
* @param array $set
* @param bool $propagate
* @return bool|string
*/
function evenement_modifier($id_evenement, $set = null, $propagate=true) {
else
$c = $set;
include_spip('inc/modifier');
include_spip('inc/filtres');
$c = collecter_requests(
// white list
objet_info('evenement', 'champs_editables'),
// black list
array('statut', 'id_article'),
// donnees eventuellement fournies
$set
);
// Si l'evenement est publie, invalider les caches et demander sa reindexation
$t = sql_getfetsel('statut', 'spip_evenements', 'id_evenement='.intval($id_evenement));
$invalideur = $indexation = false;
if ($t == 'publie') {
$invalideur = "id='evenement/$id_evenement'";
$indexation = true;
}
if ($err = objet_modifier_champs(
'evenement',
$id_evenement,
array(
'data' => $set,
'nonvide' => array('titre' => _T('info_nouvel_evenement').' '._T('info_numero_abbreviation').$id_evenement),
'invalideur' => $invalideur,
'indexation' => $indexation,
),
$c
)) {
return $err;
}
if ($propagate) {
if (!is_null($repetitions = _request('repetitions', $set))) {
evenement_modifier_repetitions_filles($id_evenement, $repetitions);
}
else {
evenement_modifier_repetitions_soeurs($id_evenement);
}
}
// Modification de statut, changement de parent ?
$c = collecter_requests(array('statut', 'id_parent'), array(), $set);
$err = evenement_instituer($id_evenement, $c);
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;
}
/**
* Recupere les timestamp des repetitions
* @param string $repetitions
* @return array
*/
function agenda_recup_repetitions($repetitions) {
function agenda_action_revision_evenement_repetitions($id_evenement,$repetitions="",$liste_mots=array()){
include_spip('inc/filtres');
$repetitions = preg_split(',[^0-9\-\/],', $repetitions);
$repetitions = preg_split(",[^0-9\-\/],",$repetitions);
// gestion des repetitions
$rep = array();
foreach ($repetitions as $date) {
if (strlen($date)) {
foreach($repetitions as $date){
if (strlen($date)){
$date = recup_date($date);
if ($date = mktime(0, 0, 0, $date[1], $date[2], $date[0])) {
if ($date=mktime(0,0,0,$date[1],$date[2],$date[0]))
$rep[] = $date;
}
}
}
return $rep;
agenda_action_update_repetitions($id_evenement, $rep, $liste_mots);
}
/**
* Propager les modifs d'un evenement a ses repetitions filles
* @param int $id_evenement
* @param string $repetitions
*/
function evenement_modifier_repetitions_filles($id_evenement, $repetitions = '') {
if ($row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
// Si ce n'est pas un événement source, on n'a rien à faire ici
if ($row_source['id_evenement_source']!=0){
return;
}
$reps = agenda_recup_repetitions($repetitions);
// On ne garde que les données correctes pour une modification à propager
$c = collecter_requests(
// white list
objet_info('evenement', 'champs_editables'),
// black list
array('id_evenement', 'id_evenement_source', 'modif_synchro_source'),
// donnees fournies
$row_source
);
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;
agenda_action_update_repetitions($id_evenement, $row_source['modif_synchro_source'], $c , $reps);
}
}
// 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']);
}
/**
* Propager les modifs d'un evenement a ses repetitions soeurs et a sa mere
* @param int $id_evenement
*/
function evenement_modifier_repetitions_soeurs($id_evenement) {
if ($row = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
// Si ce n'est pas une repetition, on n'a rien à faire ici
if ($row['id_evenement_source']==0){
return;
}
// si on est plus synchro avec les autres, ne rien faire
if ($row['modif_synchro_source']==0){
return;
// 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);
}
}
}
}
}
// On ne garde que les données correctes pour une modification à propager
$c = collecter_requests(
// white list
objet_info('evenement', 'champs_editables'),
// black list
array('id_evenement', 'id_evenement_source', 'modif_synchro_source', 'date_debut', 'date_fin', 'horaire', 'timezone_affiche'),
// donnees fournies
$row
);
agenda_action_update_repetitions($row['id_evenement_source'], true, $c);
$row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($row['id_evenement_source']));
if ($row_source['modif_synchro_source']) {
evenement_modifier($row_source['id_evenement'], $c, false);
}
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;
}
function agenda_action_update_repetitions($id_evenement_source, $modif_flag, $set, $repetitions=null) {
$date_debut = $date_fin = $duree = null;
// 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)));
// On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
if (isset($set['date_debut']) and isset($set['date_fin'])) {
$date_debut = strtotime($set['date_debut']);
$date_fin = strtotime($set['date_fin']);
$duree = $date_fin - $date_debut;
}
unset($set['date_debut']);
unset($set['date_fin']);
$repetitions_updated = array();
// mettre a jour toutes les repetitions *avec le flag modif_synchro_source=1* deja existantes ou les supprimer si il n'y a plus lieu
$res = sql_select('id_evenement,date_debut,modif_synchro_source', 'spip_evenements', 'id_evenement_source='.intval($id_evenement_source));
while ($row = sql_fetch($res)) {
$date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
if (is_null($repetitions) or in_array($date, $repetitions)) {
// Cette répétition existe déjà
$repetitions_updated[] = $date;
// si besoin on la met a jour
// cad si le flag modif_synchro_source vaut 1 sur l'evenement source ET destination
if ($modif_flag and $row['modif_synchro_source']){
if (!is_null($date_debut)) {
// On calcule les nouvelles dates/heures en reportant la durée de la source
$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);
// Seules les dates sont changées dans les champs de la source
$set['date_debut'] = $update_date_debut;
$set['date_fin'] = $update_date_fin;
}
// mettre a jour l'evenement
evenement_modifier($row['id_evenement'], $set, false);
}
} else {
// il est supprime *si* modif_synchro_source vaut 1
if ($row['modif_synchro_source']) {
sql_delete('spip_evenements', 'id_evenement='.intval($row['id_evenement']));
}
}
if (!$id_evenement){
spip_log("agenda action formulaire article : impossible d'ajouter un evenement",'agenda');
return false;
}
return $id_evenement;
}
if (!is_null($repetitions)) {
// regarder les repetitions a ajouter qui sont du coup dupliquees depuis la source
foreach ($repetitions as $date) {
if (!in_array($date, $repetitions_updated)) {
// On calcule les dates/heures en reportant la durée de la source
$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);
// Seules les dates sont changées dans les champs de la source
$set['date_debut'] = $update_date_debut;
$set['date_fin'] = $update_date_fin;
$set['id_evenement_source'] = $id_evenement_source;
// On crée la nouvelle répétition
if ($id_evenement_new = evenement_inserer($set['id_article'], $set)) {
// Pour les créations il ne faut pas oublier de dupliquer les liens
// En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués
include_spip('action/editer_liens');
objet_dupliquer_liens('evenement', $id_evenement_source, $id_evenement_new);
}
else {
spip_log("agenda_action_update_repetitions : echec ajout repetition " . json_encode($set), "agenda" . _LOG_ERREUR);
}
}
// 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
}
/**
* Instituer un evenement
*
* @param int $id_evenement
* @param array $c
* @return bool|string
*/
function evenement_instituer($id_evenement, $c) {
// $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, statut', 'spip_evenements', 'id_evenement='.intval($id_evenement));
$id_parent = $id_parent_ancien = $row['id_article'];
$statut = $statut_ancien = $row['statut'];
$propager_statut_toutes_repetitions = false;
$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 (isset($c['id_parent'])
and !autoriser('modifier', 'article', $c['id_parent']))) {
OR (!autoriser('modifier', 'article', $c['id_parent']))){
spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
return false;
}
// Verifier que l'article demande existe et est different
// de l'article actuel
if (isset($c['id_parent'])
and $c['id_parent'] != $id_parent
and (sql_countsel('spip_articles', 'id_article='.intval($c['id_parent'])))) {
$id_parent = $champs['id_article'] = $c['id_parent'];
}
$sa = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_parent));
if ($id_parent
and (
$id_parent !== $id_parent_ancien
or $statut == '0'
)) {
switch ($sa) {
case 'publie':
// statut par defaut si besoin
if ($statut == '0') {
$champs['statut'] = $statut = 'publie';
}
break;
case 'poubelle':
// si article a la poubelle, evenement aussi
$champs['statut'] = $statut = 'poubelle';
$propager_statut_toutes_repetitions = true;
break;
default:
// pas de publie ni 0 si article pas publie
if (in_array($statut, array('publie','0'))) {
$champs['statut'] = $statut = 'prop';
$propager_statut_toutes_repetitions = true;
}
break;
}
}
// si pas d'article lie, et statut par defaut
// on met en propose
if ($statut=='0') {
$champs['statut'] = $statut = 'prop';
$propager_statut_toutes_repetitions = true;
}
if (isset($c['statut'])
and $s = $c['statut']
and $s != $statut) {
// pour instituer un evenement il faut avoir le droit d'instituer l'article associe avec le meme statut
if (autoriser('instituer', 'article', $id_parent, null, array('statut'=>$s))
and ($sa=='publie' or $s!=='publie')) {
$champs['statut'] = $statut = $s;
} else {
spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
}
// 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',
$champs = pipeline('pre_edition',
array(
'args' => array(
'table' => 'spip_evenements',
'action'=>'instituer',
'id_objet' => $id_evenement,
'id_parent_ancien' => $id_parent_ancien,
'statut_ancien' => $statut_ancien,
'id_objet' => $id_evenement
),
'data' => $champs
)
);
if (!count($champs)) {
return;
}
if (!count($champs)) return;
// Envoyer les modifs sur l'evenement et toutes ses repetitons synchro
$ids = sql_allfetsel('id_evenement', 'spip_evenements', 'modif_synchro_source=1 and id_evenement_source='.intval($id_evenement));
$ids = array_column($ids, 'id_evenement');
// 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));
// et les eventuelles propagations aux repetitions non synchro
if (!empty($champs['id_article'])) {
sql_updateq('spip_evenements', ['id_article' => $champs['id_article']], 'modif_synchro_source=0 and id_evenement_source='.intval($id_evenement));
}
if (!empty($champs['statut']) and $propager_statut_toutes_repetitions) {
sql_updateq('spip_evenements', ['statut' => $champs['statut']], 'modif_synchro_source=0 and id_evenement_source='.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_ancien'");
suivre_invalideur("id='id_article/$id_parent'");
suivre_invalideur("id='id_article/".$champs['id_article']."'");
// Pipeline
pipeline(
'post_edition',
pipeline('post_edition',
array(
'args' => array(
'table' => 'spip_evenements',
'action'=>'instituer',
'id_objet' => $id_evenement,
'id_parent_ancien' => $id_parent_ancien,
'statut_ancien' => $statut_ancien,
'id_objet' => $id_evenement
),
'data' => $champs
)
@ -448,9 +299,36 @@ function evenement_instituer($id_evenement, $c) {
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituerevenement', $id_evenement,
array('id_parent' => $id_parent, 'statut' => $statut, 'id_parent_ancien' => $id_parent, 'statut_ancien' => $statut_ancien)
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)));
}
}
?>

26
action/separer_evenement_repetition.php

@ -1,26 +0,0 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_separer_evenement_repetition_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_evenement = intval($securiser_action());
// A-t-on vraiment le droit de modifier la rubrique en question ?
if ($id_evenement
and autoriser('modifier', 'evenement', $id_evenement)) {
include_spip('action/editer_evenement');
evenement_modifier($id_evenement, array('modif_synchro_source' => 0));
}
}

30
action/supprimer_evenement.php

@ -1,26 +1,20 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_supprimer_evenement_dist() {
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);
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');
evenement_modifier($id_evenement, array('statut'=>'poubelle'));
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);
}
}
?>

28
action/supprimer_evenement_participant.php

@ -1,28 +0,0 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_supprimer_evenement_participant_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_evenement, $id_evenement_participant) = explode('-', $arg);
include_spip('inc/autoriser');
if (intval($id_evenement) and autoriser('modifier', 'evenement', $id_evenement)) {
if (intval($id_evenement_participant)) {
sql_delete('spip_evenements_participants', 'id_evenement='.intval($id_evenement).' AND id_evenement_participant='.intval($id_evenement_participant));
} else if ($id_evenement_participant == 'tous') {
sql_delete('spip_evenements_participants', 'id_evenement='.intval($id_evenement));
}
}
return true;
}

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>

0
squelettes/agenda-zpip.html → agenda-zpip.html

153
agenda_administrations.php

@ -1,153 +0,0 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Installation/maj des tables evenements et participants...
*
* @param string $nom_meta_base_version
* @param string $version_cible
*/
function agenda_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(
array('maj_tables', array('spip_evenements','spip_evenements_participants')),
array('sql_alter', 'TABLE spip_rubriques ADD agenda tinyint(1) DEFAULT 0 NOT NULL'),
array('ecrire_config','agenda/synchro_statut','1')
);
$maj['0.11'] = array(
array('sql_alter', "TABLE spip_evenements ADD `horaire` ENUM('oui','non') DEFAULT 'oui' NOT NULL AFTER `lieu`"),
);
$maj['0.12'] = array(
array('sql_alter', "TABLE spip_evenements ADD `id_article` bigint(21) DEFAULT '0' NOT NULL AFTER `id_evenement`"),
array('sql_alter', 'TABLE spip_evenements ADD ADD INDEX ( `id_article` )'),
array('upgrade_evenements_articles_012'),
array('sql_drop_table', 'spip_evenements_articles'),
);
$maj['0.13'] = array(
array('maj_tables', array('spip_evenements', 'spip_evenements_participants')),
);
$maj['0.18'] = array(
array('maj_tables', array('spip_evenements','spip_evenements_participants')),
array('sql_update','spip_groupes_mots', array('tables_liees'=>"concat(tables_liees,'evenements,')"), "evenements='oui'"),
array('sql_alter','TABLE spip_groupes_mots DROP evenements'),
);
$maj['0.20'] = array(
array('sql_alter', 'TABLE spip_rubriques ADD agenda tinyint(1) DEFAULT 0 NOT NULL'),
);
$maj['0.21'] = array(
array('sql_alter', 'TABLE spip_evenements ADD adresse text NOT NULL'),
array('sql_alter', 'TABLE spip_evenements ADD inscription text NOT NULL'),
array('sql_alter', 'TABLE spip_evenements ADD places text NOT NULL'),
);
$maj['0.22'] = array(
array('maj_tables',array('spip_evenements_participants')),
);
$maj['0.23'] = array(
array('sql_alter',"TABLE spip_evenements CHANGE titre titre text NOT NULL DEFAULT ''"),
array('sql_alter',"TABLE spip_evenements CHANGE descriptif descriptif text NOT NULL DEFAULT ''"),
array('sql_alter',"TABLE spip_evenements CHANGE lieu lieu text NOT NULL DEFAULT ''"),
array('sql_alter',"TABLE spip_evenements CHANGE adresse adresse text NOT NULL DEFAULT ''"),
);
include_spip('maj/svn10000');
$maj['0.24.0'] = array(
array('maj_liens', 'mot', 'evenement'),
array('sql_drop_table', 'spip_mots_evenements'),
array('sql_alter', 'TABLE spip_evenements ADD statut varchar(10) DEFAULT 0 NOT NULL'),
);
$maj['0.25.0'] = array(
array('upgrade_evenements_statut_025'),
);
$maj['0.26.0'] = array(
array('maj_tables',array('spip_evenements')),
array('sql_update', 'spip_evenements', array('date_creation' => 'maj')),
);
$maj['0.27.0'] = array(
// modification de la cle primaire (id_evenement,id_auteur) : les participants peuvent ne pas être des auteurs
// ajout d'une clé primaire "neutre" auto-incrémentée
array('sql_alter', 'TABLE spip_evenements_participants DROP PRIMARY KEY'),
array('sql_alter', 'TABLE spip_evenements_participants ADD id_evenement_participant BIGINT(21) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST'),
array('maj_tables', array('spip_evenements_participants')),
);
$maj['0.28.0'] = array(
array('ecrire_config','agenda/synchro_statut','1')
);
$maj['1.0.0'] = array(
array('sql_alter', 'TABLE spip_evenements ADD timezone_affiche varchar(255) NOT NULL DEFAULT \'\''),
);
$maj['1.0.1'] = array(
array('agenda_corrige_heure_evenements_journee'),
);
$maj['1.0.2'] = array(
array('sql_alter', 'TABLE spip_evenements ADD modif_synchro_source tinyint(1) DEFAULT 1 NOT NULL'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
function agenda_corrige_heure_evenements_journee() {
$res = sql_select('*', 'spip_evenements', 'horaire='.sql_quote('non').' AND date_debut LIKE '.sql_quote('% 00:00:00'));
$nb = sql_count($res);
spip_log("agenda_corrige_heure_evenements_journee: $nb restants", "maj");
while ($row = sql_fetch($res)) {
$date_debut = date('Y-m-d 12:00:00', strtotime($row['date_debut']));
$date_fin = date('Y-m-d 12:00:00', strtotime($row['date_fin']));
$set = array(
'date_debut' => $date_debut,
'date_fin' => $date_fin,
);
sql_updateq('spip_evenements', $set, "id_evenement=".intval($row['id_evenement']));
if (time() > _TIME_OUT) {
return;
}
}
}
function agenda_vider_tables($nom_meta_base_version) {
sql_drop_table('spip_evenements');
#sql_drop_table("spip_mots_evenements"); // au cas ou ?
sql_alter('TABLE spip_rubriques DROP COLUMN agenda');
effacer_meta($nom_meta_base_version);
}
function upgrade_evenements_articles_012() {
$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', array('id_article'=>$id_article), 'id_evenement='.intval($id_evenement));
}
}
function upgrade_evenements_statut_025() {
include_spip('action/editer_evenement');
$res = sql_select('id_evenement', 'spip_evenements', "statut='0'");
while ($row = sql_fetch($res)) {
evenement_modifier($row['id_evenement'], array());
}
}

137
agenda_autoriser.php

@ -1,25 +1,19 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.0
* Licence GPL 3
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
* 2006-2011
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined("_ECRIRE_INC_VERSION")) return;
/* pour que le pipeline ne rale pas ! */
function agenda_autoriser() {
}
function agenda_autoriser(){}
function autoriser_evenementcreer_menu_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) {
return autoriser('creer', 'evenement', $id, $qui, $opt);
}
function autoriser_evenements_menu_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) {
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;
}
@ -33,46 +27,27 @@ function autoriser_evenements_menu_dist($faire, $type = '', $id = 0, $qui = null
* @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 !
}
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)) {
if (autoriser('modifier','article',$id,$qui)) {
$afficher = true;
// un article avec des evenements a toujours le droit
if (!sql_countsel('spip_evenements', array('id_article='.intval($id)), sql_in('statut', array('prop','publie')))) {
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')) {
if (sql_countsel('spip_rubriques','agenda=1')){
// alors il faut le flag agenda dans cette branche !
$afficher = false;
include_spip('inc/rubriques');
$id_rubrique = sql_getfetsel('id_rubrique', 'spip_articles', 'id_article='.intval($id));
if ($id_rubrique > 0) {
// Rubriques classiques de SPIP
$in = calcul_hierarchie_in($id_rubrique);
$afficher = sql_countsel('spip_rubriques', sql_in('id_rubrique', $in).' AND agenda=1');
} else {
// Rubrique négative utilisee dans le plugin Page unique
$afficher = true;
}
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 pour créer un événement n'importe où (article ou autre ou rien)
// Par défaut : comme pour créer dans un article si on l'a dans les options, sinon être admin complet
function autoriser_evenement_creer_dist($faire, $quoi, $id, $qui, $options) {
if (isset($options['id_article']) and $options['id_article'] > 0) {
return autoriser('creerevenementdans', 'article', $options['id_article'], $qui, $options);
} else {
return ($qui['statut'] == '0minirezo' and !$qui['restreint']);
}
}
/**
* Autorisation de modifier un evenement : autorisations de l'article parent
*
@ -83,51 +58,11 @@ function autoriser_evenement_creer_dist($faire, $quoi, $id, $qui, $options) {
* @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 d'instituer un evenement : voir si l'article est publie ou non
* @param string $faire
* @param string $quoi
* @param int $id
* @param int $qui
* @param array $options
* @return bool
*/
function autoriser_evenement_instituer_dist($faire, $quoi, $id, $qui, $options) {
$evenement = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id));
if (!$evenement) {
return false;
}
// on ne modifie pas independamment le statut d'un evenement repetition qui reste synchro sur l'evenement source
if ($evenement['id_evenement_source']!=0
and $evenement['modif_synchro_source']) {
return false;
}
if (!isset($options['id_article']) or !$id_article=$options['id_article']) {
$id_article = $evenement['id_article'];
}
if (!$id_article) {
return false;
}
if (isset($options['statut'])) {
$statut = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
// interdit de publier un evenement sur un article non publie
if ($statut!=='publie'
and $options['statut']=='publie') {
return false;
}
}
$options['id_article'] = $id_article;
return autoriser('modifier', 'evenement', $id, $qui, $options);
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);
}
/**
@ -140,14 +75,11 @@ function autoriser_evenement_instituer_dist($faire, $quoi, $id, $qui, $options)
* @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);
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);
}
@ -161,16 +93,17 @@ function autoriser_evenement_voir_dist($faire, $quoi, $id, $qui, $options) {
* @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));
}
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') {
if ($qui['statut']=='0minirezo')
return true;
} else {
else
return false;
}
}
return autoriser('modifier', 'article', $id_article, $qui);
return autoriser('modifier','article',$id_article,$qui);
}
?>

346
agenda_fonctions.php

@ -1,276 +1,132 @@
<?php
/**
* Plugin Agenda 4 pour Spip 3.2
* Licence GPL 3
* Plugin Agenda pour Spip 2.0
* Licence GPL
*
*
* 2006-2020
* Auteurs : cf paquet.xml
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('public/agenda');
include_spip('inc/agenda_timezone');
include_spip('inc/agenda_filtres');
/**
* Ajout d'un offset a une date
*
* @param string $date