commit
2fb12b120f
@ -0,0 +1,304 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* Announcement Email |
||||
* |
||||
* @license see /license.txt |
||||
* @author Laurent Opprecht <laurent@opprecht.info> for the Univesity of Geneva |
||||
*/ |
||||
class AnnouncementEmail |
||||
{ |
||||
|
||||
/** |
||||
* |
||||
* @param int|array $course |
||||
* @param int|array $annoucement |
||||
* |
||||
* @return AnnouncementEmail |
||||
*/ |
||||
public static function create($course, $announcement) |
||||
{ |
||||
return new self($course, $announcement); |
||||
} |
||||
|
||||
protected $course = null; |
||||
protected $announcement = null; |
||||
|
||||
function __construct($course, $announcement) |
||||
{ |
||||
if (empty($course)) |
||||
{ |
||||
$course = api_get_course_int_id(); |
||||
$course = CourseManager::get_course_information_by_id($course); |
||||
} |
||||
else if (is_numeric($course)) |
||||
{ |
||||
$course = CourseManager::get_course_information_by_id(intval($course)); |
||||
} |
||||
$this->course = $course; |
||||
|
||||
if (is_numeric($announcement)) |
||||
{ |
||||
$announcement = AnnouncementManager::get_by_id($course['id'], intval($announcement)); |
||||
} |
||||
$this->announcement = $announcement; |
||||
} |
||||
|
||||
/** |
||||
* Course info |
||||
* |
||||
* @param string $key |
||||
* @return array |
||||
*/ |
||||
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() |
||||
{ |
||||
$tbl_user = Database::get_main_table(TABLE_MAIN_USER); |
||||
$tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER); |
||||
$course_code = $this->course('code'); |
||||
$course_code = Database::escape_string($course_code); |
||||
|
||||
if (empty($_SESSION['id_session']) || api_get_setting('use_session_mode') == 'false') |
||||
{ |
||||
$rel_rh = COURSE_RELATION_TYPE_RRHH; |
||||
$sql = "SELECT user.user_id, user.email, user.lastname, user.firstname |
||||
FROM $tbl_course_user, $tbl_user |
||||
WHERE active = 1 AND |
||||
course_code='$course_code' AND |
||||
course_rel_user.user_id = user.user_id AND |
||||
relation_type <> $rel_rh"; |
||||
} |
||||
else |
||||
{ |
||||
$tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); |
||||
$session_id = api_get_session_id(); |
||||
$sql = "SELECT user.user_id, user.email, user.lastname, user.firstname |
||||
FROM $tbl_user |
||||
INNER JOIN $tbl_session_course_user |
||||
ON $tbl_user.user_id = $tbl_session_course_user.id_user AND |
||||
$tbl_session_course_user.course_code = $course_code AND |
||||
$tbl_session_course_user.id_session = $session_id |
||||
WHERE |
||||
active = 1"; |
||||
} |
||||
|
||||
$rs = Database::query($sql); |
||||
|
||||
$result = array(); |
||||
while ($data = Database::fetch_array($rs)) |
||||
{ |
||||
$result[] = $data; |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* 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 = array(); |
||||
$result['groups'] = array(); |
||||
$result['users'] = array(); |
||||
|
||||
$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY); |
||||
$tool = TOOL_ANNOUNCEMENT; |
||||
|
||||
$id = $this->announcement('id'); |
||||
$course_id = $this->course('id'); |
||||
|
||||
$sql = "SELECT to_group_id, to_user_id FROM $tbl_item_property WHERE c_id = $course_id AND tool = '$tool' AND ref=$id"; |
||||
$rs = Database::query($sql); |
||||
|
||||
$sent_to_group = array(); |
||||
$sent_to_user = array(); |
||||
while ($row = Database::fetch_array($rs)) |
||||
{ |
||||
// 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; |
||||
} |
||||
|
||||
// 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; |
||||
} |
||||
} |
||||
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']; |
||||
$groups = $sent_to['groups']; |
||||
|
||||
if (!empty($groups)) |
||||
{ |
||||
$group_users = GroupManager::get_groups_users($groups); |
||||
$group_users = UserManager::get_user_list_by_ids($group_users, true); |
||||
$users = array_merge($users, $group_users); |
||||
} |
||||
if (empty($users)) |
||||
{ |
||||
$users = self::all_users(); |
||||
} |
||||
|
||||
return $users; |
||||
} |
||||
|
||||
/** |
||||
* Sender info |
||||
* |
||||
* @param string $key |
||||
* @return array |
||||
*/ |
||||
public function sender($key = '') |
||||
{ |
||||
global $_user; |
||||
return $key ? $_user[$key] : $_user; |
||||
} |
||||
|
||||
/** |
||||
* Email subject |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function subject() |
||||
{ |
||||
$result = $this->course('title') . ' - ' . $this->announcement('title'); |
||||
$result = stripslashes($result); |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* Email message |
||||
* |
||||
* @return string |
||||
*/ |
||||
public function message() |
||||
{ |
||||
$title = $this->announcement('title'); |
||||
$title = stripslashes($title); |
||||
|
||||
$content = $this->announcement('content'); |
||||
$content = stripslashes($content); |
||||
|
||||
$user_firstname = $this->sender('firstName'); |
||||
$user_lastname = $this->sender('lastName'); |
||||
$user_email = $this->sender('mail'); |
||||
|
||||
$www = api_get_path(WEB_CODE_PATH); |
||||
$course_param = api_get_cidreq(); |
||||
$course_name = $this->course('title'); |
||||
|
||||
$result = ''; |
||||
$result .= "<div>$content</div>"; |
||||
$result .= '--<br/>'; |
||||
$result .= "<a href=\"mailto:$user_email\">$user_firstname $user_lastname</a><br/>"; |
||||
$result .= "<a href=\"$www/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 attachement() |
||||
{ |
||||
$result = array(); |
||||
$tbl_announcement_attachment = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT); |
||||
$id = $this->announcement('id'); |
||||
$course_id = $this->course('id'); |
||||
$sql = "SELECT * FROM $tbl_announcement_attachment 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[] = array('path' => $path, 'filename' => $filename); |
||||
} |
||||
|
||||
$result = $result ? reset($result) : array(); |
||||
return $result; |
||||
} |
||||
|
||||
/** |
||||
* Send emails to users. |
||||
*/ |
||||
public function send() |
||||
{ |
||||
$sender = $this->sender(); |
||||
$sender_name = api_get_person_name($sender['firstName'], $sender['lastName'], null, PERSON_NAME_EMAIL_ADDRESS); |
||||
$sender_email = $sender['mail']; |
||||
|
||||
$subject = $this->subject(); |
||||
$message = $this->message(); |
||||
$attachement = $this->attachement(); |
||||
|
||||
// Send email one by one to avoid antispam |
||||
$users = $this->sent_to(); |
||||
foreach ($users as $user) |
||||
{ |
||||
$recipient_name = api_get_person_name($user['firstname'], $user['lastname'], null, PERSON_NAME_EMAIL_ADDRESS); |
||||
$recipient_email = $user['email']; |
||||
@api_mail_html($recipient_name, $recipient_email, $subject, $message, $sender_name, $sender_email, null, $attachement, true); |
||||
} |
||||
$this->log_mail_sent(); |
||||
} |
||||
|
||||
/** |
||||
* Store that emails where sent |
||||
*/ |
||||
public function log_mail_sent() |
||||
{ |
||||
$id = $this->announcement('id'); |
||||
$course_id = $this->course('id'); |
||||
|
||||
$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT); |
||||
$sql = "UPDATE $tbl_announcement SET email_sent=1 WHERE c_id = $course_id AND id=$id"; |
||||
Database::query($sql); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue