Browse Source

Mauvais rangement.

svn/root/tags/spip-3.2.0/plugins/organiseur
marcimat@rezo.net 5 years ago
commit
cd27bd205c
  1. 218
      .gitattributes
  2. 36
      action/effacer_messagerecu.php
  3. 37
      action/envoyer_message.php
  4. 30
      action/quete_autocomplete.php
  5. 185
      action/quete_calendrier_prive.php
  6. 34
      action/supprimer_message.php
  7. 93
      base/organiseur.php
  8. 68
      calendrier.css
  9. 6
      calendrier_quete.json.html
  10. 11
      calendrier_quete.json_fonctions.php
  11. 32
      contenu/calendrier.html
  12. 31
      formulaires/configurer_messagerie_agenda.html
  13. 40
      formulaires/configurer_messagerie_agenda.php
  14. 88
      formulaires/editer_message.html
  15. 49
      formulaires/editer_message.js
  16. 209
      formulaires/editer_message.php
  17. 13
      formulaires/inc-destinataires-message.html
  18. 50
      inc/date_gestion.php
  19. 220
      inc/messages.php
  20. 393
      inc/quete_calendrier.php
  21. 58
      lang/organiseur.xml
  22. 82
      lang/organiseur_ar.php
  23. 82
      lang/organiseur_de.php
  24. 82
      lang/organiseur_en.php
  25. 82
      lang/organiseur_es.php
  26. 81
      lang/organiseur_fa.php
  27. 80
      lang/organiseur_fr.php
  28. 82
      lang/organiseur_fr_fem.php
  29. 82
      lang/organiseur_fr_tu.php
  30. 82
      lang/organiseur_it.php
  31. 82
      lang/organiseur_nl.php
  32. 82
      lang/organiseur_oc_ni_mis.php
  33. 81
      lang/organiseur_pt.php
  34. 82
      lang/organiseur_pt_br.php
  35. 82
      lang/organiseur_ru.php
  36. 82
      lang/organiseur_sk.php
  37. 82
      lang/organiseur_uk.php
  38. 53
      lang/paquet-organiseur.xml
  39. 15
      lang/paquet-organiseur_ar.php
  40. 15
      lang/paquet-organiseur_de.php
  41. 15
      lang/paquet-organiseur_en.php
  42. 15
      lang/paquet-organiseur_es.php
  43. 15
      lang/paquet-organiseur_fa.php
  44. 13
      lang/paquet-organiseur_fr.php
  45. 15
      lang/paquet-organiseur_fr_fem.php
  46. 15
      lang/paquet-organiseur_fr_tu.php
  47. 15
      lang/paquet-organiseur_it.php
  48. 15
      lang/paquet-organiseur_lb.php
  49. 15
      lang/paquet-organiseur_nl.php
  50. 15
      lang/paquet-organiseur_oc_ni_mis.php
  51. 15
      lang/paquet-organiseur_pt.php
  52. 15
      lang/paquet-organiseur_pt_br.php
  53. 15
      lang/paquet-organiseur_ru.php
  54. 15
      lang/paquet-organiseur_sk.php
  55. 15
      lang/paquet-organiseur_uk.php
  56. 1404
      lib/fullcalendar/fullcalendar.css
  57. 14599
      lib/fullcalendar/fullcalendar.js
  58. 5
      lib/fullcalendar/fullcalendar.min.css
  59. 10
      lib/fullcalendar/fullcalendar.min.js
  60. 208
      lib/fullcalendar/fullcalendar.print.css
  61. 5
      lib/fullcalendar/fullcalendar.print.min.css
  62. 180
      lib/fullcalendar/gcal.js
  63. 6
      lib/fullcalendar/gcal.min.js
  64. 5
      lib/fullcalendar/locale-all.js
  65. 12910
      lib/moment/moment-with-locales.js
  66. 1216
      lib/moment/moment-with-locales.min.js
  67. 4301
      lib/moment/moment.js
  68. 551
      lib/moment/moment.min.js
  69. 63
      notifications/instituermessage.php
  70. 21
      notifications/message_affich_publie.html
  71. 24
      notifications/message_normal_publie.html
  72. 74
      organiseur_administrations.php
  73. 144
      organiseur_autoriser.php
  74. 187
      organiseur_fonctions.php
  75. 29
      organiseur_ieconfig.php
  76. 240
      organiseur_pipelines.php
  77. 37
      paquet.xml
  78. 38
      prive/objets/contenu/message.html
  79. 49
      prive/objets/liste/messages-envoyes.html
  80. 54
      prive/objets/liste/messages-recus.html
  81. 48
      prive/rss/messages.html
  82. 31
      prive/squelettes/contenu/calendrier.html
  83. 40
      prive/squelettes/contenu/message.html
  84. 24
      prive/squelettes/contenu/message_edit.html
  85. 19
      prive/squelettes/contenu/messages.html
  86. 3
      prive/squelettes/inclure/configurer_messagerie.html
  87. 17
      prive/squelettes/inclure/organiseur-autocomplete-auteur.html
  88. 12
      prive/squelettes/inclure/organiseur-envoi.html
  89. 5
      prive/squelettes/inclure/organiseur-interventions.html
  90. 6
      prive/squelettes/inclure/organiseur-message.html
  91. 36
      prive/squelettes/inclure/organiseur-rappels.html
  92. 10
      prive/squelettes/inclure/organiseur-reception.html
  93. 68
      prive/squelettes/inclure/organiseur-rv.html
  94. 63
      prive/squelettes/navigation/message.html
  95. 31
      prive/squelettes/navigation/messages.html
  96. 1
      prive/squelettes/top/calendrier.html
  97. 65
      prive/style_prive_plugin_organiseur.html
  98. BIN
      prive/themes/spip/images/agenda-16.png
  99. BIN
      prive/themes/spip/images/agenda-24.png
  100. BIN
      prive/themes/spip/images/agenda-32.png
  101. Some files were not shown because too many files have changed in this diff Show More

218
.gitattributes vendored

