PageRenderTime 40ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/_plugins_/agenda_proposer_evenement/formulaires/proposer_evenement.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 300 lines | 207 code | 47 blank | 46 comment | 34 complexity | e3d577ee39250b01e6616422d7125842 MD5 | raw file
  1. <?php
  2. /*
  3. * Plugin Proposer Evenement
  4. * (c) 2010 Cedric Morin
  5. * Distribue sous licence GPL
  6. *
  7. */
  8. function propevent_rubrique(){
  9. $rubrique = lire_config('propevent/rubrique');
  10. while (count($rubrique)
  11. AND $t=array_shift($rubrique)
  12. AND $t = explode('|',$t)
  13. AND reset($t)!=='rubrique');
  14. $id_rubrique = 0;
  15. if (reset($t)=='rubrique')
  16. $id_rubrique = intval(end($t));
  17. return $id_rubrique;
  18. }
  19. /**
  20. * Charger le formulaire de proposition d'evenement
  21. * @return mixed
  22. */
  23. function formulaires_proposer_evenement_charger_dist(){
  24. // verifier que le plugin est configure
  25. if (!function_exists('lire_config')
  26. OR !lire_config('propevent/rubrique')
  27. OR !lire_config('propevent/etat_contribution'))
  28. return false;
  29. $valeurs = array(
  30. 'nom'=>'',
  31. 'prenom'=>'',
  32. 'email'=>'',
  33. 'telephone'=>'',
  34. 'titre'=>'',
  35. 'descriptif'=>'',
  36. 'texte'=>'',
  37. 'horaire'=>'',
  38. 'date_debut'=>'',
  39. 'heure_debut'=>'',
  40. 'date_fin'=>'',
  41. 'heure_fin'=>'',
  42. 'lieu'=>'',
  43. 'id_categorie'=>'',
  44. 'mots'=>'',
  45. 'id_rubrique' => propevent_rubrique(),
  46. );
  47. return $valeurs;
  48. }
  49. /**
  50. * Verifier le numero de telephone, tire du plugin verifier
  51. * @param string $valeur
  52. * @param array $options
  53. * @return string
  54. */
  55. function verifier_telephone_fr($valeur, $options=array()){
  56. $erreur = _T('propevent:erreur_telephone');
  57. $ok = '';
  58. // On accepte differentes notations, les points, les tirets, les espaces, les slashes
  59. $tel = preg_replace("#\.|/|-| #i",'',$valeur);
  60. // On interdit les 000 etc. mais je pense qu'on peut faire plus malin
  61. // TODO finaliser les numéros à la con
  62. if($tel == '0000000000') return $erreur;
  63. if(!preg_match("/^0[0-9]{9}$/",$tel)) return $erreur;
  64. return $ok;
  65. }
  66. /**
  67. * Verifier toute la saisie
  68. *
  69. * @return array
  70. */
  71. function formulaires_proposer_evenement_verifier_dist(){
  72. $erreurs = array();
  73. $oblis = array('nom','email','titre','descriptif','texte','date_debut','date_fin');
  74. if (lire_config('propevent/proposer_thematique')=='oui')
  75. $oblis[] = 'id_categorie';
  76. $horaire = _request('horaire')=='non'?false:true;
  77. if ($horaire){
  78. $oblis[] = 'heure_debut';
  79. $oblis[] = 'heure_fin';
  80. }
  81. if (!_request('mots') OR !trim(implode('',_request('mots'))))
  82. $oblis[] = 'lieu';
  83. foreach($oblis as $obli){
  84. if (!_request($obli))
  85. $erreurs[$obli] = _T('info_obligatoire');
  86. }
  87. if ($email = _request('email') AND !email_valide($email)){
  88. $erreurs['email'] = _T('form_email_non_valide');
  89. }
  90. if ($tel = _request('telephone') AND $err = verifier_telephone_fr($tel))
  91. $erreurs['telephone'] = $err;
  92. include_spip('inc/agenda_gestion');
  93. if (_request('date_debut'))
  94. $date_debut = agenda_verifier_corriger_date_saisie('debut',$horaire,$erreurs);
  95. if (_request('date_fin'))
  96. $date_fin = agenda_verifier_corriger_date_saisie('fin',$horaire,$erreurs);
  97. if ($date_debut AND $date_fin AND $date_fin<$date_debut)
  98. $erreurs['date_fin'] = _T('agenda:erreur_date_avant_apres');
  99. if (_request('antibot') OR _request('bot')!=="Je suis un humain")
  100. $erreurs['message_erreur'] = _T('propevent:erreur_no_bot');
  101. include_spip('base/abstract_sql');
  102. // controler la saisie de la categorie
  103. // protection contre hack
  104. if ($id = _request('id_categorie')
  105. AND (intval(sql_getfetsel("id_parent", "spip_rubriques", "id_rubrique=".intval($id)))!==propevent_rubrique())){
  106. $erreurs['id_categorie'] = _T('propevent:erreur_categorie_interdite');
  107. }
  108. // controler la saisie des mots
  109. // protection contre hack
  110. if ($mots = _request('mots')){
  111. $mots = array_map('intval',$mots);
  112. $mots = array_diff($mots,array(0));
  113. $verif = sql_allfetsel('id_mot', "spip_mots", array(sql_in("id_groupe",lire_config('propevent/groupes')),sql_in('id_mot',$mots)));
  114. $verif = array_map('reset',$verif);
  115. $verif = array_map('intval',$verif);
  116. if (count(array_diff($mots, $verif)) OR count(array_diff($verif, $mots)))
  117. $erreurs['message_erreur'] = _T('propevent:erreur_mots_cles_interdits');
  118. }
  119. if (count($erreurs) AND !isset($erreurs['message_erreur']))
  120. $erreurs['message_erreur'] = _T('propevent:erreurs_verifier');
  121. return $erreurs;
  122. }
  123. function formulaires_proposer_evenement_traiter_dist(){
  124. include_spip('base/abstract_sql');
  125. $res = array();
  126. $set_article = array(
  127. 'titre' => _request('titre'),
  128. #'chapo' => _request('descriptif'),
  129. 'texte' => _request('texte'),
  130. 'statut' => lire_config('propevent/etat_contribution'),
  131. );
  132. $id_auteur = propevent_retrouver_auteur(_request('nom'),_request('prenom'),_request('email'),_request('telephone'));
  133. // si l'auteur n'a pu etre cree, indiquons ses infos dans le PS
  134. // c'est un pis aller au cas ou
  135. if (is_string($id_auteur)){
  136. $set_article['ps'] = "Propose par : $id_auteur";
  137. $id_auteur = 0;
  138. }
  139. $id_rubrique = intval(propevent_rubrique());
  140. if ($id = intval(_request('id_categorie')))
  141. $id_rubrique = $id;
  142. include_spip('action/editer_article');
  143. include_spip('inc/autoriser');
  144. autoriser_exception('creerarticledans', 'rubrique', $id_rubrique);
  145. if ($id_article = insert_article($id_rubrique)){
  146. // enlever le lien auteur_article cree a tort !
  147. sql_delete("spip_auteurs_articles", "id_article=".intval($id_article));
  148. // autoriser la modif par auteur anonyme
  149. autoriser_exception('modifier', 'article', $id_article);
  150. if ($set_article['statut']=='publie'){
  151. autoriser_exception('publierdans', 'rubrique', $id_rubrique);
  152. }
  153. // vilain hack pour SPIP 2.0 ...
  154. foreach($set_article as $k=>$v)
  155. set_request($k,$v);
  156. articles_set($id_article, $set_article);
  157. // associer l'auteur
  158. if ($id_auteur){
  159. include_spip('action/editer_auteurs');
  160. ajouter_auteur_et_rediriger('article', $id_article, $id_auteur, '');
  161. }
  162. // creer l'evenement qui va avec !
  163. // en commencant par autoriser a titre derogatoire
  164. autoriser_exception('creerevenementdans','article',$id_article);
  165. include_spip('action/editer_evenement');
  166. if ($id_evenement = agenda_action_insert_evenement($id_article)){
  167. $set = array('titre' => $set_article['titre']);
  168. $set['horaire'] = _request('horaire')=='non'?'non':'oui';
  169. include_spip('inc/agenda_gestion');
  170. $date_debut = agenda_verifier_corriger_date_saisie('debut',$set['horaire']=='oui',$erreurs);
  171. $date_fin = agenda_verifier_corriger_date_saisie('fin',$set['horaire']=='oui',$erreurs);
  172. $set['date_debut'] = date('Y-m-d H:i:s',$date_debut);
  173. $set['date_fin'] = date('Y-m-d H:i:s',$date_fin);
  174. $set['descriptif'] = _request('descriptif');
  175. $set['mots'] = _request('mots');
  176. action_evenement_set($id_evenement,$set);
  177. // succes
  178. if ($set_article['statut']=='publie')
  179. $res['message_ok'] = _T('propevent:ok_proposition_publiee_moderation_posteriori');
  180. else
  181. $res['message_ok'] = _T('propevent:ok_proposition_attente_moderation');
  182. $res['id_article'] = $id_article;
  183. $res['id_evenement'] = $id_evenement;
  184. // notifier
  185. propevent_email_confirmation(_request('email'),$id_article,$id_evenement,$id_auteur);
  186. }
  187. else
  188. $res['message_erreur'] = _T('propevent:erreur_enregistrement_evenement_impossible');
  189. }
  190. else
  191. $res['message_erreur'] = _T('propevent:erreur_enregistrement_article_impossible');
  192. return $res;
  193. }
  194. function propevent_retrouver_auteur($nom,$prenom,$email,$telephone){
  195. include_spip('base/abstract_sql');
  196. // retrouver l'auteur sur la foi du mail
  197. if (!$auteur = sql_fetsel("*",'spip_auteurs','email='.sql_quote($email))){
  198. // il n'existe pas, on le cree en visiteur, sans login ni pass
  199. $id_auteur = sql_insertq('spip_auteurs', array('nom'=>"$nom $prenom",'bio'=>"Tel : $telephone",'email'=>$email,'statut'=>'6forum','source'=>'spip'));
  200. if (!$id_auteur){
  201. spip_log('Creation auteur impossible, enregistrement dans l\'article');
  202. return "$nom $prenom / $email / Tel : $telephone";
  203. }
  204. $auteur = sql_fetsel("*", "spip_auteurs", "id_auteur=".intval($id_auteur));
  205. }
  206. $id_auteur = intval($auteur['id_auteur']);
  207. // verifier si les infos sont a jour
  208. // si c'est un visiteur, sinon on le laisse maitre de ses infos
  209. if ($auteur['statut']=='6forum'){
  210. $set = array();
  211. if ($auteur['nom']!=="$nom $prenom"){
  212. $set['nom'] = "$nom $prenom";
  213. }
  214. if ($telephone AND trim($auteur['bio'])!=="Tel : $telephone"){
  215. $set['bio'] = "Tel : $telephone";
  216. }
  217. if (count($set))
  218. sql_updateq("spip_auteurs", $set, "id_auteur=".intval($id_auteur));
  219. }
  220. return $id_auteur;
  221. }
  222. function propevent_email_confirmation($email,$id_article,$id_evenement,$id_auteur){
  223. if (!charger_fonction("notifications", "inc",true) OR !function_exists("notifications_envoyer_mails"))
  224. return;
  225. $article = sql_fetsel("*", "spip_articles", "id_article=".intval($id_article));
  226. $event = sql_fetsel("*", "spip_evenements", "id_evenement=".intval($id_evenement));
  227. $auteur = sql_fetsel("*", "spip_auteurs", "id_auteur=".intval($id_auteur));
  228. $parauteur = $auteur?
  229. (_T('forum_par_auteur', array('auteur' => $auteur['nom'])) .
  230. ($auteur['email'] ? ' <' . $auteur['email'] . '>' : '')):'';
  231. $contexte = array(
  232. 'titre' => $article['titre'],
  233. 'descriptif' => $article['chapo'],
  234. 'texte' => $article['texte'],
  235. 'statut' => $article['statut'],
  236. 'par_auteur' => $parauteur,
  237. 'date_debut' => $event['date_debut'],
  238. 'date_fin' => $event['date_fin'],
  239. 'horaire' => $event['horaire'],
  240. 'lieu' => $event['lieu'],
  241. 'mots' => array_map('reset',sql_allfetsel("id_mot", "spip_mots_evenements", "id_evenement=".intval($id_evenement))),
  242. 'theme' => lire_config('propevent/proposer_thematique')?sql_getfetsel("titre", "spip_rubriques", "id_rubrique=".intval($article['id_rubrique'])):'',
  243. );
  244. $contexte['url_moderation'] = url_absolue(generer_url_entite($id_article, 'article', '', '', false));
  245. // envoyer a celui qui a propose
  246. $corps = recuperer_fond("notifications/evenement_propose",$contexte);
  247. notifications_envoyer_mails($email,$corps);
  248. // envoyer aux modos !
  249. $corps_modo = recuperer_fond("notifications/evenement_propose_modo",$contexte);
  250. $email_modo = lire_config('propevent/email_moderateur');
  251. notifications_envoyer_mails($email_modo,$corps_modo);
  252. }
  253. ?>