我成功使用PHP的Google Calendar API库创建事件,但是我想在插入创建Google日历时希望与会者接收电子邮件通知,如何在我的代码中放入sendNotifications参数?
google-calendar.api.php
<?php
class GoogleCalendarApi
{
public function GetAccessToken($client_id, $redirect_uri, $client_secret, $code) {
$url = 'https://accounts.google.com/o/oauth2/token';
$curlPost = 'client_id=' . $client_id . '&redirect_uri=' . $redirect_uri . '&client_secret=' . $client_secret . '&code='. $code . '&grant_type=authorization_code';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
$data = json_decode(curl_exec($ch), true);
$http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($http_code != 200)
throw new Exception('Error : Failed to receieve access token');
return $data;
}
public function GetUserCalendarTimezone($access_token) {
$url_settings = 'https://www.googleapis.com/calendar/v3/users/me/settings/timezone';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_settings);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '. $access_token));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = json_decode(curl_exec($ch), true); //echo '<pre>';print_r($data);echo '</pre>';
$http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($http_code != 200)
throw new Exception('Error : Failed to get timezone');
return $data['value'];
}
public function GetCalendarsList($access_token) {
$url_parameters = array();
$url_parameters['fields'] = 'items(id,summary,timeZone)';
$url_parameters['minAccessRole'] = 'owner';
$url_calendars = 'https://www.googleapis.com/calendar/v3/users/me/calendarList?'. http_build_query($url_parameters);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_calendars);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '. $access_token));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = json_decode(curl_exec($ch), true); //echo '<pre>';print_r($data);echo '</pre>';
$http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($http_code != 200)
throw new Exception('Error : Failed to get calendars list');
return $data['items'];
}
public function CreateCalendarEvent($calendar_id, $summary, $all_day, $event_time, $event_attendees, $event_timezone, $access_token) {
$url_events = 'https://www.googleapis.com/calendar/v3/calendars/' . $calendar_id . '/events';
$curlPost = array('summary' => $summary);
$curlPost['attendees'] = $event_attendees;
if($all_day == 1) {
$curlPost['start'] = array('date' => $event_time['event_date']);
$curlPost['end'] = array('date' => $event_time['event_date']);
}
else {
$curlPost['start'] = array('dateTime' => $event_time['start_time'], 'timeZone' => $event_timezone);
$curlPost['end'] = array('dateTime' => $event_time['end_time'], 'timeZone' => $event_timezone);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_events);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '. $access_token, 'Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($curlPost));
$data = json_decode(curl_exec($ch), true);
$http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($http_code != 200)
throw new Exception('Error : Failed to create event');
return $data['id'];
}
}
?>
ajax.php
<?php
session_start();
header('Content-type: application/json');
require_once('google-calendar-api.php');
try {
// Get event details
$event = $_POST['event_details'];
$capi = new GoogleCalendarApi();
// Get user calendar timezone
$user_timezone = $capi->GetUserCalendarTimezone($_SESSION['access_token']);
// Create event on primary calendar
$event_id = $capi->CreateCalendarEvent('primary', $event['title'], $event['all_day'], $event['event_time'], $event['attendees'], $user_timezone, $_SESSION['access_token']);
echo json_encode([ 'event_id' => $event_id ]);
}
catch(Exception $e) {
header('Bad Request', true, 400);
echo json_encode(array( 'error' => 1, 'message' => $e->getMessage() ));
}
?>
home.php
<?php
session_start();
if(!isset($_SESSION['access_token'])) {
header('Location: google-login.php');
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.1.9/jquery.datetimepicker.min.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.1.9/jquery.datetimepicker.min.js"></script>
<style type="text/css">
#form-container {
width: 400px;
margin: 100px auto;
}
input[type="text"] {
border: 1px solid rgba(0, 0, 0, 0.15);
font-family: inherit;
font-size: inherit;
padding: 8px;
border-radius: 0px;
outline: none;
display: block;
margin: 0 0 20px 0;
width: 100%;
box-sizing: border-box;
}
select {
border: 1px solid rgba(0, 0, 0, 0.15);
font-family: inherit;
font-size: inherit;
padding: 8px;
border-radius: 2px;
display: block;
width: 100%;
box-sizing: border-box;
outline: none;
background: none;
margin: 0 0 20px 0;
}
.input-error {
border: 1px solid red !important;
}
#event-date {
display: none;
}
#create-event {
background: none;
width: 100%;
display: block;
margin: 0 auto;
border: 2px solid #2980b9;
padding: 8px;
background: none;
color: #2980b9;
cursor: pointer;
}
</style>
</head>
<body>
<div id="form-container">
<input type="text" id="event-title" placeholder="Event Title" autocomplete="off" />
<select id="event-type" autocomplete="off">
<option value="FIXED-TIME">Fixed Time Event</option>
<option value="ALL-DAY">All Day Event</option>
</select>
<input type="text" id="event-start-time" placeholder="Event Start Time" autocomplete="off" />
<input type="text" id="event-end-time" placeholder="Event End Time" autocomplete="off" />
<input type="text" id="event-date" placeholder="Event Date" autocomplete="off" />
<input type="text" id="event-attendees" placeholder="Event Attendee" autocomplete="off" />
<button id="create-event">Create Event</button>
</div>
<script>
// Selected time should not be less than current time
function AdjustMinTime(ct) {
var dtob = new Date(),
current_date = dtob.getDate(),
current_month = dtob.getMonth() + 1,
current_year = dtob.getFullYear();
var full_date = current_year + '-' +
( current_month < 10 ? '0' + current_month : current_month ) + '-' +
( current_date < 10 ? '0' + current_date : current_date );
if(ct.dateFormat('Y-m-d') == full_date)
this.setOptions({ minTime: 0 });
else
this.setOptions({ minTime: false });
}
// DateTimePicker plugin : http://xdsoft.net/jqplugins/datetimepicker/
$("#event-start-time, #event-end-time").datetimepicker({ format: 'Y-m-d H:i', minDate: 0, minTime: 0, step: 5, onShow: AdjustMinTime, onSelectDate: AdjustMinTime });
$("#event-date").datetimepicker({ format: 'Y-m-d', timepicker: false, minDate: 0 });
$("#event-type").on('change', function(e) {
if($(this).val() == 'ALL-DAY') {
$("#event-date").show();
$("#event-start-time, #event-end-time").hide();
}
else {
$("#event-date").hide();
$("#event-start-time, #event-end-time").show();
}
});
// Send an ajax request to create event
$("#create-event").on('click', function(e) {
if($("#create-event").attr('data-in-progress') == 1)
return;
var blank_reg_exp = /^([\s]{0,}[^\s]{1,}[\s]{0,}){1,}$/,
error = 0,
parameters;
$(".input-error").removeClass('input-error');
if(!blank_reg_exp.test($("#event-title").val())) {
$("#event-title").addClass('input-error');
error = 1;
}
if($("#event-type").val() == 'FIXED-TIME') {
if(!blank_reg_exp.test($("#event-start-time").val())) {
$("#event-start-time").addClass('input-error');
error = 1;
}
if(!blank_reg_exp.test($("#event-end-time").val())) {
$("#event-end-time").addClass('input-error');
error = 1;
}
}
else if($("#event-type").val() == 'ALL-DAY') {
if(!blank_reg_exp.test($("#event-date").val())) {
$("#event-date").addClass('input-error');
error = 1;
}
}
if(error == 1)
return false;
if($("#event-type").val() == 'FIXED-TIME') {
// If end time is earlier than start time, then interchange them
if($("#event-end-time").datetimepicker('getValue') < $("#event-start-time").datetimepicker('getValue')) {
var temp = $("#event-end-time").val();
$("#event-end-time").val($("#event-start-time").val());
$("#event-start-time").val(temp);
}
}
// Event details
parameters = { title: $("#event-title").val(),
event_time: {
start_time: $("#event-type").val() == 'FIXED-TIME' ? $("#event-start-time").val().replace(' ', 'T') + ':00' : null,
end_time: $("#event-type").val() == 'FIXED-TIME' ? $("#event-end-time").val().replace(' ', 'T') + ':00' : null,
event_date: $("#event-type").val() == 'ALL-DAY' ? $("#event-date").val() : null
},
'attendees': [
{'email': $("#event-attendees").val()},
],
all_day: $("#event-type").val() == 'ALL-DAY' ? 1 : 0,
sendNotifications: true,
};
$("#create-event").attr('disabled', 'disabled');
$.ajax({
type: 'POST',
url: 'ajax.php',
data: { event_details: parameters },
dataType: 'json',
success: function(response) {
$("#create-event").removeAttr('disabled');
alert('Event created with ID : ' + response.event_id);
},
error: function(response) {
$("#create-event").removeAttr('disabled');
alert(response.responseJSON.message);
}
});
});
</script>
</body>
</html>
我可以在哪里放置sendNotifications参数? 谢谢