@ -0,0 +1,218 @@
* text=auto !eol
action/effacer_messagerecu.php -text
action/envoyer_message.php -text
action/quete_autocomplete.php -text
action/quete_calendrier_prive.php -text
action/supprimer_message.php -text
base/organiseur.php -text
/calendrier.css -text
/calendrier_quete.json.html -text
/calendrier_quete.json_fonctions.php -text
contenu/calendrier.html -text
formulaires/configurer_messagerie_agenda.html -text
formulaires/configurer_messagerie_agenda.php -text
formulaires/editer_message.html -text
formulaires/editer_message.js -text
formulaires/editer_message.php -text
formulaires/inc-destinataires-message.html -text
inc/date_gestion.php -text
inc/messages.php -text
inc/quete_calendrier.php -text
lang/organiseur.xml -text
lang/organiseur_ar.php -text
lang/organiseur_de.php -text
lang/organiseur_en.php -text
lang/organiseur_es.php -text
lang/organiseur_fa.php -text
lang/organiseur_fr.php -text
lang/organiseur_fr_fem.php -text
lang/organiseur_fr_tu.php -text
lang/organiseur_it.php -text
lang/organiseur_nl.php -text
lang/organiseur_oc_ni_mis.php -text
lang/organiseur_pt.php -text
lang/organiseur_pt_br.php -text
lang/organiseur_ru.php -text
lang/organiseur_sk.php -text
lang/organiseur_uk.php -text
lang/paquet-organiseur.xml -text
lang/paquet-organiseur_ar.php -text
lang/paquet-organiseur_de.php -text
lang/paquet-organiseur_en.php -text
lang/paquet-organiseur_es.php -text
lang/paquet-organiseur_fa.php -text
lang/paquet-organiseur_fr_fem.php -text
lang/paquet-organiseur_fr_tu.php -text
lang/paquet-organiseur_it.php -text
lang/paquet-organiseur_lb.php -text
lang/paquet-organiseur_nl.php -text
lang/paquet-organiseur_oc_ni_mis.php -text
lang/paquet-organiseur_pt.php -text
lang/paquet-organiseur_pt_br.php -text
lang/paquet-organiseur_ru.php -text
lang/paquet-organiseur_sk.php -text
lang/paquet-organiseur_uk.php -text
lib/fullcalendar/fullcalendar.css -text
lib/fullcalendar/fullcalendar.js -text
lib/fullcalendar/fullcalendar.min.css -text
lib/fullcalendar/fullcalendar.min.js -text
lib/fullcalendar/fullcalendar.print.css -text
lib/fullcalendar/fullcalendar.print.min.css -text
lib/fullcalendar/gcal.js -text
lib/fullcalendar/gcal.min.js -text
lib/fullcalendar/locale-all.js -text
lib/moment/moment-with-locales.js -text
lib/moment/moment-with-locales.min.js -text
lib/moment/moment.js -text
lib/moment/moment.min.js -text
notifications/instituermessage.php -text
notifications/message_affich_publie.html -text
notifications/message_normal_publie.html -text
/organiseur_administrations.php -text
/organiseur_autoriser.php -text
/organiseur_fonctions.php -text
/organiseur_ieconfig.php -text
/organiseur_pipelines.php -text
prive/objets/contenu/message.html -text
prive/objets/liste/messages-envoyes.html -text
prive/objets/liste/messages-recus.html -text
prive/rss/messages.html -text
prive/squelettes/contenu/calendrier.html -text
prive/squelettes/contenu/message.html -text
prive/squelettes/contenu/message_edit.html -text
prive/squelettes/contenu/messages.html -text
prive/squelettes/inclure/configurer_messagerie.html -text
prive/squelettes/inclure/organiseur-autocomplete-auteur.html -text
prive/squelettes/inclure/organiseur-envoi.html -text
prive/squelettes/inclure/organiseur-interventions.html -text
prive/squelettes/inclure/organiseur-message.html -text
prive/squelettes/inclure/organiseur-rappels.html -text
prive/squelettes/inclure/organiseur-reception.html -text
prive/squelettes/inclure/organiseur-rv.html -text
prive/squelettes/navigation/message.html -text
prive/squelettes/navigation/messages.html -text
prive/squelettes/top/calendrier.html -text
prive/style_prive_plugin_organiseur.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/annonce-16.png -text
prive/themes/spip/images/annonce-24.png -text
prive/themes/spip/images/annonce-32.png -text
prive/themes/spip/images/annonce-add-16.png -text
prive/themes/spip/images/annonce-add-24.png -text
prive/themes/spip/images/annonce-add-32.png -text
prive/themes/spip/images/annonce-del-16.png -text
prive/themes/spip/images/annonce-del-24.png -text
prive/themes/spip/images/annonce-del-32.png -text
prive/themes/spip/images/annonce-edit-16.png -text
prive/themes/spip/images/annonce-edit-24.png -text
prive/themes/spip/images/annonce-edit-32.png -text
prive/themes/spip/images/annonce-new-16.png -text
prive/themes/spip/images/annonce-new-24.png -text
prive/themes/spip/images/annonce-new-32.png -text
prive/themes/spip/images/calendrier-16.png -text
prive/themes/spip/images/calendrier-24.png -text
prive/themes/spip/images/calendrier-32.png -text
prive/themes/spip/images/calendrier-add-16.png -text
prive/themes/spip/images/calendrier-add-24.png -text
prive/themes/spip/images/calendrier-add-32.png -text
prive/themes/spip/images/calendrier-del-16.png -text
prive/themes/spip/images/calendrier-del-24.png -text
prive/themes/spip/images/calendrier-del-32.png -text
prive/themes/spip/images/calendrier-edit-16.png -text
prive/themes/spip/images/calendrier-edit-24.png -text
prive/themes/spip/images/calendrier-edit-32.png -text
prive/themes/spip/images/calendrier-new-16.png -text
prive/themes/spip/images/calendrier-new-24.png -text
prive/themes/spip/images/calendrier-new-32.png -text
prive/themes/spip/images/heure-16.png -text
prive/themes/spip/images/heure-24.png -text
prive/themes/spip/images/heure-32.png -text
prive/themes/spip/images/heure-on-16.png -text
prive/themes/spip/images/heure-on-24.png -text
prive/themes/spip/images/heure-on-32.png -text
prive/themes/spip/images/message-16.png -text
prive/themes/spip/images/message-24.png -text
prive/themes/spip/images/message-32.png -text
prive/themes/spip/images/message-add-16.png -text
prive/themes/spip/images/message-add-32.png -text
prive/themes/spip/images/message-del-16.png -text
prive/themes/spip/images/message-del-32.png -text
prive/themes/spip/images/message-edit-16.png -text
prive/themes/spip/images/message-edit-32.png -text
prive/themes/spip/images/message-envoyer-16.png -text
prive/themes/spip/images/message-envoyer-24.png -text
prive/themes/spip/images/message-new-16.png -text
prive/themes/spip/images/message-new-32.png -text
prive/themes/spip/images/messagerie-16.png -text
prive/themes/spip/images/messagerie-24.png -text
prive/themes/spip/images/messagerie-32.png -text
prive/themes/spip/images/pense-bete-16.png -text
prive/themes/spip/images/pense-bete-24.png -text
prive/themes/spip/images/pensebete-16.png -text
prive/themes/spip/images/pensebete-24.png -text
prive/themes/spip/images/pensebete-32.png -text
prive/themes/spip/images/pensebete-add-16.png -text
prive/themes/spip/images/pensebete-add-24.png -text
prive/themes/spip/images/pensebete-add-32.png -text
prive/themes/spip/images/pensebete-del-16.png -text
prive/themes/spip/images/pensebete-del-24.png -text
prive/themes/spip/images/pensebete-del-32.png -text
prive/themes/spip/images/pensebete-edit-16.png -text
prive/themes/spip/images/pensebete-edit-24.png -text
prive/themes/spip/images/pensebete-edit-32.png -text
prive/themes/spip/images/pensebete-new-16.png -text
prive/themes/spip/images/pensebete-new-24.png -text
prive/themes/spip/images/pensebete-new-32.png -text
prive/themes/spip/images/pictonew-16.png -text
prive/themes/spip2/images/agenda-16.png -text
prive/themes/spip2/images/agenda-24.png -text
prive/themes/spip2/images/annonce-16.png -text
prive/themes/spip2/images/annonce-24.png -text
prive/themes/spip2/images/annonce-add-16.png -text
prive/themes/spip2/images/annonce-add-24.png -text
prive/themes/spip2/images/annonce-del-16.png -text
prive/themes/spip2/images/annonce-del-24.png -text
prive/themes/spip2/images/annonce-edit-16.png -text
prive/themes/spip2/images/annonce-edit-24.png -text
prive/themes/spip2/images/annonce-new-16.png -text
prive/themes/spip2/images/annonce-new-24.png -text
prive/themes/spip2/images/calendrier-16.png -text
prive/themes/spip2/images/calendrier-24.png -text
prive/themes/spip2/images/calendrier-add-16.png -text
prive/themes/spip2/images/calendrier-add-24.png -text
prive/themes/spip2/images/calendrier-del-16.png -text
prive/themes/spip2/images/calendrier-del-24.png -text
prive/themes/spip2/images/calendrier-edit-16.png -text
prive/themes/spip2/images/calendrier-edit-24.png -text
prive/themes/spip2/images/calendrier-new-16.png -text
prive/themes/spip2/images/calendrier-new-24.png -text
prive/themes/spip2/images/message-16.png -text
prive/themes/spip2/images/message-24.png -text
prive/themes/spip2/images/message-add-16.png -text
prive/themes/spip2/images/message-add-24.png -text
prive/themes/spip2/images/message-del-16.png -text
prive/themes/spip2/images/message-del-24.png -text
prive/themes/spip2/images/message-edit-16.png -text
prive/themes/spip2/images/message-edit-24.png -text
prive/themes/spip2/images/message-envoyer-16.png -text
prive/themes/spip2/images/message-envoyer-24.png -text
prive/themes/spip2/images/message-new-16.png -text
prive/themes/spip2/images/message-new-24.png -text
prive/themes/spip2/images/messagerie-16.png -text
prive/themes/spip2/images/messagerie-24.png -text
prive/themes/spip2/images/pensebete-16.png -text
prive/themes/spip2/images/pensebete-24.png -text

