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 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 檢視單一事件 Tags: , , ,

讀者回應 ( 22 意見 )

您好 :)

我這幾天也在學著用php對google calendar進行操作,剛好查到您的心得:P

步驟1的config.inc.php執行後並未出現錯誤,可是步驟2的index.php就顯示無法顯示網頁了...

我到ZEND的官網看過,我也把我的code改成跟官網的一樣,不過還是不能動。

問題好像是出在
$client = Zend_Gdata_ClientLogin::getHttpClient($user,$pass,$service);

只要把這行變註解,網頁就能正常執行...

不知道您是否有遇到這樣的問題呢?

To Chihung:
您好!! 謝謝您的支持!!
老實說我沒有遇過你的問題...會不會是網路不通呢??
還是你可以提供PHP 的錯誤訊息???
感覺起來可能是因為連不到Google 的關係耶:S

function 您好 :)

執行index.php後的訊息只有

網站無法顯示該網頁 HTTP 500

最有可能的原因:
網站維護中。
該網站發生程式設計錯誤。

以經將php.ini中的display_errors設成ON了,錯誤訊息還是只有這樣。目前無法貼圖,得等回家才行 囧

我也認為問題是沒跟google端產生連線,但還是試不出要怎麼解決...

看google討論串中的內容,好像是跟proxy的設定有關?

hmm...原來是我忘記重開Apache = ="

錯誤訊息

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:\GCtest\library\Zend\Gdata\ClientLogin.php:129 Stack trace: #0 C:\GCtest\index.php(5): Zend_Gdata_ClientLogin::getHttpClient('google account', 'password', 'cl') #1 {main} thrown in C:\GCtest\library\Zend\Gdata\ClientLogin.php on line 129

To chihung:
您後來有try 出來嗎? 從錯誤訊息可以知道是您機器環境的問題,他沒辦法開啟SSL 的連線

您只要在php.ini 啟用 extension=php_openssl.so 這個選項就可以啦 :-)

如果你動不了php.ini ,你可以在程式一開始加入ini_set('extension', 'php_openssl.so');
動態修改

參考資料:[PHP] Unable to find the socket transport "ssl"

To function:
您好,我也遇到了同樣的錯誤,也是出現了

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:\GCtest\library\Zend\Gdata\ClientLogin.php:129 Stack trace: #0 C:\GCtest\index.php(5): Zend_Gdata_ClientLogin::getHttpClient('google account', 'password', 'cl') #1 {main} thrown in C:\GCtest\library\Zend\Gdata\ClientLogin.php on line 129

那您說在程式一開始加入ini_set('extension', 'php_openssl.so');
動態修改是在那一個程式中呢?我已加在index.php和config.inc內,您說的php.ini內的修改是指在c:/windows下的php.ini嗎?這些是我有做您說的那些,但仍出現同樣的問題,請問一下是什麼原因所致?謝謝。

To function:
您好,上述問題已解決,謝謝。

To function:
您好!
我同樣也是遇到ssl的錯誤訊息,我也加入了ini_set('extension', 'php_openssl.dll');

php.ini內我也把extension打開,可是還是有錯誤訊息,該如何解決呢?謝謝

@Ahghost:
您好,不好意思現在才回你,小弟最近都在看書@@
可以提供錯誤訊息嗎?
一般來說出現SSL錯誤是因為沒有正確include extension...不過你既然兩邊都設定了
你確定你改的php.ini是apache讀的嗎?會不會改錯了,然後改完php.ini之後要重新啟動apache喔
然後另外測試機器必須能連上網際網路,這樣才能跟Google同步嘛!!

To Function:
問題已經解決囉!

您的教學文似乎都是針對UNIX系統講解,而我是建構在Windows的環境下,所以除了設定php_openssl的Extension之外,還多了一個步驟

就是,複製 PHP資料夾下的 libeay32.dll 與 ssleay32.dll
至 Windows\System32 資料夾,重新啟動Apache即可正常執行。

也謝謝您的回應(Y)

@ahghost:
謝謝您提供寶貴的資訊,相信可以幫到不少人:-)
不過我其實是在Vista PHP5.1.2 Apache2.0的環境下寫教學的~也許Apache版本不同吧~總知還是代替大家感謝您!!

謝謝 ahghost 和 FUNction
不但告訴我怎麼使用api也解決了錯誤訊息的問題 真的很感謝 否則我現在應該還坐在電腦前看一堆文件呢!

@fish211001
很高興能幫到你,這對我寫文章也是一種鼓勵!抱歉,因為前陣子非常忙碌...今天終於有空來把Blog 除一除草了orz

不好意思,小弟發現如果是使用windows環境的話,如果使用是appserv這種套裝的環境,必需要手動到php.ini將extension=php_openssl.dll這一行前面的分號移除,重新啟動apache就可以了

$client = Zend_Gdata_ClientLogin::getHttpClient($user,$pass,$...

这行出现错误的原因是大陆的防火墙

= =正常显示了,可是有些是乱码

Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Unable to Connect to ssl://www.google.com:443. Error #10060: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 '

……连接失败

作者已經移除這則留言。

Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message
$client = Zend_Gdata_ClientLogin::getHttpClient($googleAccount, $googlePassword, $service);
我的反應是這樣 有解決的方法嗎??
以下:


'Unable to Connect to ssl://www.google.com:443.


Error #10060: 連線嘗試失敗,因為連線對象有一段時間並未正確回應,或是連線建立失敗,因為連線的主機無法回應。 ' in C:\inetpub\wwwroot\library\Zend\Gdata\ClientLogin.php:129 Stack trace: #0 C:\inetpub\wwwroot\GClab\index.php(34): Zend_Gdata_ClientLogin::getHttpClient('hcgp...

請問如何取得某時段區間內的事件呢?比如說2014年5月份內的事件

自問自答:
設定
$query->setStartMin($startDate);
$query->setStartMax($endDate);
就可以了

張貼留言

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