2012-12-29 37 views
1

我寫了一個腳本來從我的數據庫中的事件生成一個iCal日曆。這裏有一個輸出示例:這個iCal日曆有什麼問題?

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
BEGIN:VEVENT 
ORGANIZER;CN=Blodgruppen 
DTSTART:20130128T173000Z 
DTEND: 20130128T193000Z 
SUMMARY: Su-möte 
END:VEVENT 
BEGIN:VEVENT 
ORGANIZER;CN=F-styret 
DTSTART:20130128T173000Z 
DTEND: 20130128T193000Z 
SUMMARY: Su-möte 
END:VEVENT 
BEGIN:VEVENT 
ORGANIZER;CN=Blodgruppen 
DTSTART:20130412T100000Z 
DTEND: 20130414T180000Z 
SUMMARY: KTH 
END:VEVENT 
BEGIN:VEVENT 
ORGANIZER;CN=F-styret 
DTSTART:20130412T100000Z 
DTEND: 20130414T180000Z 
SUMMARY: KTH 
END:VEVENT 
END:VCALENDAR 

當我嘗試在iCal中訂閱它時,它說該文件無效。有誰知道爲什麼?

此外,有沒有人知道我是否會遇到問題的地方,因爲我的文件的結尾是.php而不是.ics?

(如果有幫助,我構建了上述通過看維基百科上的例子:http://en.wikipedia.org/wiki/ICalendar#Core_object

回答

1

回到基礎知識有點你不能上傳你的PHP腳本,有些日曆客戶端允許你訂閱一個URL來獲取一個iCal源,確保這是你正在做的,而你不是試圖上傳PHP腳本文件。

如果這樣可以,那麼我們可以看看定義。根據documentationORGANIZER參數是可選的,如果它包含它必須有冒號:校準地址它必須是URI。你ORGANIZER領域是這樣的:

ORGANIZER;CN=Blodgruppen 

他們應該是這樣的:

ORGANIZER;CN=Blodgruppen:URI 

URI不一定非得是的mailtohere are some examples。爲了方便的電子郵件地址,可以添加這樣的...

ORGANIZER;CN=Blodgruppen:MAILTO:[email protected] 

或電話號碼......

ORGANIZER;CN=Blodgruppen:TEL:+49--56789 

可以包括FTP網址的網站,以及其他一些不太常用的東西。或者,該參數不是必需的,因此您可以簡單地將其刪除。

此外,它似乎VEVENT是缺少一個UIDDTSTAMP是必需的屬性。

UID可以是您選擇的標識符,但它應該是全球唯一的。我將花時間通過描述UID參數的含義來解釋全球唯一的含義。日曆客戶端將使用它來標識事件,如果您使用日曆中已存在的事件的標識,則會更新該事件,認爲您的意思是要這樣做,因此它不能與現有事件的標識匹配。如果您想將事件添加到許多可能包含事件的不同日曆客戶端,這就是爲什麼它必須「全局」唯一。您可以在PHP中使用uniqid()函數,這可能有助於創建您自己的全局唯一標識符。

DTSTAMP是事件創建或上次更新的時間。

定義中的空格不一致,文檔不討論參數和值之間的空白區域,但所有示例均顯示爲空白區域,因此您可能還想刪除任何非本質空白區域...

DTEND: 20130128T193000Z 

要成爲...

DTEND:20130128T193000Z 

它可能沒有大礙,但存在這樣的可能性。我還會從最簡單的參數中嘗試一個事件開始,只是爲了檢查導致問題的iCal定義。

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
BEGIN:VEVENT 
UID:20121229T212000Z-test-1 
DTSTAMP:20121229T212000Z 
DTSTART:20130128T173000Z 
DTEND:20130128T193000Z 
END:VEVENT 
END:VCALENDAR 

你可能要檢查你的PHP腳本使用正確的MIME類型,以及text/calendar。如果不是,你可以使用header功能Content-Type頭添加到響應:

header("Content-Type: text/calendar"); 

我希望這有助於...

+0

謝謝!真的很好的答案。我現在工作很好。 :) –

0

可以導入ics文件到谷歌日曆測試,

你會發現藉口之一是,你應該有UID屬性中的每一事件,

,然後,你可以很容易地把這些事件到谷歌日曆

0

爲了將來使用,這裏有一些網上的iCalendar驗證:

icalendar.org報道了您的樣本這些錯誤:

錯誤

Missing DTSTAMP property near line # 4Reference: RFC 5545 3.6.1. Event Component 
Missing UID property near line # 4Reference: RFC 5545 3.6.1. Event Component 
Invalid DTEND value, must be a date or date-time value near line # 4Reference: 3.3.5. Date-Time 
Missing DTSTAMP property near line # 10Reference: RFC 5545 3.6.1. Event Component 
Missing UID property near line # 10Reference: RFC 5545 3.6.1. Event Component 
Invalid DTEND value, must be a date or date-time value near line # 10Reference: 3.3.5. Date-Time 
Missing DTSTAMP property near line # 16Reference: RFC 5545 3.6.1. Event Component 
Missing UID property near line # 16Reference: RFC 5545 3.6.1. Event Component 
Invalid DTEND value, must be a date or date-time value near line # 16Reference: 3.3.5. Date-Time 
Missing DTSTAMP property near line # 22Reference: RFC 5545 3.6.1. Event Component 
Missing UID property near line # 22Reference: RFC 5545 3.6.1. Event Component 
Invalid DTEND value, must be a date or date-time value near line # 22Reference: 3.3.5. Date-Time