36
action/effacer_messagerecu.php

@ -0,0 +1,36 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param int $id_auteur
* @param int $id_message
* @return void
*/
function action_effacer_messagerecu_dist($id_auteur = null, $id_message = null) {
if (is_null($id_auteur) or is_null($id_message)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_auteur, $id_message) = explode('-', $arg);
}
include_spip('inc/autoriser');
if (autoriser('effacer', 'messagerecu', $id_message, null, array('id_auteur' => $id_auteur))) {
include_spip('inc/messages');
messagerie_effacer_message_recu($id_auteur, $id_message);
}
}

37
action/envoyer_message.php

@ -0,0 +1,37 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param int $id_message
* @return void
*/
function action_envoyer_message_dist($id_message = null) {
if (is_null($id_message)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_message = $securiser_action();
}
include_spip('inc/autoriser');
if (intval($id_message)
and $type = sql_getfetsel('type', 'spip_messages', 'id_message=' . intval($id_message))
and autoriser('envoyermessage', $type, $id_message)
) {
include_spip('action/editer_objet');
objet_modifier('message', $id_message, array('statut' => 'publie'));
}
}

30
action/quete_autocomplete.php

@ -0,0 +1,30 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function action_quete_autocomplete_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if ($arg
and $arg == $GLOBALS['visiteur_session']['id_auteur']
) {
include_spip('inc/actions');
include_spip('inc/json');
echo ajax_retour(
recuperer_fond('prive/squelettes/inclure/organiseur-autocomplete-auteur', array('term' => _request('term'))),
'application/json'
);
}
}

185
action/quete_calendrier_prive.php

@ -0,0 +1,185 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Gestion de l'action de quête des événements du calendrier
*
* @package SPIP\Organiseur\Action
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fournir une liste d'"evenements" entre deux dates start et end
* au format json
*
* Utilisé pour l'affichage du calendrier privé et public
*
* @pipeline_appel quete_calendrier_prive
* @uses quete_calendrier_interval_rv()
* @uses quete_calendrier_interval()
* @uses convert_fullcalendar_quete_calendrier_interval_rv()
* @uses convert_fullcalendar_quete_calendrier_interval()
*
* @return void
*/
function action_quete_calendrier_prive_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$securiser_action();
$start = strtotime(_request('start'));
$end = strtotime(_request('end'));
$quoi = _request('quoi');
include_spip('inc/quete_calendrier');
$evt = array();
// recuperer la liste des evenements au format ics
$start = date('Y-m-d H:i:s', $start);
$end = date('Y-m-d H:i:s', $end);
$limites = array(sql_quote($start), sql_quote($end));
// on fonction de quoi on récupère : tout (rv + publication) ou l'un ou l'autre.
$entier = $duree = array();
if (!$quoi or $quoi == 'rv') {
$duree = quete_calendrier_interval_rv(reset($limites), end($limites));
$evt = convert_fullcalendar_quete_calendrier_interval_rv($duree, $evt);
}
if (!$quoi or $quoi == 'publication') {
list($entier, ) = quete_calendrier_interval($limites);
$evt = convert_fullcalendar_quete_calendrier_interval($entier, $evt);
}
// permettre aux plugins d'afficher leurs evenements dans ce calendrier
$evt = pipeline(
'quete_calendrier_prive',
array(
'args' => array('start' => $start, 'end' => $end, 'quoi' => $quoi),
'data' => $evt,
)
);
// format json
include_spip('inc/json');
echo json_encode($evt);
}
/**
* Convertir une date au format ical renvoyée par quete_calendrier_interval
* dans le format attendu par fullcalendar : yyyy-mm-dd H:i:s
*
* @param $dateical
* @return string
*/
function convert_dateical($dateical) {
$d = explode('T', $dateical);
$amj = reset($d);
$s = substr($amj, 0, 4) . '-' . substr($amj, 4, 2) . '-' . substr($amj, 6, 2);
if (count($d) > 1) {
$his = end($d);
$s .= ' ' . substr($his, 0, 2) . ':' . substr($his, 2, 2) . ':' . substr($his, 4, 2);
}
return $s;
}
/**
* Convertir une sortie événement de quète calendrier_interval
* dans le format attendu par fullcalendar
*
* @param array $messages
* Les événements / messages au format de la quete calendrier_interval
* @param array $evt
* Les événements au format fullcalendar déjà présents
* @return array
* Les événements au format fullcalendar
**/
function convert_fullcalendar_quete_calendrier_interval($messages, $evt = array()) {
if (!$messages) {
return $evt;
}
// la retransformer au format attendu par fullcalendar
// facile : chaque evt n'est mentionne qu'une fois, a une date
foreach ($messages as $amj => $l) {
$date = substr($amj, 0, 4) . '-' . substr($amj, 4, 2) . '-' . substr($amj, 6, 2);
foreach ($l as $e) {
$evt[] = array(
'id' => 0,
'title' => $e['SUMMARY'],
'allDay' => true,
'start' => $date,
'end' => $date,
'url' => str_replace('&amp;', '&', $e['URL']),
'className' => 'calendrier-event ' . $e['CATEGORIES'],
'description' => $e['DESCRIPTION'],
);
}
}
return $evt;
}
/**
* Convertir une sortie événement de quete calendrier_interval_rv
* dans le format attendu par fullcalendar
*
* @use convert_dateical()
*
* @param array $messages
* Les événements / messages au format issu de la quete calendrier_interval_rv
* @param array $evt
* Les événements au format fullcalendar déjà présents
* @return array
* Les événements au format fullcalendar
**/
function convert_fullcalendar_quete_calendrier_interval_rv($messages, $evt = array()) {
if (!$messages) {
return $evt;
}
// ici il faut faire attention : un evt apparait N fois
// mais on a son id
$seen = array();
// toutes les messages déjà inscrits qu'on ne remet pas
foreach ($evt as $e) {
$seen[$e['url']] = true;
}
foreach ($messages as $l) {
foreach ($l as $id => $e) {
$url = str_replace('&amp;', '&', $e['URL']);
if (!isset($seen[$url])) {
$evt[] = array(
'id' => $id,
'title' => $e['SUMMARY'],
'allDay' => false,
'start' => convert_dateical($e['DTSTART']), //Ymd\THis
'end' => convert_dateical($e['DTEND']), // Ymd\THis
'url' => $url,
'className' => 'calendrier-event ' . $e['CATEGORIES'],
'description' => $e['DESCRIPTION'],
);
$seen[$url] = true;
}
}
}
return $evt;
}

