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 - Part 4 新增事件(含提醒)

FUNction 於 2008年7月22日 晚上9:26 發表
大綱:透過API 將事件新增到Google Calendar 上,並設定發生前五分鐘用簡訊提醒
前言
久等了!最近小弟有點低潮,所以這篇拖了一段時間才發出。建立事件我覺得是個最有趣的環節,另外我特別企畫設定成讓Google 發簡訊到你的手機,提醒你事件要開始囉!

新增一筆事件
透過首頁建立事件的表單,將事件傳送到new.php 去建立。建立完成後顯示建立成功的訊息,並將剛剛建立的事件復誦一次。

在首頁建立表單
其實之前的範例包首頁的表單已經打好了,我這邊再做一次是給光是看文章學的人。請在index.php 的 <body>標籤下加入以下html 語法

<form action="new.php" method="post" name="GClab" id="GClab">
<h2>新增事件</h2>
<p>*標題
<input name="title" type="text" id="title" size="20">
<br>
內容
<textarea name="content" cols="60" rows="5" id="content"></textarea>
<br>
地點
<input name="where" type="text" id="where" size="20">
<br>
*開始日期
<input name="startDate" type="text" id="startDate" value="2008-07-13" size="10">
時間
<input name="startTime" type="text" id="startTime" value="17:55" size="6">
<br>
*結束日期
<input name="endDate" type="text" id="endDate" value="2008-07-14" size="10">
時間
<input name="endTime" type="text" id="endTime" value="03:55" size="6">
(請依照範例格式)<br>
<input type="submit" name="Submit" value="送出">
</form>
<hr />

這是一個表單,將事件送到new.php 去處理。

登入Google 服務&接變數
接著我們建立new.php 網頁,並先打入以下程式碼,我相信看系列文章的讀者可以知道一樣是登入Google ,然後我們用$_POST 去取得index.php POST 過來的變數。new.php 接收了事件的標題(title)、地點(where)、內容(content)、開始日期(startDate)、開始時間(startTime)、結束日期(endDate)、結束時間(endTime)等資訊。
<?php
include('config.inc.php');

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

//Title 和when 是必要的欄位,這邊做個防呆
if($_POST['title'] != ''&& $_POST['startDate'] != ''&& $_POST['startTime'] != ''&& $_POST['endDate'] != ''&& $_POST['endTime'] != ''){
$title = $_POST['title'];
$where = $_POST['where'];
$content = $_POST['content'];
$startDate = $_POST['startDate'];
$startTime = $_POST['startTime'];
$endDate = $_POST['endDate'];
$endTime = $_POST['endTime'];
}else{
die("[<a href=\"./\">back</a>]<hr /><b>Warning</b>: Too few arguments.");
}
?>

如果首頁傳過來的變數不足,就顯示Too few arguments. 的警告,die()讓程式不要繼續執行。值得注意的是這邊開始日期與開始時間是分成兩個變數去抓,但是等一下還是會透過程是去處理成一個Google 看的懂的格式(結束時間、日期亦同)。

建立單一事件
請在上述程式碼尾端?>前加入以下程式碼:
$calendarURL="http://www.google.com/calendar/feeds/".urlencode($calendarID)."/private/full";

$newEvent = $gdataCal->newEventEntry();
$newEvent->title = $gdataCal->newTitle($title);
$newEvent->where = array($gdataCal->newWhere($where));
$newEvent->content = $gdataCal->newContent($content);

$when = $gdataCal->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000+08:00";
$when->endTime = "{$endDate}T{$endTime}:00.000+08:00";
$newEvent->when = array($when);

//當上傳事件後,Google 會回傳相同的事件,我們就可以得知這個事件的ID 了
//這裡值得注意的是第二個參數,指定上傳到我第二本日曆
$createdEvent = $gdataCal->insertEvent($newEvent, $calendarURL);

一開始做了一個變數$calendarURL 是因為我想要把事件加入到我第二本日曆,如果沒指定則會預設新增道第一本去。接下來我們就使用他寫好的方法將事件建立成物件,比較需要注意的是startTime 與endTime 的格式,尾端的+08:00 是因為我位在台北,是+8 時區,如果沒有寫時區會亂掉唷。

