About Me

我的相片
台北市, Taiwan
我是方選,
方白科技(finebind tech.)共同創辦人,
臺大資管所畢,
希望能幫助更多的人!

FB: http://fb.com/function1122
LINE: http://bit.ly/1foeZft (手機開啟點擊網址自動加入)

最新15則讀者回應

最新文章

FUNction's 上課筆記

Label Cloud

Blog Archive

FeedBurner

追蹤者

[教學] 在PHP 中使用Google Calendar API - END 刪除事件(含補充)

FUNction 於 2008年8月13日 晚上8:43 發表
大綱:透過API 將Google Calendar 上的事件刪除。並補充參考資料與經驗分享
前言
這是最後一篇了,其實刪除真的超簡單的,至於為什麼拖這麼久才出這篇,我只能說:「哀...」。補上我參考的資料以及一些經驗分享吧。

刪除一筆事件
透過事件ID當作參數傳入delete.php ,當刪除成功之後顯示被刪除的事件的title。

刪除事件
請建立delete.php 並加入下列程式碼:

<?php
include('config.inc.php');
$eventId = $_GET['id'];

$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME; // 提供Calendar 的服務名稱
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
$gdataCal = new Zend_Gdata_Calendar($client);

//接下來這邊就是讀取某個事件的方法
$query = $gdataCal->newEventQuery();
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setEvent($eventId);
$eventEntry = $gdataCal->getCalendarEventEntry($query);
$title = $eventEntry->title->text;
$eventEntry->delete();
?>

我們透過getCalendarEventEntry取得某一個事件,之前講過可以用$eventEntry->title->text; 去取得事件的標題(這是等一下要顯示的)。然後這邊調用另一個方法delete(),來刪除事件$eventEntry->delete(); ,就是這麼簡單。

顯示已被刪除的事件標題
接著就更簡單了,剛剛已經把事件標題放入$title 變數了,請在上述程式碼?>之後加入以下html 語法:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FUNction's Lab 讀取Google 行事曆 「<?=$title?>」已刪除</title>
</head>
<body>
[<a href="./">上一頁</a>]
<hr />
<h1><font color="red">事件「<?=$title?>」已刪除!</font></h1>
</body>
</html>

這樣今天的delete 就大功告成了,也是Google Calendar 開發的完結篇了。

經驗分享
接下來,我先講一些這陣子的使用心得與之前沒講到的補充。

title 字串的限制
我發現title 字串幾乎沒有限制。以長度來說,我有曾經建立長度為200 個UTF-8 中文字的事件標題,不會顯示錯誤,更神的事Google 一樣會傳簡訊通知。至於超過200 我沒有試過,如果有更大量的數據也請告訴我。至於格式方面,確定可以使用html 標籤。使用html 標籤後用Google Calendar 檢視事件或是簡訊通知Google 會自動忽略標籤,但用API 一樣可以把標籤讀出來。

簡訊提醒限制
使用簡訊提醒如果設定提醒時間大於60 分鐘會出現不知名的錯誤,在5-60 分鐘內不會有問題。此外,上一篇列出的方法是透過修改事件加入提醒,以下片段程式是直接在建立事件時新增提醒,以供參考:

function createEvent($title, $content, $where, $startTime)
{
global $calendarClient, $calendarId;

$endPart = explode("-", $startTime, 3);
$startTime = $endPart[0].'-'.$endPart[1].'-'.(add0($endPart[2]+1));
$endTime = $endPart[0].'-'.$endPart[1].'-'.(add0($endPart[2]+2));
$calendarURL = "http://www.google.com/calendar/feeds/".urlencode($calendarId)."/private/full";

$gc = new Zend_Gdata_Calendar($calendarClient);
$newEntry = $gc->newEventEntry();

$newEntry->title = $gc->newTitle(trim($title));
$newEntry->where = array($gc->newWhere($where));
$newEntry->content = $gc->newContent($content);
$newEntry->content->type = 'text/html';

$reminder = $gc->newReminder();
$reminder->setMinutes(60);
$reminder->setMethod('sms');

$when = $gc->newWhen();
$when->reminders = array($reminder);
$when->startTime = $startTime."+08:00";
$when->endTime = $endTime."+08:00";

$newEntry->when = array($when);

$createdEntry = $gc->insertEvent($newEntry, $calendarURL);
return basename($createdEntry->id->text);
}

這個function 用2008-08-13 的格式傳入一個開始日期$startTime,會自動建議一整天的事件。其中全域變數$calendarClient 就是這系列教學中的$client 變數,是與Google 的連結。喔,對了,裡面用了一個名為add0() 的function ,這是我自己寫的function ,目的是如果數字為1-9 自動在前面補0 ,不然送到google 會出錯。

透過ID 取得事件
我們知道讀取事件可以使用$query->setEvent($eventId); 取得事件,如果$eventId 值為空,Google 則會預設丟出最後被updated 的事件。

參考資料
我覺得最有用的文章首推Google Calendar API使用心得分享 這篇文章也有一些經驗分享,由淺入深,不論在開發初期還是開發後期都很有幫助。

接下來是Google 官方的文件API Developer's Guide: PHP 但是寫的還是讓人要消化一下才懂,不如直接去下載Zend 的函式庫,在Demo 資料夾中有一個名為calendar.php 的檔案,裡面包著新增、修改、刪除、查詢的function ,看著範例做會好很多。