34
action/supprimer_message.php

@ -0,0 +1,34 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* @param int $id_message
* @return void
*/
function action_supprimer_message_dist($id_message = null) {
if (is_null($id_message)) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_message = $securiser_action();
}
include_spip('inc/autoriser');
if (autoriser('supprimer', 'message', $id_message)) {
include_spip('action/editer_objet');
objet_modifier('message', $id_message, array('statut' => 'poub'));
}
}

93
base/organiseur.php

@ -0,0 +1,93 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Declaration des champs complementaires sur la table auteurs, pour les clients
*
* @param array $tables
* @return array
*/
function organiseur_declarer_tables_objets_sql($tables) {
$tables['spip_auteurs']['field']['imessage'] = 'VARCHAR(3)';
$tables['spip_auteurs']['field']['messagerie'] = 'VARCHAR(3)';
$tables['spip_messages'] = array(
'page' => false,
'texte_modifier' => 'icone_modifier_message',
'texte_creer' => 'icone_ecrire_nouveau_message',
'texte_objets' => 'organiseur:messages',
'texte_objet' => 'organiseur:message',
'info_aucun_objet' => 'info_aucun_message',
'info_1_objet' => 'info_1_message',
'info_nb_objets' => 'info_nb_messages',
'principale' => 'oui',
'champs_editables' => array(
'titre', 'texte', 'type', 'date_heure', 'date_fin', 'rv', 'id_auteur', 'destinataires'
),
'field' => array(
'id_message' => 'bigint(21) NOT NULL',
'titre' => "text DEFAULT '' NOT NULL",
'texte' => "longtext DEFAULT '' NOT NULL",
// normal,
// pb (pense bete)
// affich (annonce publique)
'type' => "varchar(6) DEFAULT '' NOT NULL",
'date_heure' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
'date_fin' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
'rv' => "varchar(3) DEFAULT '' NOT NULL",
'statut' => "varchar(6) DEFAULT '0' NOT NULL",
'id_auteur' => 'bigint(21) DEFAULT 0 NOT NULL',
'destinataires' => "text DEFAULT '' NOT NULL",
'maj' => 'TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_message',
'KEY id_auteur' => 'id_auteur'
),
'titre' => "titre, '' AS lang",
'date' => 'date_heure',
'statut' => array(
array(
'champ' => 'statut',
'publie' => 'publie',
'previsu' => '!',
'exception' => array('statut', 'tout')
),
),
'rechercher_champs' => array(
'titre' => 8,
'texte' => 1
),
);
return $tables;
}
/**
* Interfaces des tables agenda et messagerie
*
* @param array $interfaces
* @return array
*/
function organiseur_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['messages'] = 'messages';
return $interfaces;
}

68
calendrier.css

