system_announcements.lib.php 15 KB

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