最後,這裡雖然會用到Zend 但其實和Zend Framework 沒有那麼直接的關係,如果你使用其他的Framework 仍然可以呼叫Zend 的Gdata,這篇文章 可以解答你的疑惑。

結語
到了最後依依不捨的時間了,因為這個單原告一段落啦。這邊我要秀一個我免費接的case ,就是以Google Calendar 為主體的一個網站。這網站的概念是以事件為最基本的元素,使用者可以根據事件評論、建立標籤等等。但網站的核心還是放在Google 的資料庫中。另外,會元的照片是透過Picasa API 傳到Picasa 上,一方面可以減少網站流量,一方面可以便於陳列管理,甚至還可以調用Picasa 的Slideshow,當成會員輪播。網址: http://fjucte.oxyhost.com/index.html

最後,我們來聊聊Google Abuse。我們還可以把Google Calendar 做成自己專屬的留言版,這樣人家有留言還可以讓Google 通知你。或是Abuse 他的簡訊功能,做其他的通知功用...

範例程式下載:GClab.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒) Tags: , , ,

讀者回應 ( 9 意見 )

站長你好,這系列的文章對我幫助很大,非常感謝,在前四部份的文章已經能正常的使用API控制日曆的功能了,但是對於這篇文章的簡訊提醒部份看不懂,範例檔案似乎不見了,能否重新重送一下範例的檔案呢,謝謝

To 庫羅:
謝謝您的鼓勵與指正!範例連結已經修正了,可是我的範例...應該是沒有您要的「發送簡訊」的範例,我想可能比較有問題的是add0()吧!
function add0(num){
return (num < 10 && num >0)?'0'.num:num;
}
哈~以上是我臨時寫的,僅供參考啦^^
如果還有問題歡迎提出,也歡迎交流喔!

站長你好,因為近日需要研究GOOGLE 相關的API 無意間看到您的網站真的讓我獲益良多,但在執行時卻發生下面訊息
Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Unable to Connect to ssl://www.google.com:443. Error #22: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?' in C:\AppServ\www\GClab\library\Zend\Gdata\ClientLogin.php:129 Stack trace: #0 C:\AppServ\www\GClab\new.php(5): Zend_Gdata_ClientLogin::getHttpClient('*****@gmail.c...', '*****', 'cl') #1 {main} thrown in C:\AppServ\www\GClab\library\Zend\Gdata\ClientLogin.php on line 129

不知道這是甚麼樣的問題呢

Error #22: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?'

回覆上面的
應該可以去看一下你的php.ini
檔案中應該有一行
有關php_openssl的被註解掉了

BTW,謝謝站長的文章
讓我獲益良多~

站長 FUNction 您好:

最近想要架一個共用的 Calendar, 但有一個疑惑。

請問要使用 Google Calendar API,對每一個事件(Calendar)是不是都要有一組 Google Account/Password?(I think it's yes.)

所以如果我想要做一個 Calendar 網站給不同的群體使用,比如說幫實驗室A寫一個共用的Seminar Calendar,又幫實驗室B寫一個共用的Seminar Calendar,是不是需要(手動)申請不同的Google Accounts?

也就是說,不能用一個 Google Account 就多個 Calendar?(或是可以但有數量限制?)

我在想如果能寫一個程式(平台)給團體可以共用的專屬 Calendar,那應該滿好用的。
不過如果每一個 Calendar都要申請一個 Google Account,那就比較麻煩了。

不知道我的理解有沒有錯?或其實沒有這麼麻煩?

感謝!

請問站長要如何把標題的字變小阿

不知道為什麼,我使用了刪除功能以後會出現以下的錯誤
可以告訴我該怎麼解決嗎??
Fatal error: Uncaught exception 'Zend_Uri_Exception' with message 'Invalid URI supplied' in D:\wamp\www\GClab\library\Zend\Uri\Http.php:98 Stack trace: #0 D:\wamp\www\GClab\library\Zend\Uri.php(117): Zend_Uri_Http->__construct('http', '//www.google.co...') #1 D:\wamp\www\GClab\library\Zend\Http\Client.php(223): Zend_Uri::factory('http://www.goog...') #2 D:\wamp\www\GClab\library\Zend\Gdata\App.php(281): Zend_Http_Client->setUri('http://www.goog...') #3 D:\wamp\www\GClab\library\Zend\Gdata\App.php(144): Zend_Gdata_App::import('http://www.goog...', Object(Zend_Http_Client), 'Zend_Gdata_Cale...') #4 D:\wamp\www\GClab\library\Zend\Gdata.php(131): Zend_Gdata_App->getEntry('http://www.goog...', 'Zend_Gdata_Cale...') #5 D:\wamp\www\GClab\library\Zend\Gdata\Calendar.php(117): Zend_Gdata->getEntry('http://www.goog...', 'Zend_Gdata_Cale...') #6 D:\wamp\www\GClab\delete.php(15): Zend_Gdata_Calendar->getCalendarEventEntry(Object(Zend_Gdata_Calendar_EventQuery)) #7 {main} thrown in D:\wamp\www\GClab\library\Zend\Uri\Http.php on line 98

function createEvent($title, $content, $where, $startTime)
{
global $calendarClient, $calendarId;

這Code加在那裏

感謝!

謝謝你的詳細解釋... 幫了我很大的忙

張貼留言

如果沒有帳戶,建議使用「名稱/網址」留言喔^^