PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/_plugins_/agenda/2_1_0/action/editer_evenement.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 334 lines | 260 code | 44 blank | 30 comment | 29 complexity | 639127c1c85214395aabc6bef9634b43 MD5 | raw file
  1. <?php
  2. /**
  3. * Plugin Agenda pour Spip 2.0
  4. * Licence GPL
  5. *
  6. *
  7. */
  8. if (!defined("_ECRIRE_INC_VERSION")) return; #securite
  9. function action_editer_evenement_dist(){
  10. $securiser_action = charger_fonction('securiser_action', 'inc');
  11. $arg = $securiser_action();
  12. // si id_article n'est pas un nombre, c'est une creation
  13. // mais on verifie qu'on a toutes les donnees qu'il faut.
  14. if (!$id_evenement = intval($arg)) {
  15. $id_parent = _request('id_parent');
  16. if (!$id_evenement = agenda_action_insert_evenement($id_parent))
  17. return array(false,_L('echec'));
  18. }
  19. $err = action_evenement_set($id_evenement);
  20. return array($id_evenement,$err);
  21. }
  22. function action_evenement_set($id_evenement, $set=null){
  23. $err = '';
  24. if (is_null($set)){
  25. $c = array();
  26. foreach (array(
  27. 'titre', 'descriptif', 'lieu', 'id_parent',
  28. 'inscription','places','adresse',
  29. ) as $champ)
  30. $c[$champ] = _request($champ);
  31. $c['horaire'] = _request('horaire')=='non'?'non':'oui';
  32. include_spip('inc/date_gestion');
  33. $date_debut = verifier_corriger_date_saisie('debut',$c['horaire']=='oui',$erreurs);
  34. $date_fin = verifier_corriger_date_saisie('fin',$c['horaire']=='oui',$erreurs);
  35. $c['date_debut'] = date('Y-m-d H:i:s',$date_debut);
  36. $c['date_fin'] = date('Y-m-d H:i:s',$date_fin);
  37. }
  38. else
  39. $c = $set;
  40. include_spip('inc/modifier');
  41. agenda_action_revision_evenement($id_evenement, $c);
  42. agenda_action_revision_evenement_mots($id_evenement, _request('mots',$set));
  43. agenda_action_revision_evenement_repetitions($id_evenement,_request('repetitions',$set), _request('mots',$set));
  44. // Modification de statut, changement de rubrique ?
  45. $c = array();
  46. foreach (array(
  47. 'id_parent'
  48. ) as $champ)
  49. $c[$champ] = _request($champ,$set);
  50. $err .= agenda_action_instituer_evenement($id_evenement, $c);
  51. return $err;
  52. }
  53. function agenda_action_revision_evenement_repetitions($id_evenement,$repetitions="",$liste_mots=array()){
  54. include_spip('inc/filtres');
  55. $repetitions = preg_split(",[^0-9\-\/],",$repetitions);
  56. // gestion des repetitions
  57. $rep = array();
  58. foreach($repetitions as $date){
  59. if (strlen($date)){
  60. $date = recup_date($date);
  61. if ($date=mktime(0,0,0,$date[1],$date[2],$date[0]))
  62. $rep[] = $date;
  63. }
  64. }
  65. agenda_action_update_repetitions($id_evenement, $rep, $liste_mots);
  66. }
  67. function agenda_action_update_repetitions($id_evenement,$repetitions,$liste_mots){
  68. // evenement source
  69. if ($row = sql_fetsel("*", "spip_evenements","id_evenement=".intval($id_evenement))){
  70. $titre = $row['titre'];
  71. $descriptif = $row['descriptif'];
  72. $horaire = $row['horaire'];
  73. $lieu = $row['lieu'];
  74. $adresse = $row['adresse'];
  75. $date_debut = strtotime($row['date_debut']);
  76. $date_fin = strtotime($row['date_fin']);
  77. $duree = $date_fin - $date_debut;
  78. $id_evenement_source = $row['id_evenement_source'];
  79. $id_article = $row['id_article'];
  80. $inscription = $row['inscription'];
  81. $places = $row['places'];
  82. if ($id_evenement_source!=0)
  83. return; // pas un evenement source donc rien a faire ici
  84. $repetitions_updated = array();
  85. // mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu
  86. $res = sql_select("id_evenement,date_debut","spip_evenements","id_evenement_source=".sql_quote($id_evenement));
  87. while ($row = sql_fetch($res)){
  88. $date = strtotime(date('Y-m-d',strtotime($row['date_debut'])));
  89. if (in_array($date,$repetitions)){
  90. // il est maintenu, on l'update
  91. $repetitions_updated[] = $date;
  92. $update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
  93. $update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
  94. // TODO : prendre en charge la mise a jour uniquement si conforme a l'original
  95. $update_titre = $titre;
  96. $update_descriptif = $descriptif;
  97. $update_lieu = $lieu;
  98. $update_adresse = $adresse;
  99. $update_inscription = $inscription;
  100. $update_places = $places;
  101. // mettre a jour l'evenement
  102. sql_updateq('spip_evenements',
  103. array(
  104. "titre" => $update_titre,
  105. "descriptif" => $update_descriptif,
  106. "lieu" => $update_lieu,
  107. "adresse" => $update_adresse,
  108. "horaire" => $horaire,
  109. "date_debut" => $update_date_debut,
  110. "date_fin" => $update_date_fin,
  111. "inscription" => $update_inscription,
  112. "places" => $update_places,
  113. "id_article" => $id_article),"id_evenement=".intval($row['id_evenement']));
  114. agenda_action_revision_evenement_mots($row['id_evenement'], $liste_mots);
  115. }
  116. else {
  117. // il est supprime
  118. sql_delete("spip_mots_evenements","id_evenement=".$row['id_evenement']);
  119. sql_delete("spip_evenements","id_evenement=".$row['id_evenement']);
  120. }
  121. }
  122. // regarder les repetitions a ajouter
  123. foreach($repetitions as $date){
  124. if (!in_array($date,$repetitions_updated)){
  125. $update_date_debut = date('Y-m-d',$date)." ".date('H:i:s',$date_debut);
  126. $update_date_fin = date('Y-m-d H:i:s',strtotime($update_date_debut)+$duree);
  127. $update_titre = $titre;
  128. $update_descriptif = $descriptif;
  129. $update_lieu = $lieu;
  130. $update_adresse = $adresse;
  131. $update_inscription = $inscription;
  132. $update_places = $places;
  133. if ($id_evenement_new = agenda_action_insert_evenement($id_article,$id_evenement)) {
  134. // mettre a jour l'evenement
  135. sql_updateq('spip_evenements',
  136. array(
  137. "titre" => $update_titre,
  138. "descriptif" => $update_descriptif,
  139. "lieu" => $update_lieu,
  140. "adresse" => $update_adresse,
  141. "horaire" => $horaire,
  142. "date_debut" => $update_date_debut,
  143. "date_fin" => $update_date_fin,
  144. "inscription" => $update_inscription,
  145. "places" => $update_places,
  146. "id_article" => $id_article),"id_evenement=".intval($id_evenement_new));
  147. agenda_action_revision_evenement_mots($id_evenement_new, $liste_mots);
  148. }
  149. }
  150. }
  151. }
  152. }
  153. function agenda_action_revision_evenement_mots($id_evenement,$liste_mots){
  154. // suppression des mots obsoletes
  155. $cond_in = $cond_not_in = "";
  156. if (count($liste_mots)){
  157. $cond_not_in = sql_in('id_mot', join(',',$liste_mots), 'NOT');
  158. $cond_in = sql_in('id_mot', join(',',$liste_mots));
  159. }
  160. sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement) . ($cond_in?" AND ".$cond_not_in:""));
  161. $liste_deja = array();
  162. if ($cond_in)
  163. $liste_deja = sql_allfetsel("id_mot", "spip_mots_evenements", "id_evenement=".intval($id_evenement) . " AND $cond_in");
  164. if (count($liste_deja)) {
  165. $cond_not_in = sql_in('id_mot', join(',',array_map('reset',$liste_deja)), 'NOT');
  166. $liste_mots = sql_allfetsel('id_mot','spip_mots',"$cond_in AND $cond_not_in");
  167. $liste_mots = array_map('reset',$liste_mots);
  168. }
  169. if (count($liste_mots)) {
  170. $ins = array();
  171. foreach($liste_mots as $k=>$id_mot)
  172. $ins[] = array('id_evenement'=>$id_evenement,'id_mot'=>$id_mot);
  173. sql_insertq_multi("spip_mots_evenements", $ins);
  174. }
  175. }
  176. // creer un nouvel evenement
  177. function agenda_action_insert_evenement($id_article,$id_evenement_source = 0){
  178. include_spip('inc/autoriser');
  179. if (!autoriser('creerevenementdans','article',$id_article)){
  180. 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');
  181. return false;
  182. }
  183. // nouvel evenement
  184. $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)));
  185. if (!$id_evenement){
  186. spip_log("agenda action formulaire article : impossible d'ajouter un evenement",'agenda');
  187. return false;
  188. }
  189. return $id_evenement;
  190. }
  191. // Enregistre une revision d'evenement
  192. function agenda_action_revision_evenement ($id_evenement, $c=false) {
  193. if ($c['id_parent']) {
  194. // Si l'article est publie, invalider les caches et demander sa reindexation
  195. $t = sql_getfetsel("statut", "spip_articles", "id_article=".intval($c['id_parent']));
  196. if ($t == 'publie') {
  197. $invalideur = "id='id_article/$id_article'";
  198. $indexation = true;
  199. }
  200. }
  201. modifier_contenu('evenement', $id_evenement,
  202. array(
  203. 'nonvide' => array('titre' => _T('info_sans_titre')),
  204. 'invalideur' => $invalideur,
  205. 'indexation' => $indexation
  206. ),
  207. $c);
  208. return ''; // pas d'erreur
  209. }
  210. // $c est un array ('statut', 'id_parent' = changement de rubrique)
  211. function agenda_action_instituer_evenement($id_evenement, $c) {
  212. include_spip('inc/autoriser');
  213. include_spip('inc/modifier');
  214. $row = sql_fetsel("id_article", "spip_evenements", "id_evenement=".intval($id_evenement));
  215. $id_parent = $row['id_article'];
  216. $champs = array();
  217. if (!autoriser('modifier', 'article', $id_parent)
  218. OR (!autoriser('modifier', 'article', $c['id_parent']))){
  219. spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
  220. return false;
  221. }
  222. // Verifier que la rubrique demandee existe et est differente
  223. // de la rubrique actuelle
  224. if ($c['id_parent']
  225. AND $c['id_parent'] != $id_parent
  226. AND (sql_fetsel('1', "spip_articles", "id_article=".intval($c['id_parent'])))) {
  227. $champs['id_article'] = $c['id_parent'];
  228. }
  229. // Envoyer aux plugins
  230. $champs = pipeline('pre_edition',
  231. array(
  232. 'args' => array(
  233. 'table' => 'spip_evenements',
  234. 'id_objet' => $id_evenement
  235. ),
  236. 'data' => $champs
  237. )
  238. );
  239. if (!count($champs)) return;
  240. // Envoyer les modifs sur l'evenement et toutes ses repetitons
  241. $ids = array_map('reset',sql_allfetsel('id_evenement','spip_evenements','id_evenement_source='.intval($id_evenement)));
  242. $ids[] = intval($id_evenement);
  243. sql_updateq('spip_evenements',$champs,sql_in('id_evenement',$ids));
  244. // Invalider les caches
  245. include_spip('inc/invalideur');
  246. suivre_invalideur("id='id_article/$id_parent'");
  247. suivre_invalideur("id='id_article/".$champs['id_article']."'");
  248. // Pipeline
  249. pipeline('post_edition',
  250. array(
  251. 'args' => array(
  252. 'table' => 'spip_evenements',
  253. 'id_objet' => $id_evenement
  254. ),
  255. 'data' => $champs
  256. )
  257. );
  258. // Notifications
  259. if ($notifications = charger_fonction('notifications', 'inc')) {
  260. $notifications('instituerevenement', $id_evenement,
  261. array('id_parent' => $champs['id_article'], 'id_parent_ancien' => $id_parent)
  262. );
  263. }
  264. return ''; // pas d'erreur
  265. }
  266. function agenda_action_supprime_repetitions($supp_evenement){
  267. $res = sql_select("id_evenement", "spip_evenements", "id_evenement_source=".intval($supp_evenement));
  268. while ($row = sql_fetch($res)){
  269. $id_evenement = $row['id_evenement'];
  270. sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
  271. sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
  272. }
  273. }
  274. function agenda_action_supprime_evenement($id_article,$supp_evenement){
  275. $id_evenement = sql_getfetsel("id_evenement", "spip_evenements", array(
  276. "id_article=" . intval($id_article),
  277. "id_evenement=" . intval($supp_evenement)));
  278. if (intval($id_evenement) AND $id_evenement == $supp_evenement){
  279. sql_delete("spip_mots_evenements", "id_evenement=".intval($id_evenement));
  280. sql_delete("spip_evenements", "id_evenement=".intval($id_evenement));
  281. agenda_action_supprime_repetitions($id_evenement);
  282. }
  283. include_spip('inc/invalideur');
  284. suivre_invalideur("article/$id_article");
  285. $id_evenement = 0;
  286. return $id_evenement;
  287. }
  288. ?>