最後使用insertEvent() 建立事件,第二個參數$calendarURL 是指定新增道的日曆,不寫就會新增到預設日曆。當建立完成後,Google 會把事件回傳到$createdEvent 裡面,所以我們可以用$createdEvent->id->text 去找出事件建立完成後的ID。

建立簡訊提醒
簡訊提醒我故意透過修改事件的方法去新增,這樣也可以體會一下修改的方法。要使用簡訊提醒必須要先讓手機通過Google 的認證,這裡可以參考Google日曆也能寄簡訊通知你的行程事項(SMS) 香腸炒魷魚 這篇文章設定手機,在此就不贅述。請在?>前加入以下程式:
//到這裡已經完成事件的建立了,接著騷包一點讓他來個簡訊提醒吧
//目前網路上的範例提醒不能用,因為他把reminders 打成reminder 了
$query = $gdataCal->newEventQuery();
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setEvent($createdEvent->id->text);
$event = $gdataCal->getCalendarEventEntry($query);
$times = $event->when;
foreach ($times as $when) {
$reminder = $gdataCal->newReminder();
$reminder->setMinutes(5); //五分鐘前提醒我
$reminder->setMethod('sms'); //用簡訊
$when->reminders = array($reminder);
}
$eventNew = $event->save();

這裡要注意的是就連Zend 官網範例與Google 的PHP 範例都把$when->reminders = array($reminder);寫成$when->reminder = array($reminder); 所以範例會有問題。另外提醒除了sms(簡訊)之外,還有email 與alert 。email 會將提醒寄到你的信箱;alert 則是在Google Calendar 上彈出一個javascript 的alert()。最後,這裡使用$event->save();將修改後的事件儲存。

建立網頁顯示
?>後面加入以下html 語法,顯示事件建立成功的訊息,並使用建立成功事件回傳的$createdEvent 顯示建立事件的細節,告知使用者剛剛完成的建立。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FUNction's Lab 讀取Google 行事曆 :: <?=$createdEvent->title->text?></title>
</head>
<body>
[<a href="./">上一頁</a>] [<a href="delete.php?id=<?=basename($createdEvent->id->text)?>">刪除</a>]
<hr />
<h1><font color="red">事件建立成功!</font></h1>
<?php
echo "<h2>" . $createdEvent->title->text . "</h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$createdEvent->content->text."</li>\n";
foreach ($createdEvent->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";//地點
}
foreach ($createdEvent->when as $when) {
echo "\t<li><b>開始時間:</b>" . $when->startTime . "</li>\n";
echo "\t<li><b>結束時間:</b>" . $when->endTime . "</li>\n";
}
echo "\t<li><b>事件ID:</b>".basename($createdEvent->id->text)."</li>\n";
echo "</ul>\n";
?>
</body>
</html>
這邊顯示的方法跟上一篇顯示單一事件如出一轍,我想應該很好明白。

結語
我想今天應該還蠻讓人興奮的,做到這裡已經幾乎可以使用了,只剩下刪除事件。刪除事件是我的最後一篇了,我打算在那篇列出我所參考的資料,希望對持續開法的人能有拋磚引玉的功效。

範例程式下載:GClab-part-4.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件
下一篇[教學] 在PHP 中使用Google Calendar API - END 刪除事件(含補充)
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒)

誠實地想你

FUNction 於 2008年7月18日 晚上10:15 發表
最近聽到這首歌...總會覺得好心痛,因為好像你對我在唱

你...究竟在哪裡呢?
繼續閱讀全文 誠實地想你

