system_announcements.lib.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <?php
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2004-2008 Dokeos SPRL
  6. Copyright (c) 2003 Ghent University (UGent)
  7. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  8. Copyright (c) 2004 Bart Mollet (HoGent)
  9. For a full list of contributors, see "credits.txt".
  10. The full license can be read in "license.txt".
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15. See the GNU General Public License for more details.
  16. Contact address: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium
  17. Mail: info@dokeos.com
  18. ==============================================================================
  19. */
  20. define('VISIBLE_GUEST', 1);
  21. define('VISIBLE_STUDENT', 2);
  22. define('VISIBLE_TEACHER', 3);
  23. /**
  24. ==============================================================================
  25. * This is the system announcements library for Dokeos.
  26. *
  27. * @package dokeos.library
  28. ==============================================================================
  29. */
  30. class SystemAnnouncementManager
  31. {
  32. /**
  33. * Displays all announcements
  34. * @param int $visible VISIBLE_GUEST, VISIBLE_STUDENT or VISIBLE_TEACHER
  35. * @param int $id The identifier of the announcement to display
  36. */
  37. function display_announcements($visible, $id = -1)
  38. {
  39. $user_selected_language = api_get_interface_language();
  40. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  41. $sql = "SELECT *, DATE_FORMAT(date_start,'%d-%m-%Y') AS display_date FROM ".$db_table." WHERE (lang='$user_selected_language' OR lang IS NULL) AND ((NOW() BETWEEN date_start AND date_end) OR date_end='0000-00-00') ";
  42. switch ($visible)
  43. {
  44. case VISIBLE_GUEST :
  45. $sql .= " AND visible_guest = 1 ";
  46. break;
  47. case VISIBLE_STUDENT :
  48. $sql .= " AND visible_student = 1 ";
  49. break;
  50. case VISIBLE_TEACHER :
  51. $sql .= " AND visible_teacher = 1 ";
  52. break;
  53. }
  54. $sql .= " ORDER BY date_start DESC LIMIT 0,7";
  55. $announcements = api_sql_query($sql,__FILE__,__LINE__);
  56. if (Database::num_rows($announcements))
  57. {
  58. $query_string = ereg_replace('announcement=[1-9]+', '', $_SERVER['QUERY_STRING']);
  59. $query_string = ereg_replace('&$', '', $query_string);
  60. $url = api_get_self();
  61. echo '<div class="system_announcements">';
  62. echo '<h3>'.get_lang('SystemAnnouncements').'</h3>';
  63. echo '<table border="0">';
  64. while ($announcement = Database::fetch_object($announcements))
  65. {
  66. if ($id != $announcement->id)
  67. {
  68. if (strlen($query_string) > 0)
  69. {
  70. $show_url = 'newsList.php#'.$announcement->id;
  71. //$show_url = $url.'?'.$query_string.'&announcement='.$announcement->id;
  72. }
  73. else
  74. {
  75. $show_url = 'newsList.php#'.$announcement->id;
  76. //$show_url = $url.'?announcement='.$announcement->id;
  77. }
  78. echo '<tr class="system_announcement">
  79. <td width="80px" valign="top" class="system_announcement_title">'
  80. .$announcement->display_date.'
  81. </td>
  82. <td valign="top">
  83. <a name="ann'.$announcement->id.'" href="'.$show_url.'">'.$announcement->title.'</a>
  84. </td>
  85. </tr>';
  86. }
  87. else
  88. {
  89. echo '<div class="system_announcement">
  90. <div class="system_announcement_title">'
  91. .$announcement->display_date.'
  92. <a name="ann'.$announcement->id.'" href="'.$url.'?'.$query_string.'#ann'.$announcement->id.'">'.$announcement->title.'</a>
  93. </div>
  94. <div class="system_announcement_content">'
  95. .$announcement->content.'
  96. </div>';
  97. }
  98. }
  99. /*echo '<tr><td height="15px"></td></tr>';*/
  100. echo '<tr><td colspan="2">';
  101. echo '<a href="newsList.php">'.get_lang("More").'</a>';
  102. echo '</td></tr>';
  103. echo '</table>';
  104. echo '</div>';
  105. }
  106. return;
  107. }
  108. function display_all_announcements($visible, $id = -1,$start = 0,$user_id)
  109. {
  110. $user_selected_language = api_get_interface_language();
  111. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  112. $sql = "SELECT *, DATE_FORMAT(date_start,'%d-%m-%Y') AS display_date FROM ".$db_table."
  113. WHERE (lang='$user_selected_language' OR lang IS NULL) AND ((NOW() BETWEEN date_start AND date_end) OR date_end='0000-00-00')";
  114. switch ($visible)
  115. {
  116. case VISIBLE_GUEST :
  117. $sql .= " AND visible_guest = 1 ";
  118. break;
  119. case VISIBLE_STUDENT :
  120. $sql .= " AND visible_student = 1 ";
  121. break;
  122. case VISIBLE_TEACHER :
  123. $sql .= " AND visible_teacher = 1 ";
  124. break;
  125. }
  126. if(!isset($_GET['start']) || $_GET['start'] == 0)
  127. {
  128. $sql .= " ORDER BY date_start DESC LIMIT ".$start.",20";
  129. }
  130. else
  131. {
  132. $sql .= " ORDER BY date_start DESC LIMIT ".($start+1).",20";
  133. }
  134. $announcements = api_sql_query($sql,__FILE__,__LINE__);
  135. if (Database::num_rows($announcements))
  136. {
  137. $query_string = ereg_replace('announcement=[1-9]+', '', $_SERVER['QUERY_STRING']);
  138. $query_string = ereg_replace('&$', '', $query_string);
  139. $url = api_get_self();
  140. echo '<div class="system_announcements">';
  141. echo '<h3>'.get_lang('SystemAnnouncements').'</h3>';
  142. echo '<table align="center">';
  143. echo '<tr>';
  144. echo '<td>';
  145. SystemAnnouncementManager :: display_fleche($user_id);
  146. echo '</td>';
  147. echo '</tr>';
  148. echo '</table>';
  149. echo '<table align="center" border="0" width="900px">';
  150. while ($announcement = Database::fetch_object($announcements))
  151. {
  152. echo '<tr><td>';
  153. echo '<a name="'.$announcement->id.'"></a>
  154. <div class="system_announcement">
  155. <div class="system_announcement_title">'
  156. .$announcement->display_date.' <strong>'.$announcement->title.'</strong>
  157. </div>
  158. <br />
  159. <div class="system_announcement_content">'
  160. .$announcement->content.'
  161. </div>
  162. </div>
  163. <br />
  164. <hr noshade size="1">';
  165. echo '</tr></td>';
  166. }
  167. echo '</table>';
  168. echo '<table align="center">';
  169. echo '<tr>';
  170. echo '<td>';
  171. SystemAnnouncementManager :: display_fleche($user_id);
  172. echo '</td>';
  173. echo '</tr>';
  174. echo '</table>';
  175. echo '</div>';
  176. }
  177. return;
  178. }
  179. function display_fleche($user_id)
  180. {
  181. $start = (int)$_GET['start'];
  182. $nb_announcement = SystemAnnouncementManager :: count_nb_announcement($start,$user_id);
  183. $next = ((int)$_GET['start']+19);
  184. $prev = ((int)$_GET['start']-19);
  185. if(!isset($_GET['start']) || $_GET['start'] == 0)
  186. {
  187. if($nb_announcement > 20)
  188. {
  189. echo '<a href="newsList.php?start='.$next.'">'.get_lang('NextBis').' >> </a>';
  190. }
  191. }
  192. else
  193. {
  194. echo '<a href="newsList.php?start='.$prev.'"> << '.get_lang('Prev').'</a>';
  195. if($nb_announcement > 20)
  196. {
  197. echo '<a href="newsList.php?start='.$next.'">'.get_lang('NextBis').' >> </a>';
  198. }
  199. }
  200. }
  201. function count_nb_announcement($start = 0,$user_id = '')
  202. {
  203. $visibility = api_is_allowed_to_create_course() ? VISIBLE_TEACHER : VISIBLE_STUDENT;
  204. $user_selected_language = api_get_interface_language();
  205. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  206. $sql = 'SELECT id
  207. FROM '.$db_table.'
  208. WHERE (lang="'.$user_selected_language.'" OR lang IS NULL) ';
  209. if (isset($user_id))
  210. {
  211. switch ($visibility)
  212. {
  213. case VISIBLE_GUEST :
  214. $sql .= " AND visible_guest = 1 ";
  215. break;
  216. case VISIBLE_STUDENT :
  217. $sql .= " AND visible_student = 1 ";
  218. break;
  219. case VISIBLE_TEACHER :
  220. $sql .= " AND visible_teacher = 1 ";
  221. break;
  222. }
  223. }
  224. $sql .= 'LIMIT '.$start.',21';
  225. $announcements = api_sql_query($sql,__FILE__,__LINE__);
  226. $i = 0;
  227. while($rows = Database::fetch_array($announcements))
  228. {
  229. $i++;
  230. }
  231. return $i;
  232. }
  233. /**
  234. * Get all announcements
  235. * @return array An array with all available system announcements (as php
  236. * objects)
  237. */
  238. function get_all_announcements()
  239. {
  240. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  241. $sql = "SELECT *, IF( NOW() BETWEEN date_start AND date_end, '1', '0') AS visible FROM ".$db_table." ORDER BY date_start ASC";
  242. $announcements = api_sql_query($sql,__FILE__,__LINE__);
  243. $all_announcements = array();
  244. while ($announcement = Database::fetch_object($announcements))
  245. {
  246. $all_announcements[] = $announcement;
  247. }
  248. return $all_announcements;
  249. }
  250. /**
  251. * Adds an announcement to the database
  252. * @param string $title Title of the announcement
  253. * @param string $content Content of the announcement
  254. * @param string $date_start Start date (YYYY-MM-DD HH:II: SS)
  255. * @param string $date_end End date (YYYY-MM-DD HH:II: SS)
  256. */
  257. function add_announcement($title, $content, $date_start, $date_end, $visible_teacher = 0, $visible_student = 0, $visible_guest = 0, $lang = null, $send_mail=0)
  258. {
  259. $a_dateS = explode(' ',$date_start);
  260. $a_arraySD = explode('-',$a_dateS[0]);
  261. $a_arraySH = explode(':',$a_dateS[1]);
  262. $date_start = array_merge($a_arraySD,$a_arraySH);
  263. $a_dateE = explode(' ',$date_end);
  264. $a_arrayED = explode('-',$a_dateE[0]);
  265. $a_arrayEH = explode(':',$a_dateE[1]);
  266. $date_end = array_merge($a_arrayED,$a_arrayEH);
  267. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  268. if (!checkdate($date_start[1], $date_start[2], $date_start[0]))
  269. {
  270. Display :: display_normal_message(get_lang('InvalidStartDate'));
  271. return false;
  272. }
  273. if (($date_end[1] || $date_end[2] || $date_end[0]) && !checkdate($date_end[1], $date_end[2], $date_end[0]))
  274. {
  275. Display :: display_normal_message(get_lang('InvalidEndDate'));
  276. return false;
  277. }
  278. if( strlen(trim($title)) == 0)
  279. {
  280. Display::display_normal_message(get_lang('InvalidTitle'));
  281. return false;
  282. }
  283. $start = $date_start[0]."-".$date_start[1]."-".$date_start[2]." ".$date_start[3].":".$date_start[4].":".$date_start[5];
  284. $end = $date_end[0]."-".$date_end[1]."-".$date_end[2]." ".$date_end[3].":".$date_end[4].":".$date_start[5];
  285. $title = Database::escape_string($title);
  286. $content = Database::escape_string($content);
  287. $lang = is_null($lang) ? 'NULL' : "'".Database::escape_string($lang)."'";
  288. $sql = "INSERT INTO ".$db_table." (title,content,date_start,date_end,visible_teacher,visible_student,visible_guest, lang)
  289. VALUES ('".$title."','".$content."','".$start."','".$end."','".$visible_teacher."','".$visible_student."','".$visible_guest."',".$lang.")";
  290. if ($send_mail==1)
  291. {
  292. SystemAnnouncementManager::send_system_announcement_by_email($title, $content,$visible_teacher, $visible_student);
  293. }
  294. return api_sql_query($sql,__FILE__,__LINE__);
  295. }
  296. /**
  297. * Updates an announcement to the database
  298. * @param integer $id : id of the announcement
  299. * @param string $title : title of the announcement
  300. * @param string $content : content of the announcement
  301. * @param array $date_start: start date of announcement (0 => day ; 1 => month ; 2 => year ; 3 => hour ; 4 => minute)
  302. * @param array $date_end : end date of announcement (0 => day ; 1 => month ; 2 => year ; 3 => hour ; 4 => minute)
  303. */
  304. function update_announcement($id, $title, $content, $date_start, $date_end, $visible_teacher = 0, $visible_student = 0, $visible_guest = 0,$lang=null, $send_mail=0)
  305. {
  306. $a_dateS = explode(' ',$date_start);
  307. $a_arraySD = explode('-',$a_dateS[0]);
  308. $a_arraySH = explode(':',$a_dateS[1]);
  309. $date_start = array_merge($a_arraySD,$a_arraySH);
  310. $a_dateE = explode(' ',$date_end);
  311. $a_arrayED = explode('-',$a_dateE[0]);
  312. $a_arrayEH = explode(':',$a_dateE[1]);
  313. $date_end = array_merge($a_arrayED,$a_arrayEH);
  314. $lang = is_null($lang) ? 'NULL' : "'".Database::escape_string($lang)."'";
  315. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  316. if (!checkdate($date_start[1], $date_start[2], $date_start[0]))
  317. {
  318. Display :: display_normal_message(get_lang('InvalidStartDate'));
  319. return false;
  320. }
  321. if (($date_end[1] || $date_end[2] || $date_end[0]) && !checkdate($date_end[1], $date_end[2], $date_end[0]))
  322. {
  323. Display :: display_normal_message(get_lang('InvalidEndDate'));
  324. return false;
  325. }
  326. if( strlen(trim($title)) == 0)
  327. {
  328. Display::display_normal_message(get_lang('InvalidTitle'));
  329. return false;
  330. }
  331. $start = $date_start[0]."-".$date_start[1]."-".$date_start[2]." ".$date_start[3].":".$date_start[4].":".$date_start[5];
  332. $end = $date_end[0]."-".$date_end[1]."-".$date_end[2]." ".$date_end[3].":".$date_end[4].":".$date_start[5];
  333. $title = Database::escape_string($title);
  334. $content = Database::escape_string($content);
  335. $id = intval($id);
  336. $sql = "UPDATE ".$db_table." SET lang=$lang,title='".$title."',content='".$content."',date_start='".$start."',date_end='".$end."', ";
  337. $sql .= " visible_teacher = '".$visible_teacher."', visible_student = '".$visible_student."', visible_guest = '".$visible_guest."' WHERE id='".$id."'";
  338. if ($send_mail==1)
  339. {
  340. SystemAnnouncementManager::send_system_announcement_by_email($title, $content,$visible_teacher, $visible_student);
  341. }
  342. return api_sql_query($sql,__FILE__,__LINE__);
  343. }
  344. /**
  345. * Deletes an announcement
  346. * @param integer $id The identifier of the announcement that should be
  347. * deleted
  348. */
  349. function delete_announcement($id)
  350. {
  351. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  352. $id = intval($id);
  353. $sql = "DELETE FROM ".$db_table." WHERE id='".$id."'";
  354. return api_sql_query($sql,__FILE__,__LINE__);
  355. }
  356. /**
  357. * Gets an announcement
  358. * @param integer $id The identifier of the announcement that should be
  359. * deleted
  360. */
  361. function get_announcement($id)
  362. {
  363. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  364. $id = intval($id);
  365. $sql = "SELECT * FROM ".$db_table." WHERE id='".$id."'";
  366. $announcement = Database::fetch_object(api_sql_query($sql,__FILE__,__LINE__));
  367. return $announcement;
  368. }
  369. /**
  370. * Change the visibility of an announcement
  371. * @param integer $announcement_id
  372. * @param integer $user For who should the visibility be changed (possible
  373. * values are VISIBLE_TEACHER, VISIBLE_STUDENT, VISIBLE_GUEST)
  374. */
  375. function set_visibility($announcement_id, $user, $visible)
  376. {
  377. $db_table = Database :: get_main_table(TABLE_MAIN_SYSTEM_ANNOUNCEMENTS);
  378. $field = ($user == VISIBLE_TEACHER ? 'visible_teacher' : ($user == VISIBLE_STUDENT ? 'visible_student' : 'visible_guest'));
  379. $sql = "UPDATE ".$db_table." SET ".$field." = '".$visible."' WHERE id='".$announcement_id."'";
  380. return api_sql_query($sql,__FILE__,__LINE__);
  381. }
  382. function send_system_announcement_by_email($title,$content,$teacher, $student)
  383. {
  384. global $_user;
  385. global $_setting;
  386. global $charset;
  387. $user_table = Database :: get_main_table(TABLE_MAIN_USER);
  388. if ($teacher<>0 AND $student == '0')
  389. {
  390. $sql = "SELECT * FROM $user_table WHERE email<>'' AND status = '1'";
  391. }
  392. if ($teacher == '0' AND $student <> '0')
  393. {
  394. $sql = "SELECT * FROM $user_table WHERE email<>'' AND status = '5'";
  395. }
  396. if ($teacher<>'0' AND $student <> '0')
  397. {
  398. $sql = "SELECT * FROM $user_table WHERE email<>''";
  399. }
  400. if ($teacher == '0' AND $student == '0')
  401. {
  402. return true;
  403. }
  404. $result = api_sql_query($sql,__FILE__,__LINE__);
  405. while($row = Database::fetch_array($result,'ASSOC'))
  406. {
  407. api_mail_html($row['firstname'].' '.$row['lastname'], $row['email'], html_entity_decode(stripslashes($title),ENT_QUOTES,$charset), html_entity_decode(stripslashes($content),ENT_QUOTES,$charset), $_user['firstName'].' '.$_user['lastName'], api_get_setting('emailAdministrator'), api_get_setting('emailAdministrator'));
  408. }
  409. }
  410. }
  411. ?>