system_announcements.lib.php 15 KB

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