@ -0,0 +1,68 @@
/* ------------------------------------------ */
/* Styles pour l'agenda de SPIP
/* ------------------------------------------ */
#calendrier-loading {position:absolute;top:20px;left:350px;padding:5px 30px;border:1px solid #ddd;background:#eee;z-index:100;}
@media (max-width: 640px) {#calendrier-loading {left:20px;}}
.calendrier-noir { color: #000; } /* style anar */
.calendrier-nb { background-color: #FFF; border: 1px solid #000; color: #000; } /* style cinemat(yp)ographe */
.fc-head table { margin-bottom:0; }
.calendrier-event {word-wrap:break-word;}
.calendrier-couleur1,
.calendrier-couleur1 .fc-widget-content { background-color: #CD006F; border-color: #CD006F; color: #fff; } /* Fushia */
.calendrier-couleur1i,
.calendrier-couleur1i .fc-widget-content { background-color: #FDE5F2; border-color: #FDE5F2; color: #CD006F; } /* Fushia */
.calendrier-couleur2,
.calendrier-couleur2 .fc-widget-content { background-color: #5da7c5; border-color: #5da7c5; color: #fff; } /* Bleu */
.calendrier-couleur2i,
.calendrier-couleur2i .fc-widget-content { background-color: #EDF3FE; border-color: #EDF3FE; color: #5da7c5; } /* Bleu */
.calendrier-couleur3,
.calendrier-couleur3 .fc-widget-content { background-color: #766CF6; border-color: #766CF6; color: #fff; } /* Bleu pastel */
.calendrier-couleur3i,
.calendrier-couleur3i .fc-widget-content { background-color: #EBE9FF; border-color: #EBE9FF; color: #766CF6; } /* Bleu pastel */
.calendrier-couleur4,
.calendrier-couleur4 .fc-widget-content { background-color: #FA9A00; border-color: #FA9A00; color: #fff; } /* Orange */
.calendrier-couleur4i,
.calendrier-couleur4i .fc-widget-content { background-color: #fec; border-color: #fec; color: #FA9A00; } /* Orange */
.calendrier-couleur5,
.calendrier-couleur5 .fc-widget-content { background-color: #F00; border-color: #F00; color: #FFF; } /* Rouge (Vermillon) */
.calendrier-couleur5i,
.calendrier-couleur5i .fc-widget-content { background-color: #FFEDED; border-color: #FFEDED; color: #F00; } /* Rouge (Vermillon) */
.calendrier-couleur6,
.calendrier-couleur6 .fc-widget-content { background-color: #E95503; border-color: #E95503; color: #FFF; } /* Orange */
.calendrier-couleur6i,
.calendrier-couleur6i .fc-widget-content { background-color: #FFF2EB; border-color: #FFF2EB; color: #E95503; } /* Orange */
.calendrier-couleur7,
.calendrier-couleur7 .fc-widget-content { background-color: #ccaa00; border-color: #ccaa00; color: #fff; } /* Jaune */
.calendrier-couleur7i,
.calendrier-couleur7i .fc-widget-content { background-color: #FFE; border-color: #FFE; color: #ccaa00; } /* Jaune */
.calendrier-couleur8,
.calendrier-couleur8 .fc-widget-content { background-color: #009F3C; border-color: #009F3C; color: #fff; } /* Vert pastel */
.calendrier-couleur8i,
.calendrier-couleur8i .fc-widget-content { background-color: #E2FDEC; border-color: #E2FDEC; color: #009F3C; } /* Vert pastel */
.calendrier-couleur9,
.calendrier-couleur9 .fc-widget-content { background-color: #9DBA00; border-color: #9DBA00; color: #fff; } /* Vert */
.calendrier-couleur9i,
.calendrier-couleur9i .fc-widget-content { background-color: #e5fd63; border-color: #e5fd63; color: #9DBA00; } /* Vert */
.calendrier-couleur10,
.calendrier-couleur10 .fc-widget-content { background-color: #640707; border-color: #640707; color: #fff; } /* Rouge (Bordeaux) */
.calendrier-couleur10i,
.calendrier-couleur10i .fc-widget-content { background-color: #FFE0E0; border-color: #FFE0E0; color: #640707; } /* Rouge (Bordeaux) */
.calendrier-couleur11,
.calendrier-couleur11 .fc-widget-content { background-color: #3F3F3F; border-color: #3F3F3F; color: #fff; } /* Gris */
.calendrier-couleur11i,
.calendrier-couleur11i .fc-widget-content { background-color: #F2F2F2; border-color: #F2F2F2; color: #3F3F3F; } /* Gris */
.calendrier-couleur12,
.calendrier-couleur12 .fc-widget-content { background-color: #AAA; border-color: #AAA; color: #fff; }
.calendrier-couleur12i,
.calendrier-couleur12i .fc-widget-content { background-color: #AAA; border-color: #AAA; color: #000; }
.calendrier-couleur13,
.calendrier-couleur13 .fc-widget-content { background-color: #666500; border-color: #666500; color: #fff; } /* Caca d'oie */
.calendrier-couleur13i,
.calendrier-couleur13i .fc-widget-content { background-color: #FFFFE0; border-color: #FFFFE0; color: #666500; } /* Caca d'oie */
.calendrier-couleur14,
.calendrier-couleur14 .fc-widget-content { background-color: #8C6635; border-color: #8C6635; color: #fff; } /* Marron */
.calendrier-couleur14i,
.calendrier-couleur14i .fc-widget-content { background-color: #F5EEE5; border-color: #F5EEE5; color: #8C6635; } /* Marron */

6
calendrier_quete.json.html

@ -0,0 +1,6 @@
#HTTP_HEADER{Content-type:text/javascript;}
[<BOUCLE_periode(ARTICLES){id_mot?}{id_rubrique?}
{agenda date, periode,
#ENV{start}|todate|affdate{Y}, #ENV{start}|todate|affdate{m}, #ENV{start}|todate|affdate{d},
#ENV{end}|todate|affdate{Y}, #ENV{end}|todate|affdate{m}, #ENV{end}|todate|affdate{d}}{', '}>
[(#ARRAY{id,#ID_ARTICLE,title,[(#TITRE|html2unicode|unicode2charset)],allDay,#EVAL{false},start,#DATE,end,#DATE,url,#URL_ARTICLE,className,calendrier-couleur6,description,[(#INTRODUCTION|html2unicode|unicode2charset)]}|json_encode)]</BOUCLE_periode>]

11
calendrier_quete.json_fonctions.php

@ -0,0 +1,11 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/json');
function todate($t) {
return date('Y-m-d H:i:s', $t);
}

32
contenu/calendrier.html

@ -0,0 +1,32 @@
<div id="calendrier-loading" style="display:none;"><:organiseur:loading:></div>
<div id="calendrier"></div>
<link rel='stylesheet' type='text/css' href='#CHEMIN{lib/fullcalendar/fullcalendar.min.css}' />
<link rel="stylesheet" type="text/css" href="#CHEMIN{calendrier.css}" />
<script type='text/javascript' src='#CHEMIN{lib/moment/moment-with-locales.min.js}'></script>
<script type='text/javascript' src='#CHEMIN{lib/fullcalendar/fullcalendar.min.js}'></script>
<script type='text/javascript' src='#CHEMIN{lib/fullcalendar/locale-all.js}'></script>
<script type="text/javascript">/*<![CDATA[*/
jQuery(function($) {
// page is now ready, initialize the calendar...
$('#calendrier').fullCalendar({
locale: '[(#LANG|strtolower)]',
editable: false,
navLinks: true,
eventLimit: true,
events: "[(#URL_PAGE{calendrier_quete.json}|parametre_url{id_mot,#ENV{id_mot,''}}|parametre_url{id_rubrique,#ENV{id_rubrique,''}})]",
header: {
left: 'prevYear,prev,next,nextYear today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
fixedWeekCount: false,
loading: function(bool) {
if (bool) $('#calendrier-loading').show();
else $('#calendrier-loading').hide();
},
allDayHtml:'<:organiseur:cal_jour_entier|texte_script:>',
})
});
/*]]>*/</script>

31
formulaires/configurer_messagerie_agenda.html

@ -0,0 +1,31 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
<h3 class='titrem'><img src="#CHEMIN_IMAGE{messagerie-24.png}" class="cadre-icone" /><:titre_messagerie_agenda:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<p><:texte_messagerie_agenda:></p>
<form method='post' action='#ENV{action}'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE
<div class="editer-groupe">
#SET{name,messagerie_agenda}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
[
<span class='erreur_message'>(#GET{erreurs})</span>
]<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui"
[(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_messagerie_agenda:></label>
</div>
<div class="choix">
<input type="radio" name="#GET{name}" id="#GET{name}_non" value="non"
[(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_messagerie_agenda:></label>
</div>
</div>
</div>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class='boutons'><span class='image_loading'>&nbsp;</span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
</div></form>
]
</div>

40
formulaires/configurer_messagerie_agenda.php

@ -0,0 +1,40 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function formulaires_configurer_messagerie_agenda_charger_dist() {
$valeurs = array();
foreach (array(
'messagerie_agenda',
) as $m) {
$valeurs[$m] = $GLOBALS['meta'][$m];
}
return $valeurs;
}
function formulaires_configurer_messagerie_agenda_traiter_dist() {
$res = array('editable' => true);
foreach (array(
'messagerie_agenda',
) as $m) {
if (!is_null($v = _request($m))) {
ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
}
}
$res['message_ok'] = _T('config_info_enregistree');
return $res;
}

88
formulaires/editer_message.html

@ -0,0 +1,88 @@
<div class="ajax formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method='post' action='#ENV{action}'><div>
[(#REM) declarer les hidden qui declencheront le service du formulaire
parametre : url d'action ]
#ACTION_FORMULAIRE
#SET{fl,organiseur}
<div class="editer-groupe">
[(#ENV{_destiner}|oui)
#SET{name,destinataires}#SET{obli,'obligatoire'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]
#INCLURE{fond=formulaires/inc-destinataires-message,name=#GET{name},env}
</div>
]
#SET{name,titre}#SET{obli,'obligatoire'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<input type="text" class="text" name="#GET{name}" value="#ENV*{#GET{name}}" id="#GET{name}" [(#HTML5|et{#GET{obli}})required='required']/>
</div>
<div class="editer editer_rv[ (#ENV**{erreurs}|table_valeur{rv}|oui)erreur]">
<div class="choix">
<input type='checkbox' name='rv' id='rv' value='oui' [(#ENV{rv}|=={oui}|oui)checked='checked']
onclick="if (this.checked==true) { $('.editer_date_debut_fin').show('fast');} else {$('.editer_date_debut_fin').hide('fast');}" />
<label for="rv"><:item_afficher_calendrier:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{rv})</span>
]
</div>
</div>
<div class="editer editer_date_debut editer_date_debut_fin[ (#ENV**{erreurs}|table_valeur{date_debut}|oui)erreur][(#ENV{rv}|=={oui}|non)none]">
<label for="date_debut"><:organiseur:info_message_date_debut:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{date_debut})</span>
]<input type='text' class='text date' name='date_debut' id='date_debut' size='10' maxlength='10' value="[(#ENV{date_debut})]" />
<input type='text' class='text heure' name='heure_debut' id='heure_debut' size='4' maxlength='5' value="[(#ENV{heure_debut})]"
/>
</div>
<div class="editer editer_date_fin editer_date_debut_fin[ (#ENV**{erreurs}|table_valeur{date_fin}|oui)erreur][(#ENV{rv}|=={oui}|non)none]">
<label for="date_fin" class='date_fin'><:organiseur:info_message_date_fin:></label>[
<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{date_fin})</span>
]<input type='text' class='text date' name='date_fin' id='date_fin' size='10' maxlength='10' value="[(#ENV{date_fin})]" />
<input type='text' class='text heure' name='heure_fin' id='heure_fin' size='4' maxlength='5' value="[(#ENV{heure_fin})]" />
</div>
#SET{name,texte}#SET{obli,'obligatoire'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<textarea class="textarea" name="#GET{name}" rows="10">
#ENV*{#GET{name}}</textarea>
</div>
[(#REM) Piege a robots spammeurs ]
#SET{name,antispam}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer none editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="nobotnobot-#ID"><:antispam_champ_vide:></label>[
<span class='erreur_message'>(#GET{erreurs})</span>
]<input type="text" class="text" name="#GET{name}" value="#ENV*{#GET{name}}" id="nobotnobot-#ID" />
</div>
</div>
<!--extra-->
<p class='boutons'><span class='image_loading'>&nbsp;</span>
[(#ENV{statut}|=={publie}|non)
<input type='submit' class='submit' name="draft" value='<:organiseur:bouton_enregistrer_brouillon:>' />
]
<input type='submit' class='submit' name="send" value='<:organiseur:bouton_envoyer_message:>' />
</p>
</div></form>
#INCLURE{fond=formulaires/dateur/inc-dateur}
]
</div>
[(#ENV{_destiner}|oui)
<script type="text/javascript">
if (typeof formulaire_editer_message_init=="undefined"){
var formulaire_editer_message_init=''; // eviter double dl si plusieurs forms dans la page
var url_trouver_destinataire = '[(#URL_ACTION_AUTEUR{quete_autocomplete,#SESSION{id_auteur}}|replace{&amp;,&})]';
jQuery.getScript('[(#CHEMIN{prive/javascript/ui/widget.js}|timestamp)]',function(){
jQuery.getScript('[(#CHEMIN{prive/javascript/ui/position.js}|timestamp)]',function(){
jQuery.getScript('[(#CHEMIN{prive/javascript/ui/menu.js}|timestamp)]',function(){
jQuery.getScript('[(#CHEMIN{prive/javascript/ui/autocomplete.js}|timestamp)]',function(){
jQuery.getScript('[(#CHEMIN{formulaires/editer_message.js}|timestamp)]');
});
});});});
}
</script>
]

49
formulaires/editer_message.js

@ -0,0 +1,49 @@
function formulaire_editer_message_set_dest(input,item){
var id_auteur;
var box = jQuery(input).siblings('.selected');
if (item.value) {
id_auteur = item.value;
var nom = item.label;
if (box.find('input[value='+id_auteur+']').length==0){
box.find('.on').removeClass('on');
box.append(" <span class='dest on'>"
+ nom
+"<input type='hidden' name='"
+ jQuery(input).attr('data-name')
+ "' value='"+id_auteur+"' /> "
+ $(box).find('span.dest:first').html()
+"</span>");
}
else {
box.find('input[value='+id_auteur+']').closest('span').addClass('on').siblings('.on').removeClass('on');
}
}
jQuery(input).val('');//.get(0).focus();
}
function formulaire_editer_message_init(){
jQuery("input.destinataires:not(.autocompleted)").each(function(){
var me = this;
jQuery(me)
.autocomplete({
source: url_trouver_destinataire,
minLength:2,
/*autoFocus:1,*/
select: function(event,ui){
event.preventDefault();
formulaire_editer_message_set_dest(me, ui.item);
},
focus: function(event, ui){
event.preventDefault();
jQuery(me).val(ui.item.label);
},
})
.parent().on('click', function(){jQuery(me).get(0).focus();});
})
.addClass('autocompleted');
}
if (window.jQuery){
jQuery(function(){
formulaire_editer_message_init();
onAjaxLoad(formulaire_editer_message_init);
});
}

209
formulaires/editer_message.php

@ -0,0 +1,209 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/editer');
function formulaires_editer_message_charger_dist(
$id_message = 'new',
$type = 'message',
$retour = '',
$accepter_email = 'oui',
$destinataires = '',
$titre = '',
$texte = ''
) {
include_spip('inc/autoriser');
if (
(!intval($id_message) and !autoriser('envoyermessage', $type))
or
(intval($id_message) and !autoriser('modifier', 'message', $id_message))
) {
return false;
}
$valeurs = formulaires_editer_objet_charger('message', $id_message, 0, 0, $retour, '');
// les destinataires sont stockes en chaine separe par une virgule dans la base
if (strlen($valeurs['destinataires'])) {
$valeurs['destinataires'] = explode(',', $valeurs['destinataires']);
}
if (!intval($id_message)) {
$valeurs['type'] = $type;
$valeurs['destinataires'] = ($destinataires ? explode(',', $destinataires) : array());
$valeurs['titre'] = $titre;
$valeurs['texte'] = $texte;
$t = time();
$valeurs['date_heure'] = date('Y-m-d H:i:00', $t);
$valeurs['date_fin'] = date('Y-m-d H:i:00', $t + 3600);
$valeurs['rv'] = '';
}
$id_message_origine = intval(_request('id_message_origine'));
if (autoriser('voir', 'message', $id_message_origine)) {
$v = formulaires_editer_objet_charger('message', $id_message_origine, 0, 0, $retour, '');
$valeurs['titre'] = _T('organiseur:re') . ' : ' . $v['titre'];
$valeurs['texte'] = '<quote>' . $v['texte'] . '</quote>';
}
// dispatcher date et heure
list($valeurs['date_debut'], $valeurs['heure_debut']) = explode(
' ',
date('d/m/Y H:i', strtotime($valeurs['date_heure']))
);
list($valeurs['date_fin'], $valeurs['heure_fin']) = explode(
' ',
date('d/m/Y H:i', strtotime($valeurs['date_fin']))
);
if (in_array($valeurs['type'], array('pb', 'affich'))) {
$valeurs['_destiner'] = '';
} else {
$valeurs['_destiner'] = ' ';
}
return $valeurs;
}
function formulaires_editer_message_verifier_dist(
$id_message = 'new',
$type = 'message',
$retour = '',
$accepter_email = 'oui',
$destinataires = '',
$titre = '',
$texte = ''
) {
$oblis = array('titre');
if (!_request('draft')) {
$oblis[] = 'texte';
}
if (intval($id_message) and $t = sql_getfetsel('type', 'spip_messages', 'id_message=' . intval($id_message))) {
$type = $t;
}
if (!in_array($type, array('pb', 'affich'))
// pas de destinataire obligatoire pour un brouillon
and !_request('draft')
) {
$oblis['destinataires'] = 'destinataires';
}
if ($d = _request('destinataires')) {
set_request('destinataires', implode(',', $d));
}
$erreurs = formulaires_editer_objet_verifier('message', $id_message, $oblis);
if ($d) {
set_request('destinataires', $d);
}
include_spip('inc/messages');
if (
(!isset($erreurs['destinataires']) or !$erreurs['destinataires'])
and isset($oblis['destinataires'])
and $e = messagerie_verifier_destinataires(
_request('destinataires'),
array('accepter_email' => ($accepter_email == 'oui'))
)) {
$erreurs['destinataires'] = implode(', ', $e);
}
if (_request('rv') == 'oui') {
include_spip('inc/date_gestion');
$date_debut = verifier_corriger_date_saisie('debut', true, $erreurs);
$date_fin = verifier_corriger_date_saisie('fin', true, $erreurs);
if ($date_debut and $date_fin and $date_fin < $date_debut) {
$erreurs['date_fin'] = _T('organiseur:erreur_date_avant_apres');
}
} else {
set_request('rv', '');
}
return $erreurs;
}
function formulaires_editer_message_traiter_dist(
$id_message = 'new',
$type = 'message',
$retour = '',
$accepter_email = 'oui',
$destinataires = '',
$titre = '',
$texte = ''
) {
// preformater le post
// fixer le type de message
// sans modifier le type d'un message existant
if (intval($id_message) and $t = sql_getfetsel('type', 'spip_messages', 'id_message=' . intval($id_message))) {
$type = $t;
}
set_request('type', $type);
// formater les destinataires
$d = _request('destinataires');
if (!$d) {
$d = array();
}
include_spip('inc/messages');
$d = messagerie_nettoyer_destinataires($d);
// si email non acceptes, extraire les seuls id_auteur de la liste proposee
if ($accepter_email !== 'oui') {
// separer id_auteur et email
$d = messagerie_destiner($d);
// ne conserver que les id_auteur
$d = reset($d);
}
// reinjecter sous forme de chaine
set_request('destinataires', implode(',', $d));
// fixer l'auteur !
set_request('id_auteur', $GLOBALS['visiteur_session']['id_auteur']);
if (_request('rv') == 'oui') {
include_spip('inc/date_gestion');
$erreurs = array();
$date_debut = verifier_corriger_date_saisie('debut', true, $erreurs);
$date_fin = verifier_corriger_date_saisie('fin', true, $erreurs);
set_request('date_heure', date('Y-m-d H:i:s', $date_debut));
set_request('date_fin', date('Y-m-d H:i:s', $date_fin));
} else {
set_request('date_heure');
set_request('date_fin');
}
// on gere par les traitements standard
// la diffusion du message se fait par pipeline post_edition sur instituer
// et notification
$res = formulaires_editer_objet_traiter('message', $id_message, 0, 0, $retour, '');
if ($id_message = $res['id_message']
and !_request('draft')
) {
include_spip('action/editer_objet');
objet_modifier('message', $id_message, array('statut' => 'publie', 'date_heure' => _request('date_heure')));
// apres en message envoyes, retourner sur la boite d'envoi plutot que sur le message
if (isset($res['redirect'])
and ($res['redirect'] == generer_url_ecrire('message', 'id_message=' . $id_message))) {
$res['redirect'] = generer_url_ecrire('messages', 'quoi=envoi');
}
}
set_request('destinataires', explode(',', _request('destinataires')));
return $res;
}

13
formulaires/inc-destinataires-message.html

@ -0,0 +1,13 @@
<div class="fake-input clearfix">
<span class="selected">
[(#REM) Premier element vide et cache qui sert de modele pour le js]
<span class="dest" style="display: none;"><img
src='#CHEMIN_IMAGE{supprimer-12.png}' width="12" height="12" onclick="jQuery(this).parent().remove();" /></span>
<BOUCLE_d(POUR){tableau #ENV{#ENV{name}}}>
<span class="dest"><input type="hidden" name="#ENV{name}[]" value="#VALEUR" />
<BOUCLE_a(AUTEURS){id_auteur=#VALEUR}{tout}>#NOM</BOUCLE_a>#VALEUR<//B_a>&nbsp;<img
src='#CHEMIN_IMAGE{supprimer-12.png}' width="12" height="12" onclick="jQuery(this).parent().remove();" /></span>
</BOUCLE_d>
</span>
<input type="text" class="text destinataires" data-name="#ENV{name}[]" value="" id="#ENV{name}" />
</div>

50
inc/date_gestion.php

@ -0,0 +1,50 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Recuperer les champs date_xx et heure_xx, verifier leur coherence et les reformater
*
* @param string $suffixe
* @param bool $horaire
* @param array $erreurs
* @return int
*/
function verifier_corriger_date_saisie($suffixe, $horaire, &$erreurs) {
include_spip('inc/filtres');
$date = _request("date_$suffixe") . ($horaire ? ' ' . trim(_request("heure_$suffixe")) . ':00' : '');
$date = recup_date($date);
if (!$date) {
return '';
}
$ret = null;
if (!$ret = mktime(0, 0, 0, $date[1], $date[2], $date[0])) {
$erreurs["date_$suffixe"] = _T('organiseur:erreur_date');
} elseif (!$ret = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0])) {
$erreurs["date_$suffixe"] = _T('organiseur:erreur_heure');
}
if ($ret) {
if (trim(_request("date_$suffixe") !== ($d = date('d/m/Y', $ret)))) {
$erreurs["date_$suffixe"] = _T('organiseur:erreur_date_corrigee');
set_request("date_$suffixe", $d);
}
if ($horaire and trim(_request("heure_$suffixe") !== ($h = date('H:i', $ret)))) {
$erreurs["heure_$suffixe"] = _T('organiseur:erreur_heure_corrigee');
set_request("heure_$suffixe", $h);
}
}
return $ret;
}

220
inc/messages.php

@ -0,0 +1,220 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/filtres');
include_spip('base/abstract_sql');
if (!defined('_EMAIL_GENERAL')) {
define('_EMAIL_GENERAL', 'general');
} // permet aux admin d'envoyer un email a tout le monde
/**
* Lister les statuts des auteurs pouvant recevoir un message
* c'est tous les auteurs au moins redacteur
*
* @return array
*/
function messagerie_statuts_destinataires_possibles() {
include_spip('inc/filtres_ecrire');
return pipeline('messagerie_statuts_destinataires_possibles', auteurs_lister_statuts('redacteurs', false));
}
/**
* Nettoyer une liste de destinataires
*
* @param $destinataires
* @return array
*/
function messagerie_nettoyer_destinataires($destinataires) {
foreach ($destinataires as $k => $id) {
// il se peut que l'id recupere l'ancre qui suit avec certains ie ... :(
if (preg_match(',^[0-9]+#[a-z_0-9]+,', $id)) {
$destinataires[$k] = intval($id);
}
}
return $destinataires;
}
/**
* Fonction generique de verification des destinataires
* lors de l'envoi d'un message ou de recommander
* un destinataire peut etre un id_auteur numerique
* ou une adresse mail valide, si l'options accepter_email est true
*
* @param array $destinataires
* @param array $options
* @return array
*/
function messagerie_verifier_destinataires($destinataires, $options = array('accepter_email' => true)) {
$erreurs = array();
$destinataires = messagerie_nettoyer_destinataires($destinataires);
foreach ($destinataires as $id) {
if (is_numeric($id)) {
if (!$id) {
$erreurs[] = _T('organiseur:erreur_destinataire_invalide', array('dest' => entites_html($id)));
}
} else {
if (!$options['accepter_email']
or !email_valide($id)
) {
$erreurs[] = _T('organiseur:erreur_destinataire_invalide', array('dest' => entites_html($id)));
}
}
}
return $erreurs;
}
/**
* Selectionner les destinataires en distinguant emails et id_auteur
*
* @param array $dests
* @return array
*/
function messagerie_destiner($dests) {
// separer les destinataires auteur des destinataires email
$auteurs_dest = array();
$email_dests = array();
$dests = messagerie_nettoyer_destinataires($dests);
foreach ($dests as $id) {
if (is_numeric($id)) {
$auteurs_dest[] = $id;
} elseif (defined('_MESSAGERIE_EMAIL_GENERAL') and $id != _MESSAGERIE_EMAIL_GENERAL) {
$email_dests[] = $id;
}
}
if (count($email_dests)) {
// retrouver les id des emails pour ceux qui sont en base
$res = sql_select('id_auteur,email', 'spip_auteurs', sql_in('email', $email_dests));
$auteurs_dest_found = array();
while ($row = sql_fetch($res)) {
$auteurs_dest_found[] = $row['id_auteur'];
}
$auteurs_dest = array_merge($auteurs_dest, $auteurs_dest_found);
}
return array($auteurs_dest, $email_dests);
}
/**
* Diffuser un message par la messagerie interne
*
* @param int $id_message
* @param array $auteurs_dest
* @return bool|int
*/
function messagerie_diffuser_message($id_message, $auteurs_dest = array()) {
$out = false;
if ($id_message = intval($id_message)
and count($auteurs_dest)
) {
include_spip('action/editer_liens');
$out = objet_associer(array('auteur' => $auteurs_dest), array('message' => $id_message), array('vu' => 'non'));
}
return $out;
}
/**
* Envoyer un message par mail pour les destinataires externes
*
* @param int $id_message
* @param array $emails_dest
* @return bool
*/
function messagerie_mailer_message($id_message, $emails_dest = array()) {
if ($id_message = intval($id_message)
and count($emails_dest)
) {
if ($row = sql_fetsel('titre,texte,id_auteur', 'spip_messages', 'id_message=' . intval($id_message))) {
$from = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . $row['id_auteur']);
foreach ($emails_dest as $email) {
job_queue_add(
'envoyer_mail',
'messagerie mail',
array($email, $row['titre'], array('texte' => $row['texte'], 'from' => $from)),
'inc/'
);
}
return true;
}
}
return false;
}
/**
* Marquer un message dans l'etat indique par $vu
*
* @param int $id_auteur
* @param array $liste
* @param string $vu
* @return void
*/
function messagerie_marquer_message($id_auteur, $liste, $vu) {
include_spip('action/editer_liens');
if (!is_array($liste)) {
$liste = array($liste);
}
// completer les liens qui n'existent pas encore
// ex : pour marquer lue une annonce, on ajoute le lien d'abord (n'existe pas)
// puis on le marque 'oui'
$liens = objet_trouver_liens(array('auteur' => $id_auteur), array('message' => $liste));
$l = array();
foreach ($liens as $lien) {
$l[] = $lien['message'];
}
objet_associer(array('auteur' => $id_auteur), array('message' => array_diff($liste, $l)), array('vu' => $vu));
// puis les marquer tous lus
objet_qualifier_liens(array('auteur' => $id_auteur), array('message' => $liste), array('vu' => $vu));
include_spip('inc/invalideur');
suivre_invalideur('message/' . implode(',', $liste));
}
/**
* Marquer un message comme lu
*
* @param int $id_auteur
* @param array $liste_id_message
*/
function messagerie_marquer_lus($id_auteur, $liste_id_message) {
messagerie_marquer_message($id_auteur, $liste_id_message, 'oui');
}
/**
* Marquer un message comme non lu
*
* @param int $id_auteur
* @param array $liste_id_message
*/
function messagerie_marquer_non_lus($id_auteur, $liste_id_message) {
messagerie_marquer_message($id_auteur, $liste_id_message, 'non');
}
/**
* Effacer un message recu
*
* @param int $id_auteur
* @param array $liste_id_message
*/
function messagerie_effacer_message_recu($id_auteur, $liste_id_message) {
messagerie_marquer_message($id_auteur, $liste_id_message, 'poub');
}

393
inc/quete_calendrier.php

@ -0,0 +1,393 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2016 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Fonctions de quêtes pour les calendriers : obtient les listes
* des éléments à afficher dans des périodes données