/** * Subsitute the placeholders in message templates for the actual data * * Expects the following parameters in the $data object: * - datetimeknown * - details * - discountcost * - duration * - normalcost * - sessiondates * * @access public * @param string $msg Email message * @param string $facetofacename F2F name * @param obj $user The subject of the message * @param obj $data Session data * @param int $sessionid Session ID * @return string */ function facetoface_message_substitutions($msg, $coursename, $facetofacename, $user, $data, $sessionid) { global $CFG, $DB; if (empty($msg)) { return ''; } if ($data->datetimeknown) { // Scheduled session $alldates = ''; foreach ($data->sessiondates as $date) { if ($alldates != '') { $alldates .= "\n"; } $startdate = userdate($date->timestart, get_string('strftimedate'), $date->sessiontimezone); $finishdate = userdate($date->timefinish, get_string('strftimedate'), $date->sessiontimezone); if ($startdate == $finishdate) { $alldates .= $startdate . ', '; } else { $alldates .= $startdate . ' - ' . $finishdate . ', '; } $starttime = userdate($date->timestart, get_string('strftimetime'), $date->sessiontimezone); $finishtime = userdate($date->timefinish, get_string('strftimetime'), $date->sessiontimezone); $timestr = $starttime . ' - ' . $finishtime . ' ' . $date->sessiontimezone; $alldates .= $timestr; } $startdate = userdate($data->sessiondates[0]->timestart, get_string('strftimedate'), $date->sessiontimezone); $finishdate = userdate($data->sessiondates[0]->timefinish, get_string('strftimedate'), $date->sessiontimezone); $sessiondate = ($startdate == $finishdate) ? $startdate : $startdate . ' - ' . $finishdate; $starttime = userdate($data->sessiondates[0]->timestart, get_string('strftimetime'), $date->sessiontimezone); $finishtime = userdate($data->sessiondates[0]->timefinish, get_string('strftimetime'), $date->sessiontimezone); } else { // Wait-listed session $startdate = get_string('unknowndate', 'facetoface'); $finishdate = get_string('unknowndate', 'facetoface'); $sessiondate = get_string('unknowndate', 'facetoface'); $alldates = get_string('unknowndate', 'facetoface'); $starttime = get_string('unknowntime', 'facetoface'); $finishtime = get_string('unknowntime', 'facetoface'); } $msg = str_replace(get_string('placeholder:coursename', 'facetoface'), $coursename, $msg); $msg = str_replace(get_string('placeholder:facetofacename', 'facetoface'), $facetofacename, $msg); $msg = str_replace(get_string('placeholder:firstname', 'facetoface'), $user->firstname, $msg); $msg = str_replace(get_string('placeholder:lastname', 'facetoface'), $user->lastname, $msg); $msg = str_replace(get_string('placeholder:cost', 'facetoface'), facetoface_cost($user->id, $sessionid, $data), $msg); $msg = str_replace(get_string('placeholder:alldates', 'facetoface'), $alldates, $msg); $msg = str_replace(get_string('placeholder:sessiondate', 'facetoface'), $sessiondate, $msg); $msg = str_replace(get_string('placeholder:startdate', 'facetoface'), $startdate, $msg); $msg = str_replace(get_string('placeholder:finishdate', 'facetoface'), $finishdate, $msg); $msg = str_replace(get_string('placeholder:starttime', 'facetoface'), $starttime, $msg); $msg = str_replace(get_string('placeholder:finishtime', 'facetoface'), $finishtime, $msg); $msg = str_replace(get_string('placeholder:duration', 'facetoface'), format_duration($data->duration), $msg); // add placeholders that somehow have been forgetten since moodle $roomnull = 'N/A'; // Displayed if empty. // Defaults if values are empty $strlocation = $roomnull; $strvenue = $roomnull; $strroom = $roomnull; if ($room = facetoface_get_session_room($sessionid)) { $strlocation = isset($room->address) ? $room->address : $roomnull; $strvenue = isset($room->building) ? $room->building : $roomnull; $strroom = isset($room->name) ? $room->name : $roomnull; } $msg = str_replace(get_string('placeholder:location', 'facetoface'), $strlocation, $msg); $msg = str_replace(get_string('placeholder:venue', 'facetoface'), $strvenue, $msg); $msg = str_replace(get_string('placeholder:room', 'facetoface'), $strroom, $msg); if (empty($data->details)) { $msg = str_replace(get_string('placeholder:details', 'facetoface'), '', $msg); } else { $msg = str_replace(get_string('placeholder:details', 'facetoface'), html_to_text($data->details), $msg); } // Replace more meta data $attendees_url = new moodle_url('/mod/facetoface/attendees.php', array('s' => $sessionid, 'action' => 'approvalrequired')); $link = html_writer::link($attendees_url, $attendees_url, array('title' => get_string('attendees', 'facetoface'))); $msg = str_replace(get_string('placeholder:attendeeslink', 'facetoface'), $link, $msg); if (strstr($msg, get_string('placeholder:reminderperiod', 'facetoface'))) { // Handle the legacy reminderperiod placeholder. $reminderperiod = $DB->get_field('facetoface_notification', 'MAX(scheduleamount)', array('facetofaceid' => $data->facetoface, 'conditiontype' => MDL_F2F_CONDITION_BEFORE_SESSION, 'scheduleunit' => MDL_F2F_SCHEDULE_UNIT_DAY, 'status' => 1), IGNORE_MULTIPLE); $reminderperiod = empty($reminderperiod) ? 0 : $reminderperiod; $msg = str_replace(get_string('placeholder:reminderperiod', 'facetoface'), $reminderperiod, $msg); } // Custom session fields (they look like "session:shortname" in the templates) $customfields = facetoface_get_session_customfields(); $customdata = $DB->get_records('facetoface_session_data', array('sessionid' => $sessionid), '', 'fieldid, data'); foreach ($customfields as $field) { $placeholder = "[session:{$field->shortname}]"; $value = ''; if (!empty($customdata[$field->id])) { if (CUSTOMFIELD_TYPE_MULTISELECT == $field->type) { $value = str_replace(CUSTOMFIELD_DELIMITER, ', ', $customdata[$field->id]->data); } else { $value = $customdata[$field->id]->data; } } $msg = str_replace($placeholder, $value, $msg); } return $msg; }
/** * Returns the ICAL data for a facetoface meeting. * * @param integer $method The method, @see {{MDL_F2F_INVITE}} * @return stdClass Object that contains a filename in dataroot directory and ical template */ function facetoface_get_ical_attachment($method, $facetoface, $session, $user) { global $CFG, $DB; // Get user object if only id is given $user = (is_object($user) ? $user : $DB->get_record('user', array('id' => $user))); // First, generate all the VEVENT blocks $VEVENTS = ''; foreach ($session->sessiondates as $date) { // Date that this representation of the calendar information was created - // we use the time the session was created // http://www.kanzaki.com/docs/ical/dtstamp.html $DTSTAMP = facetoface_ical_generate_timestamp($session->timecreated); // UIDs should be globally unique $urlbits = parse_url($CFG->wwwroot); $sql = "SELECT COUNT(*) FROM {facetoface_signups} su INNER JOIN {facetoface_signups_status} sus ON su.id = sus.signupid WHERE su.userid = ? AND su.sessionid = ? AND sus.superceded = 1 AND sus.statuscode = ? "; $params = array($user->id, $session->id, MDL_F2F_STATUS_USER_CANCELLED); $UID = $DTSTAMP . '-' . substr(md5($CFG->siteidentifier . $session->id . $date->id), -8) . // Unique identifier, salted with site identifier '-' . $DB->count_records_sql($sql, $params) . // New UID if this is a re-signup ;) '@' . $urlbits['host']; // Hostname for this moodle installation $DTSTART = facetoface_ical_generate_timestamp($date->timestart); $DTEND = facetoface_ical_generate_timestamp($date->timefinish); // FIXME: currently we are not sending updates if the times of the // sesion are changed. This is not ideal! $SEQUENCE = ($method & MDL_F2F_CANCEL) ? 1 : 0; $SUMMARY = str_replace("\\n", "\\n ", facetoface_ical_escape($facetoface->name, true)); $icaldescription = get_string('icaldescription', 'facetoface', $facetoface); if (!empty($session->details)) { $icaldescription .= $session->details; } $DESCRIPTION = facetoface_ical_escape($icaldescription, true); // Get the location data from custom fields if they exist $room = facetoface_get_session_room($session->id); $locationstring = ''; if (!empty($room->name)) { $locationstring .= $room->name; } if (!empty($room->building)) { if (!empty($locationstring)) { $locationstring .= "\n"; } $locationstring .= $room->building; } if (!empty($room->address)) { if (!empty($locationstring)) { $locationstring .= "\n"; } $locationstring .= $room->address; } // NOTE: Newlines are meant to be encoded with the literal sequence // '\n'. But evolution presents a single line text field for location, // and shows the newlines as [0x0A] junk. So we switch it for commas // here. Remember commas need to be escaped too. $LOCATION = str_replace('\n', '\, ', facetoface_ical_escape($locationstring)); $ORGANISEREMAIL = get_config(NULL, 'facetoface_fromaddress'); $ROLE = 'REQ-PARTICIPANT'; $CANCELSTATUS = ''; if ($method & MDL_F2F_CANCEL) { $ROLE = 'NON-PARTICIPANT'; $CANCELSTATUS = "\nSTATUS:CANCELLED"; } $icalmethod = ($method & MDL_F2F_INVITE) ? 'REQUEST' : 'CANCEL'; // FIXME: if the user has input their name in another language, we need // to set the LANGUAGE property parameter here $USERNAME = fullname($user); $MAILTO = $user->email; $VEVENTS .= "BEGIN:VEVENT\r\n"; $VEVENTS .= "ORGANIZER;CN={$ORGANISEREMAIL}:MAILTO:{$ORGANISEREMAIL}\r\n"; $VEVENTS .= "DTSTART:{$DTSTART}\r\n"; $VEVENTS .= "DTEND:{$DTEND}\r\n"; $VEVENTS .= "LOCATION:{$LOCATION}\r\n"; $VEVENTS .= "TRANSP:OPAQUE{$CANCELSTATUS}\r\n"; $VEVENTS .= "SEQUENCE:{$SEQUENCE}\r\n"; $VEVENTS .= "UID:{$UID}\r\n"; $VEVENTS .= "DTSTAMP:{$DTSTAMP}\r\n"; $VEVENTS .= "DESCRIPTION:{$DESCRIPTION}\r\n"; $VEVENTS .= "SUMMARY:{$SUMMARY}\r\n"; $VEVENTS .= "PRIORITY:5\r\n"; $VEVENTS .= "CLASS:PUBLIC\r\n"; $VEVENTS .= "ATTENDEE;CUTYPE=INDIVIDUAL;ROLE={$ROLE};PARTSTAT=NEEDS-ACTION;\r\n"; $VEVENTS .= " RSVP=FALSE;CN={$USERNAME};LANGUAGE=en:MAILTO:{$MAILTO}\r\n"; $VEVENTS .= "END:VEVENT\r\n"; } $template = "BEGIN:VCALENDAR\r\n"; $template .= "VERSION:2.0\r\n"; $template .= "PRODID:-//Moodle//NONSGML Facetoface//EN\r\n"; $template .= "METHOD:{$icalmethod}\r\n"; $template .= "{$VEVENTS}"; $template .= "END:VCALENDAR\r\n"; $tempfilename = md5($template); $tempfilepathname = $CFG->dataroot . '/' . $tempfilename; file_put_contents($tempfilepathname, $template); $ical = new stdClass(); $ical->file = $tempfilename; $ical->content = $template; return $ical; }