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
私たちは多くのリソースを、クラスで最高のオープンソースパッケージを作成するために投資しています。有料製品の1つを購入することで、私たちをサポートできます。
故郷からハガキを送ってくれて、あなたが使用しているパッケージのどれについて言及してくれてありがとう。お問い合わせページにアドレスがあります。仮想のはがきの壁に受け取ったポストカードをすべて公開しています。
Composer経由でパッケージをインストールできます。
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 ())
. . .
5つの参加ステータスがあります。
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 ()
. . .
1日にわたるイベントを作成することが可能です。
Event :: create ()
-> fullDay ()
. . .
イベントのステータスを設定できます。
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .
イベントステータスは3つあります。
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 ())
. . .
4つの異なる画像表示タイプがあります。
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 TimeZoneになりますが、これを変更することは可能です。
ちょうどリマインダー:PHPのsetTimezone
関数をDateTime
オブジェクトに使用しないでください。TimeZoneに応じて時間が変わります!そのようなタイムゾーンを備えた新しい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 ()
. . .
各カレンダーには、カレンダー内で使用されるタイムゾーンを説明するタイムゾーンコンポーネントが必要です。すべてのカレンダークライアントがこれを必要とするわけではありませんが、これらのコンポーネントを追加することをお勧めします。
このようなTimeZoneコンポーネントの作成は非常に複雑です。そのため、このパッケージは構成なしで自動的にそれらを追加します。
この動作を無効にすることができます。
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内で繰り返す時期を説明することにより、カレンダーに繰り返しイベントを追加することを可能にします。まず、rruleを作成する必要があります。
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ());
このルールは、毎日繰り返されるイベントについて説明しています。また、頻度をsecondly
、 minutely
、 hourly
weekly
monthly
、またはyearly
に設定することもできます。
rruleはイベントに追加できます。
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
Rruleをあなたの個人的な好みに照射することが可能です。見てみましょう!
rruleは、特定の時点から開始できます。
$ 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 ()
);
またはその月の特定の平日の1週間に:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);
または1か月の最後の平日に:
$ 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 ]
);
繰り返しは特定の月(例えば第2四半期のみ)で行うことができます:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);
またはちょうど1か月だけ:
$ 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の詳細情報を含むURLを追加します。
$ 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に対するオフセット。
このエントリに名前と説明を与えることもできます。
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );
エントリのrruleは、次のように与えることができます。
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));
最終的に、TimeZoneにエントリを追加できます。
$ 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、Belgiumです。
当社のWebサイトで受信したポストカードをすべて公開しています。
MITライセンス(MIT)。詳細については、ライセンスファイルをご覧ください。