123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- <?php
- /* For licensing terms, see /license.txt */
- /**
- * Announcement Email.
- *
- * @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Geneva
- * @author Julio Montoya <gugli100@gmail.com> Adding session support
- */
- class AnnouncementEmail
- {
- public $session_id = null;
- public $logger;
- protected $course = null;
- protected $announcement = null;
- /**
- * @param array $courseInfo
- * @param int $sessionId
- * @param int $announcementId
- * @param \Monolog\Logger $logger
- */
- public function __construct($courseInfo, $sessionId, $announcementId, $logger = null)
- {
- if (empty($courseInfo)) {
- $courseInfo = api_get_course_info();
- }
- $this->course = $courseInfo;
- $this->session_id = empty($sessionId) ? api_get_session_id() : (int) $sessionId;
- if (is_numeric($announcementId)) {
- $this->announcement = AnnouncementManager::get_by_id($courseInfo['real_id'], $announcementId);
- }
- $this->logger = $logger;
- }
- /**
- * Course info.
- *
- * @param string $key
- *
- * @return string|null
- */
- public function course($key = '')
- {
- $result = $key ? $this->course[$key] : $this->course;
- $result = $key == 'id' ? intval($result) : $result;
- return $result;
- }
- /**
- * Announcement info.
- *
- * @param string $key
- *
- * @return array
- */
- public function announcement($key = '')
- {
- $result = $key ? $this->announcement[$key] : $this->announcement;
- $result = $key == 'id' ? intval($result) : $result;
- return $result;
- }
- /**
- * Returns either all course users or all session users depending on whether
- * session is turned on or not.
- *
- * @return array
- */
- public function all_users()
- {
- $courseCode = $this->course('code');
- if (empty($this->session_id)) {
- $group_id = api_get_group_id();
- if (empty($group_id)) {
- $userList = CourseManager::get_user_list_from_course_code($courseCode);
- } else {
- $userList = GroupManager::get_users($group_id);
- $new_user_list = [];
- foreach ($userList as $user) {
- $new_user_list[] = ['user_id' => $user];
- }
- $userList = $new_user_list;
- }
- } else {
- $userList = CourseManager::get_user_list_from_course_code(
- $courseCode,
- $this->session_id
- );
- }
- return $userList;
- }
- /**
- * Returns users and groups an announcement item has been sent to.
- *
- * @return array Array of users and groups to whom the element has been sent
- */
- public function sent_to_info()
- {
- $result = [];
- $result['groups'] = [];
- $result['users'] = [];
- $table = Database::get_course_table(TABLE_ITEM_PROPERTY);
- $tool = TOOL_ANNOUNCEMENT;
- $id = $this->announcement('id');
- $course_id = $this->course('real_id');
- $sessionCondition = api_get_session_condition($this->session_id);
- $sql = "SELECT to_group_id, to_user_id
- FROM $table
- WHERE
- c_id = $course_id AND
- tool = '$tool' AND
- ref = $id
- $sessionCondition";
- $rs = Database::query($sql);
- while ($row = Database::fetch_array($rs, 'ASSOC')) {
- // if to_user_id <> 0 then it is sent to a specific user
- $user_id = $row['to_user_id'];
- if (!empty($user_id)) {
- $result['users'][] = (int) $user_id;
- // If user is set then skip the group
- continue;
- }
- // if to_group_id is null then it is sent to a specific user
- // if to_group_id = 0 then it is sent to everybody
- $group_id = $row['to_group_id'];
- if (!empty($group_id)) {
- $result['groups'][] = (int) $group_id;
- }
- }
- return $result;
- }
- /**
- * Returns the list of user info to which an announcement was sent.
- * This function returns a list of actual users even when recipient
- * are groups.
- *
- * @return array
- */
- public function sent_to()
- {
- $sent_to = $this->sent_to_info();
- $users = $sent_to['users'];
- $users = $users ? $users : [];
- $groups = $sent_to['groups'];
- if ($users) {
- $users = UserManager::get_user_list_by_ids($users, true);
- }
- if (!empty($groups)) {
- $groupUsers = GroupManager::get_groups_users($groups);
- $groupUsers = UserManager::get_user_list_by_ids($groupUsers, true);
- if (!empty($groupUsers)) {
- $users = array_merge($users, $groupUsers);
- }
- }
- if (empty($users)) {
- if (!empty($this->logger)) {
- $this->logger->addInfo('User list is empty. No users found. Trying all_users()');
- }
- $users = self::all_users();
- }
- // Clean users just in case
- $newListUsers = [];
- if (!empty($users)) {
- foreach ($users as $user) {
- $newListUsers[$user['user_id']] = ['user_id' => $user['user_id']];
- }
- }
- return $newListUsers;
- }
- /**
- * Email subject.
- *
- * @param bool $directMessage
- *
- * @return string
- */
- public function subject($directMessage = false)
- {
- if ($directMessage) {
- $result = $this->announcement('title');
- } else {
- $result = $this->course('title').' - '.$this->announcement('title');
- }
- $result = stripslashes($result);
- return $result;
- }
- /**
- * Email message.
- *
- * @param int $receiverUserId
- *
- * @return string
- */
- public function message($receiverUserId)
- {
- $content = $this->announcement('content');
- $session_id = $this->session_id;
- $courseCode = $this->course('code');
- $content = AnnouncementManager::parseContent(
- $receiverUserId,
- $content,
- $courseCode,
- $session_id
- );
- // Build the link by hand because api_get_cidreq() doesn't accept course params
- $course_param = 'cidReq='.$courseCode.'&id_session='.$session_id.'&gidReq='.api_get_group_id();
- $course_name = $this->course('title');
- $result = "<div>$content</div>";
- // Adding attachment
- $attachment = $this->attachment();
- if (!empty($attachment)) {
- $result .= '<br />';
- $result .= Display::url(
- $attachment['filename'],
- api_get_path(WEB_CODE_PATH).'announcements/download.php?file='.basename($attachment['path']).'&'.$course_param
- );
- $result .= '<br />';
- }
- $result .= '<hr />';
- $userInfo = api_get_user_info();
- if (!empty($userInfo)) {
- $result .= '<a href="mailto:'.$userInfo['mail'].'">'.$userInfo['complete_name'].'</a><br/>';
- }
- $result .= '<a href="'.api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.$course_param.'">'.$course_name.'</a><br/>';
- return $result;
- }
- /**
- * Returns the one file that can be attached to an announcement.
- *
- * @return array
- */
- public function attachment()
- {
- $result = [];
- $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
- $id = $this->announcement('id');
- $course_id = $this->course('real_id');
- $sql = "SELECT * FROM $table
- WHERE c_id = $course_id AND announcement_id = $id ";
- $rs = Database::query($sql);
- $course_path = $this->course('directory');
- while ($row = Database::fetch_array($rs)) {
- $path = api_get_path(SYS_COURSE_PATH).$course_path.'/upload/announcements/'.$row['path'];
- $filename = $row['filename'];
- $result[] = ['path' => $path, 'filename' => $filename];
- }
- $result = $result ? reset($result) : [];
- return $result;
- }
- /**
- * Send announcement by email to myself.
- */
- public function sendAnnouncementEmailToMySelf()
- {
- $userId = api_get_user_id();
- $subject = $this->subject();
- $message = $this->message($userId);
- MessageManager::send_message_simple(
- $userId,
- $subject,
- $message,
- api_get_user_id(),
- false,
- true
- );
- }
- /**
- * Send emails to users.
- *
- * @param bool $sendToUsersInSession
- * @param bool $sendToDrhUsers send a copy of the message to the DRH users
- * @param int $senderId related to the main user
- * @param bool $directMessage
- *
- * @return array
- */
- public function send($sendToUsersInSession = false, $sendToDrhUsers = false, $senderId = 0, $directMessage = false)
- {
- $senderId = empty($senderId) ? api_get_user_id() : (int) $senderId;
- $subject = $this->subject($directMessage);
- // Send email one by one to avoid antispam
- $users = $this->sent_to();
- $batchSize = 20;
- $counter = 1;
- $em = Database::getManager();
- if (empty($users) && !empty($this->logger)) {
- $this->logger->addInfo('User list is empty. No emails will be sent.');
- }
- $messageSentTo = [];
- foreach ($users as $user) {
- $message = $this->message($user['user_id']);
- $wasSent = MessageManager::messageWasAlreadySent($senderId, $user['user_id'], $subject, $message);
- if ($wasSent === false) {
- if (!empty($this->logger)) {
- $this->logger->addInfo(
- 'Announcement: #'.$this->announcement('id').'. Send email to user: #'.$user['user_id']
- );
- }
- $messageSentTo[] = $user['user_id'];
- MessageManager::send_message_simple(
- $user['user_id'],
- $subject,
- $message,
- $senderId,
- $sendToDrhUsers,
- true
- );
- } else {
- if (!empty($this->logger)) {
- $this->logger->addInfo(
- 'Message "'.$subject.'" was already sent. Announcement: #'.$this->announcement('id').'.
- User: #'.$user['user_id']
- );
- }
- }
- if (($counter % $batchSize) === 0) {
- $em->flush();
- $em->clear();
- }
- $counter++;
- }
- if ($sendToUsersInSession) {
- $sessionList = SessionManager::get_session_by_course($this->course['real_id']);
- if (!empty($sessionList)) {
- foreach ($sessionList as $sessionInfo) {
- $sessionId = $sessionInfo['id'];
- $message = $this->message(null);
- $userList = CourseManager::get_user_list_from_course_code(
- $this->course['code'],
- $sessionId
- );
- if (!empty($userList)) {
- foreach ($userList as $user) {
- $messageSentTo[] = $user['user_id'];
- MessageManager::send_message_simple(
- $user['user_id'],
- $subject,
- $message,
- $senderId,
- false,
- true
- );
- }
- }
- }
- }
- }
- $this->logMailSent();
- $messageSentTo = array_unique($messageSentTo);
- return $messageSentTo;
- }
- /**
- * Store that emails where sent.
- */
- public function logMailSent()
- {
- $id = $this->announcement('id');
- $courseId = $this->course('real_id');
- $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
- $sql = "UPDATE $table SET
- email_sent = 1
- WHERE
- c_id = $courseId AND
- id = $id AND
- session_id = {$this->session_id}
- ";
- Database::query($sql);
- }
- }
|