是否要創建在線日曆,以便您可以在iPhone的日曆應用程序或Google日曆上顯示它們?這可以通過以iCalendar格式(RFC 5545)生成日曆來完成,這是一種文本格式,可以通過不同的應用程序加載。
此類日曆的格式是在RFC 5545中定義的,這不是一個令人愉快的閱讀體驗。該軟件包實現了RFC 5545和RFC 7986的一些擴展,為您提供了易於使用的API來創建日曆。我們的意圖不是完全實施這些RFC,而是提供易於使用的直接API。
這是如何使用它的示例:
use Spatie IcalendarGenerator Components Calendar ;
use Spatie IcalendarGenerator Components Event ;
Calendar :: create ( ' Laracon online ' )
-> event ( Event :: create ( ' Creating calender feeds ' )
-> startsAt ( new DateTime ( ' 6 March 2019 15:00 ' ))
-> endsAt ( new DateTime ( ' 6 March 2019 16:00 ' ))
)
-> get ();
以上代碼將生成此字符串:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:spatie/icalendar-generator
NAME:Laracon online
X-WR-CALNAME:Laracon online
BEGIN:VEVENT
UID:5ef5c3f64cb2c
DTSTAMP;TZID=UTC:20200626T094630
SUMMARY:Creating calendar feeds
DTSTART:20190306T150000Z
DTEND:20190306T160000Z
DTSTAMP:20190419T135034Z
END:VEVENT
END:VCALENDAR
我們投入大量資源來創建課堂開源軟件包。您可以通過購買我們的付費產品之一來支持我們。
非常感謝您向我們發送您的家鄉明信片,並提到您正在使用的包裹。您將在我們的聯繫頁面上找到我們的地址。我們在虛擬明信片牆上發布了所有收到的明信片。
您可以通過作曲家安裝軟件包:
composer require spatie/icalendar-generator
包裝的V1和V2之間存在一些重大變化。檢查升級指南以獲取更多信息。
這是您可以創建日曆的方式:
$ calendar = Calendar :: create ();
您可以為日曆命名:
$ calendar = Calendar :: create ( ' Laracon Online ' );
可以將描述添加到日曆中:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );
最後,您想將日曆轉換為文本,以便可以將其流式傳輸或下載給用戶。這是您這樣做的方式:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...
將日曆流式傳輸到應用程序時,可以在幾分鐘內按持續時間設置日曆的刷新間隔。設置此設置時,日曆應用程序將在指定的持續時間後每次檢查您的服務器,以更改日曆:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .
可以創建事件如下。不需要一個名稱,但應始終給出開始日期:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));
您可以在事件上設置以下屬性:
Event :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' )
-> uniqueIdentifier ( ' A unique identifier can be set here ' )
-> createdAt ( new DateTime ( ' 6 march 2019 ' ))
-> startsAt ( new DateTime ( ' 6 march 2019 15:00 ' ))
-> endsAt ( new DateTime ( ' 6 march 2019 16:00 ' ));
是否想快速創建一個開始和結束日期的事件?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));
您可以將位置添加到一個事件中:
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .
您可以設置活動的組織者,需要電子郵件地址,但可以省略該名稱:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .
可以添加活動的與會者:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .
您還可以設置與會者的參與狀態:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .
參與狀態有五個:
ParticipationStatus::accepted()
ParticipationStatus::declined()
ParticipationStatus::tentative()
ParticipationStatus::needs_action()
ParticipationStatus::delegated()
您可以指出參與者需要RSVP參加活動:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .
一個事件可以使事件透明,因此它不會在日曆中與其他事件以視覺重疊:
Event :: create ()
-> transparent ()
. . .
可以創建一個跨越一整天的活動:
Event :: create ()
-> fullDay ()
. . .
可以設置事件的狀態:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .
有三個事件狀態:
EventStatus::confirmed()
EventStatus::cancelled()
EventStatus::tentative()
可以將活動分類( public
, private
, confidential
):
Event :: create ()
-> classification ( Classification :: private ())
. . .
您可以添加URL附件:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .
您可以添加一個嵌入式附件(base64):
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .
您可以添加圖像:
Event :: create ()
-> image ( ' https://spatie.be/logo.svg ' )
-> image ( ' https://spatie.be/logo.svg ' , ' text/svg+xml ' )
-> image ( ' https://spatie.be/logo.svg ' , ' text/svg+xml ' , Display :: badge ())
. . .
有四種不同的圖像顯示類型:
Display::badge()
Display::graphic()
Display::fullsize()
Display::thumbnail()
創建事件後,應將其添加到日曆中。有多種選擇要這樣做:
// As a single event parameter
$ event = Event :: create ( ' Creating calendar feeds ' );
Calendar :: create ( ' Laracon Online ' )
-> event ( $ event )
. . .
// As an array of events
Calendar :: create ( ' Laracon Online ' )
-> event ([
Event :: create ( ' Creating calender feeds ' ),
Event :: create ( ' Creating contact lists ' ),
])
. . .
// As a closure
Calendar :: create ( ' Laracon Online ' )
-> event ( function ( Event $ event ){
$ event -> name ( ' Creating calender feeds ' );
})
. . .
您可以使用流行的碳庫:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . .
事件將使用您提供的DateTime
對像中定義的時區。 PHP總是在DateTime
對像中設置這些時區。默認情況下,這將是UTC時區,但可以更改此區域。
只是一個提醒:請勿在DateTime
對像上使用PHP的setTimezone
函數,它將根據時區更改時間!最好使用時區創建一個新的DateTime
對象:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))
可以為省略時區提出一個點。例如,當您想在世界中午展示活動時。我們在12點鐘定義中午,但是那個時候是相對的。對於比利時,澳大利亞或世界上任何其他國家的人們來說,情況並非如此。
這就是為什麼您可以在事件上禁用時區:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .
您甚至可以禁用整個日曆的時區:
Calendar :: create ()
-> withoutTimezone ()
. . .
每個日曆都應具有描述日曆中使用的時區組件。儘管並非所有日曆客戶端都需要此內容,但建議添加這些組件。
創建這樣的時區組件非常複雜。這就是為什麼此軟件包將無需配置而自動為您添加它們。
您可以禁用此行為:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .
如果需要,您可以手動將時區添加到日曆中:
$ timezoneEntry = TimezoneEntry :: create (
TimezoneEntryType :: daylight (),
new DateTime ( ' 23 march 2020 ' ),
' +00:00 ' ,
' +02:00 '
);
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry )
. . .
Calendar :: create ()
-> timezone ( $ timezone )
. . .
稍後將更多地了解這些時區。
警報允許日曆客戶端發送有關特定事件的提醒。例如,iPhone上的Apple Mail將向用戶發送有關該事件的通知。一個警報始終屬於事件的描述,並且在事件觸發之前幾分鐘。
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );
事件發生後,您還可以觸發警報:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );
或在特定日期觸發警報:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);
在日曆或事件上刪除時區也將刪除警報中的時區。
活動有可能重複,例如您的每月公司晚餐。可以這樣做:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
您還可以在一組日期上重複該事件:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);
簡而言之,復發規則或rrule的規則可以通過描述在rrule中重複何時在日曆中添加重複事件。首先,我們必須創建一個rr子:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ());
該規則描述了將每天重複的事件。您還可以將頻率設置為secondly
, minutely
, hourly
, weekly
或monthly
yearly
可以將rr子添加到事件中:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
有可能對您的個人品味進行修復;讓我們看看吧!
rr子可以從某個時間點開始:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));
並在某個時刻停下來:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));
它只能重複幾次,例如10次:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );
重複的間隔可以更改:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );
例如,當該活動在星期一開始時,該活動的下一次重複將不會在星期二,而是星期三。您可以為所有頻率做同樣的事情。
也可以在特定的工作日重複活動:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);
或在當月一個星期的特定工作日:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);
或一個月的最後一個工作日:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);
您可以在本月的特定日期重複:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );
甚至有可能在當月提供數天:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);
可以重複一定月份(例如,僅在第二季度):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);
或僅在一個月:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);
可以設置一周開始的一天:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);
您可以提供未重複事件的特定日期:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
還可以提供一系列不會重複事件的日期:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);
另外,您可以將rrules添加為字符串:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );
如果將rrules添加為字符串,則DTSTART中包含的時區,直到包裝不知道,因為字符串永遠不會被解析和評估。如果他們知道他們可以添加DTSTART,直到單獨直至幫助包裝發現時區:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString (
' DTSTART=20231207T090000Z;FREQ=DAILY;INTERVAL=1;UNTIL=20231208T090000Z ' ,
new DateTime ( ' 7 december 2023 09:00:00 ' , new DateTimeZone ( ' UTC ' )),
new DateTime ( ' 8 december 2023 09:00:00 ' , new DateTimeZone ( ' UTC ' ))
);
您可以使用Laravel響應來流到日曆應用程序:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );
如果要添加用戶下載日曆並將其導入日曆應用程序的可能性:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get (), 200 , [
' Content-Type ' => ' text/calendar; charset=utf-8 ' ,
' Content-Disposition ' => ' attachment; filename="my-awesome-calendar.ics" ' ,
]);
如果您想自己製作時區組件,那麼您就在正確的位置,儘管我們建議您首先從RFC閱讀時區。
您可以創建一個時區:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );
可以提供最後修改的日期:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));
或添加一個有關時區的更多信息:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );
一個時區由多個條目組成,其中時區的時間相對於UTC發生了變化,可以為標准或日光時間構建此類條目:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
);
首先,您提供條目類型( standard
或daylight
)。然後在時間更改時進行DateTime
。最後,更改之前的相對於UTC的偏移相對於UTC的偏移,而相對於UTC的偏移偏移。
也可以為此條目提供名稱和描述:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );
可以給出該條目的rrule:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));
最後,您可以將條目添加到時區:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );
甚至添加多個條目:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);
現在,我們已經構建了我們的時區,是時候(?)將這個時區添加到我們的日曆中:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );
也可以添加多個時區:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);
我們嘗試使此軟件包盡可能直接。這就是為什麼此軟件包中未包含來自RFC的許多屬性和子組件的原因。如果您可能需要包裝中不包含的內容,我們已經可以在每個組件中添加其他屬性或子組件。但是要小心!從這一刻起,您可以正確實施RFC。
您可以將新屬性添加到這樣的組件:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . .
在這裡,我們添加了TextProperty
,這是一種默認的鍵值屬性類型,帶有文本為值。您還可以使用軟件包中包含的默認屬性之一,也可以通過擴展Property
類來創建自己的默認屬性。
有時,屬性可能具有一些其他參數,這些參數是鍵值條目,可以將其添加到屬性中:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .
子組件可以這樣附加:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . .
可以通過擴展Component
類來創建子組件。
composer test
我們努力易於使用API。想要更多嗎?然後查看Markus Poerschke的此包。
有關最近發生了變化的更多信息,請參見ChangElog。
請有關詳細信息,請參閱貢獻。
如果您找到了有關安全性的錯誤,請郵件[email protected]而不是使用問題跟踪器。
您可以自由使用此軟件包,但是如果它可以進入您的生產環境,我們非常感謝您向我們向家鄉的明信片發送一張明信片,並提及您使用的哪個包裝。
我們的地址是:Spatie,Kruikstraat 22,Box 12,2018 Antwerp,比利時。
我們在我們的公司網站上發布了所有收到的明信片。
麻省理工學院許可證(麻省理工學院)。請參閱許可證文件以獲取更多信息。