[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件

FUNction 於 2008年7月17日 晚上9:40 發表
大綱:透過API 取得Google Calendar 的單獨事件
前言
經過前兩天的練習,樣子已經大概出來了,今天來做檢視單一事件的頁面,我想說不定你已經try 出來了!

檢視單獨事件資訊
我們希望在event.php 這頁列出單獨的事件,為了讓成是抓到事件,所以我們用?id=帶參數傳過去。

登入Google 服務&接變數
請開啟event.php 鍵入以下程式碼(跟上一篇一樣),為一要注意的是我在第二行加入$eventId,是從$_GET變數抓出來的值:
<?phpinclude('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);

try {
$eventEntry = $gdataCal->getCalendarEventEntry($query);
}catch (Zend_Gdata_App_Exception $e) {
die($e);
}

需要注意的是這裡跟上一個範例不同的是使用getCalendarEventEntry 這個方法來讀取事件。我們使用setEvent()傳入$eventId 參數設定查詢事件,如果不給參數預設會抓最後被修改的事件。此外,我在這邊做一個try-catch,這是比較保險的做法,不過其實這裡不加是不會怎樣的。

建立網頁呈現
請接續程式碼,在?>下面加入以下html 語法
<html>
<head>
<meta http-equiv=" content="text/html; charset=utf-8"
<title>FUNction's Lab 讀取Google 行事曆 :: </title>
</head>
<body>
[<a href="./">上一頁</a>] [<a href="delete.php?id=">刪除</a>]
<hr />
</body>


加入PHP 語法
請在<hr />與</body>中加入以下PHP 程式,這裡其實跟上一篇大同小異,只是多讀取了開始時間(startTime)與結束時間(endTime),值得注意的是這兩個值跟地點(where)一樣是用foreach 讀取的。
<?php
echo "<h2>" . $eventEntry->title->text . "</h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$eventEntry->content->text."</li>\n";
foreach ($eventEntry->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";//地點
}
foreach ($eventEntry->when as $when) {
echo "\t<li><b>開始時間:</b>" . $when->startTime . "</li>\n";
echo "\t<li><b>結束時間:</b>" . $when->endTime . "</li>\n";
}
echo "\t<li><b>事件ID:</b>".basename($eventEntry->id->text)."</li>\n";
echo "</ul>\n";
?>
此外,如果要讀取修改的時間,我們可以使用$event->updated->text。

編輯網頁title 與刪除連結
幾乎大功告成了,最後為了使網頁標題能列出事件名稱,我們將
<title>FUNction's Lab 讀取Google 行事曆 :: </title>
修改成
<title>FUNction's Lab 讀取Google 行事曆 :: <?=$eventEntry->title->text?></title>


然後將刪除的連結設定傳入ID,原本如下(刪除在最後一天才會實做):
[<a href="delete.php?id=">刪除</a>]

改成
[<a href="delete.php?id=<?=basename($eventEntry->id->text)?>">刪除</a>]


結語
也許你覺得今天沒有學到很多,反正就凡事起頭難,那是因為你已經跟上了吧。接下來就是比較有趣的新增事件囉,敬請期待啦 :-)

範例程式下載:GClab-part-3.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表
下一篇[教學] 在PHP 中使用Google Calendar API - Part 4 新增事件(含提醒)
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件

[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表

FUNction 於 2008年7月14日 晚上7:07 發表
大綱:透過API 取得Google Calendar 上的事件列表
前言
在建立完config.inc.php 之後,我們來牛刀小試,把我們在Google Calendar 上面建立的事件撈出來吧。

建立事件列表
希望在首頁把所有的事件列出來,所以我們打開GClab 資料夾,在下面建立index.php。

登入Google 服務
請開啟index.php 鍵入以下程式碼:

<?php
include('config.inc.php');

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

第一行是把上一篇的設定檔include 進來,接下來三行是建立Client 登入Google 的服務。到這邊的已先run一下,確定一下自己帳號密碼沒有打錯。

讀取Google Calendar 上的事件
請在上述程式碼尾端加入以下程式,這裡使用getCalendarEventFeed 來讀取多個事件。

//接下來這邊就是讀取某本日曆的方法,據說最多只能列出25筆資料
$query = $gdataCal->newEventQuery();
//原始範例中setUser給的參數是'default' 這樣的話是開啟範例中$client的主日曆
//但由網頁說明中我們可指定User 來開啟任何一本日曆,例如這邊我設定成第二本日曆的ID
$query->setUser($calendarID);
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$eventFeed = $gdataCal->getCalendarEventFeed($query);

這裡值的一題的是setVisibility ,對於私有的日曆需要用private 的方式開啟,可是設成公開的日曆private 和public 都可以開;此外,setOrderby 就是讀取出來的順序,參數starttime 就是依照事件開始時間,由新到舊列出。

建立網頁呈現
請在上面程式碼?>的後面加入以下html 語法,我們要開始建立流覽畫面:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>FUNction's Lab 讀取Google 行事曆</title>
</head>
<body>
</body>
</html>


加入PHP 語法
最後一步了!在網頁中加入PHP 語法以顯示每個事件,這邊只列出事件的名稱(title)、內容(content)和地點(where)。如果要看事件的詳情,我希望點選事件標題,會由下一個網頁呈現。為了讓下一個網頁之道是哪一個事件,所以我把事件的ID 傳入。請在上述html 的<body>這裡</body>加入以下語法:

<?php
foreach ($eventFeed as $event) {
echo "<h2><a href=\"event.php?id=".basename($event->id->text)."\">" . $event->title->text . "</a></h2>\n";
echo "<ul>\n";
echo "\t<li><b>內容:</b>".$event->content->text."</li>\n";
foreach ($event->where as $where) {
echo "\t<li><b>地點:</b>" . $where->valueString . "</li>\n";
}
echo "</ul>\n";
}
?>
值得注意的是從API 中取出的事件ID 會以一個網址方是呈現,例如http://www.google.com/calendar/feeds/default/private/full/d72ts7587anu8vgu2gsrq9bl3k 所以我用PHP 的basename() 去取得最後一個slash 後的字串。此外,地點(where)是以陣列的格式出現,所以還要再用一個foreach 去解他,有點奇怪,但我也不知道為什麼。

結語
今天我們已經學會把Google Calendar 上的事件撈出來了,下一篇將會介紹如何去讀取單一個事件。希望這些文章對你有幫助喔!

範例程式下載:GClab-part-2.zip

上一篇[教學] 在PHP 中使用Google Calendar API - Part 1 環境建立
下一篇[教學] 在PHP 中使用Google Calendar API - Part 3 檢視單一事件
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表

[教學] 在PHP 中使用Google Calendar API - Part 1 環境建立

FUNction 下午3:11 發表
大綱:建立Google Calendar API 的PHP 環境。
前言
如果你是一個PHP 的開發者,想玩玩Google Calendar API ,想必這篇文章令你興奮。接下來的範例,包含使用PHP 對Google Calendar 新增、查詢、刪除。而且每一篇都會附加當篇程式碼的.zip檔案,希望能對所有PHP 的開發者有幫助。


範例
先讓你過過乾癮,這個小小的網站就是透過Google Calendar API 將資訊存在Google Calendar 上,也是接下來幾天的Lab 要做的,你可以試著新增、刪除事件,然後每個事件會在發生前5分鐘透過Google 傳簡訊通知我: http://functionlab.org/GClab/ 。當你新增事件之後,可以到Google 的畫面去檢視被寫入的事件:FUNction's Lab 公開日曆

讓我們開始吧
如果你不知道什麼是Google Calendar ,或是日曆裡還沒有建立事件,請參考Google Calendar (行事曆/日曆) 使用教學,因為接下來的程式會需要讀取你自己的日曆,請務必先手動建立幾筆事件。還有你要有心理準備,今天幾乎碰不到程式,今天的目標是把環境建立起來。

使用Zend Gdata
假設你的機器已經可以執行PHP 了,而且PHP 的版本在5.0.4 以上。我們必須先取得Zend 公司的Gdata 函式庫,請造訪http://framework.zend.com/download/webservices 下載最新版本(在本篇末也提供包好的函式庫+範例檔案,所以你也可以直接從我這邊下載)。下載之後,解開壓縮會是一個資料夾,其實只有library 資料夾需要用到而已。


建立檔案架構
在你可以執行PHP 的網站根目錄(可能名為htdocs, www, wwwroot...)開一個資料夾,就把它取名為「GClab」吧,代表Google Calendar 的練習。然後接著把剛剛下載來的library 資料夾複製到GClab 之下,這樣檔案架構就搞定了!

建立config.inc.php 檔案
如果要讀取你的Google 日曆,會需要你的Google 帳號、密碼。如果你需要指定讀取哪一本日曆,還會需要他的ID。

我們在GClab 資料夾下建立名為config.inc.php 的檔案,內容如下:
<?php
//以下欄位請依照自己需要調整
$googleAccount = 'myname@gmail.com'; //Google 帳號
$googlePassword = 'mypassword'; //Google 密碼
$calendarID = 'myname@gmail.com'; //Google Calendar 的 ID
?>

這邊要注意的是$calendarID,如果你只有一本日曆,那Calendar ID 會跟你帳號一樣,如果建立了第二本日曆,可以在Google Calendar 的左下角「管理日曆」,點選第二本的日曆名稱,拉到最下面看到(如左圖)。


接著,我們要讓系統能載入Gdata 函式庫,所以我們要在剛剛的檔案中加入一些include path 的設定:
//這裡透過程式碼動態修改php.ini 的include_path 值
//告訴系統Zend Gdata Library 的位置
$slash = (strstr(ini_get('extension_dir'), '/'))?"/":"\\"; //Windows 與Unix 的斜線方向不同,需要考慮到
$includePath = dirname(__FILE__).$slash.'library';
ini_set('include_path', $includePath); //動態設定php.ini

//這邊是在設定程式把Zend Gdata Library 載入程式碼中
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');


最後,我們在瀏覽器輸入http://localhost/GClab/config.inc.php 。只要不出現錯誤訊息,就代表今天的練習成功啦!順便很興奮的告訴你,我們已經完成一半了。

範例程式下載:GClab-part-1.zip

下一篇[教學] 在PHP 中使用Google Calendar API - Part 2 取得事件列表
繼續閱讀全文 [教學] 在PHP 中使用Google Calendar API - Part 1 環境建立

Google Calendar (行事曆/日曆) 使用教學

FUNction 於 2008年7月13日 晚上11:25 發表
前言
也許你像我一樣早就聽過Google Calendar ,也用了一下,但發現沒啥好用的,自己也沒寫行事曆的習慣,手機又不夠新穎,不能直接把事件上傳到Google Calendar 裡,行事曆對你來說一點也不好玩。但是,平均一天收0.幾封簡訊的我,偶爾Google 傳個簡訊通知一下,也感覺蠻溫馨的啦XD,所以讓我們來試試看怎麼用手機收Google 傳來的免費簡訊吧!

申請Google Calendar 帳戶
請先到http://calendar.google.com/ 。假設你已經有Google 帳戶,第一次登入Google Calendar 可以看到如右畫面,這時就填寫你想要用的姓名,以及選擇時區,例如台北是+8時區。設定完之後就可以開始使用Google Calendar 囉!

接著英文可能看不習慣,可以從Setting 把顯示語言改成中文,這邊就不帶大家一步一步做啦。

建立事件
建立事件有好多種方法,這邊講兩種。第一種方法是最簡單的:
請依照圖示操作,例如新增自己的生日。

第二種方法較為複雜,可以詳細設定事件開始、結束的時間,請點選網頁右上角Google Logo 下面的「建立活動」,你可以看到以下畫面,我有稍微填寫範例。


在事件開始前,讓Google 傳簡訊通知你
這邊我在網路上找到一篇很好的文章,按照文章的步驟設定就可以啦。Google日曆也能寄簡訊通知你的行程事項(SMS) 香腸炒魷魚

做到這裡,我想你一定跟我當初看到文章一樣迫不及待,馬上讓Google 傳封愛的簡訊給自己吧!

結論
教學就寫到這裡啦,這遊戲我玩了三天才膩XD
繼續閱讀全文 Google Calendar (行事曆/日曆) 使用教學