Ingin membuat kalender online sehingga Anda dapat menampilkannya di aplikasi kalender iPhone atau di Kalender Google? Ini dapat dilakukan dengan menghasilkan kalender dalam format icalendar (RFC 5545), format tekstual yang dapat dimuat oleh aplikasi yang berbeda.
Format kalender tersebut didefinisikan dalam RFC 5545, yang bukan pengalaman membaca yang menyenangkan. Paket ini mengimplementasikan RFC 5545 dan beberapa ekstensi dari RFC 7986 untuk memberi Anda API yang mudah digunakan untuk membuat kalender. Bukan niat kami untuk mengimplementasikan RFC ini sepenuhnya tetapi untuk memberikan API langsung yang mudah digunakan.
Berikut adalah contoh cara menggunakannya:
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 ();Kode di atas akan menghasilkan string ini:
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
Kami menginvestasikan banyak sumber daya untuk menciptakan paket open source terbaik di kelas. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kampung halaman Anda, menyebutkan paket mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami menerbitkan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui komposer:
composer require spatie/icalendar-generatorAda beberapa perubahan besar antara V1 dan V2 dari paket. Periksa panduan peningkatan untuk informasi lebih lanjut.
Inilah cara Anda dapat membuat kalender:
$ calendar = Calendar :: create ();Anda dapat memberikan nama untuk kalender:
$ calendar = Calendar :: create ( ' Laracon Online ' );Deskripsi dapat ditambahkan ke kalender:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );Pada akhirnya, Anda ingin mengonversi kalender Anda menjadi teks sehingga dapat dialirkan atau diunduh kepada pengguna. Begini cara Anda melakukannya:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...Saat streaming kalender ke aplikasi, dimungkinkan untuk mengatur interval penyegaran kalender berdasarkan durasi dalam hitungan menit. Saat mengatur ini, aplikasi kalender akan memeriksa server Anda setiap kali setelah durasi yang ditentukan untuk perubahan pada kalender:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .Suatu acara dapat dibuat sebagai berikut. Nama tidak diperlukan, tetapi tanggal mulai harus selalu diberikan:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));Anda dapat mengatur properti berikut pada suatu acara:
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 ' ));Ingin membuat acara dengan cepat dengan tanggal awal dan akhir?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));Anda dapat menambahkan lokasi ke acara seperti itu:
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .Anda dapat mengatur penyelenggara suatu acara, alamat email diperlukan, tetapi namanya dapat dihilangkan:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .Peserta acara dapat ditambahkan seperti itu:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .Anda juga dapat menetapkan status partisipasi seorang peserta:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .Ada lima status partisipasi:
ParticipationStatus::accepted()ParticipationStatus::declined()ParticipationStatus::tentative()ParticipationStatus::needs_action()ParticipationStatus::delegated()Anda dapat menunjukkan bahwa seorang peserta diminta untuk RSVP ke suatu acara:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .Suatu peristiwa dapat dibuat transparan, sehingga tidak tumpang tindih secara visual dengan peristiwa lain dalam kalender:
Event :: create ()
-> transparent ()
. . .Dimungkinkan untuk membuat acara yang membentang sehari penuh:
Event :: create ()
-> fullDay ()
. . .Status suatu acara dapat diatur:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .Ada tiga status acara:
EventStatus::confirmed()EventStatus::cancelled()EventStatus::tentative() Suatu acara dapat diklasifikasikan ( public , private , confidential ) dengan demikian:
Event :: create ()
-> classification ( Classification :: private ())
. . .Anda dapat menambahkan lampiran URL seperti itu:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .Anda dapat menambahkan lampiran tertanam (base64) dengan demikian:
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .Anda dapat menambahkan gambar seperti itu:
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 ())
. . .Ada empat jenis tampilan gambar yang berbeda:
Display::badge()Display::graphic()Display::fullsize()Display::thumbnail()Setelah membuat acara Anda, itu harus ditambahkan ke kalender. Ada beberapa opsi untuk melakukan ini:
// 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 ' );
})
. . .Anda dapat menggunakan Perpustakaan Karbon Populer:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . . Acara akan menggunakan zona waktu yang ditentukan dalam objek DateTime yang Anda berikan. PHP selalu mengatur zona waktu ini dalam objek DateTime . Secara default, ini akan menjadi zona waktu UTC, tetapi dimungkinkan untuk mengubahnya.
Hanya pengingat: Jangan gunakan fungsi setTimezone PHP pada objek DateTime , itu akan mengubah waktu sesuai dengan zona waktu! Lebih baik membuat objek DateTime baru dengan zona waktu seperti itu:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))Poin dapat dibuat untuk menghilangkan zona waktu. Misalnya, ketika Anda ingin menampilkan acara di siang hari di dunia. Kami mendefinisikan siang pada jam 12, tetapi waktu itu relatif. Ini tidak sama untuk orang -orang di Belgia, Australia, atau negara lain di dunia.
Itulah mengapa Anda dapat menonaktifkan zona waktu pada acara:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .Anda bahkan dapat menonaktifkan zona waktu untuk seluruh kalender:
Calendar :: create ()
-> withoutTimezone ()
. . .Setiap kalender harus memiliki komponen zona waktu yang menggambarkan zona waktu yang digunakan dalam kalender Anda. Meskipun tidak semua klien kalender memerlukan ini, disarankan untuk menambahkan komponen -komponen ini.
Membuat komponen zona waktu seperti itu cukup rumit. Itu sebabnya paket ini akan secara otomatis menambahkannya untuk Anda tanpa konfigurasi.
Anda dapat menonaktifkan perilaku ini seperti:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .Anda dapat menambahkan zona waktu secara manual ke kalender jika diinginkan seperti itu:
$ 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 )
. . .Lebih lanjut tentang zaman ini nanti.
Lansiran memungkinkan klien kalender untuk mengirim pengingat tentang acara tertentu. Misalnya, Apple Mail di iPhone akan mengirimi pengguna tentang acara tersebut. Peringatan selalu menjadi milik suatu acara memiliki deskripsi dan beberapa menit sebelum acara itu akan dipicu:
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );Anda juga dapat memicu peringatan setelah acara:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );Atau memicu peringatan pada tanggal tertentu:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);Menghapus zona waktu pada kalender atau acara juga akan menghapus zona waktu pada peringatan.
Dimungkinkan untuk diulangi, misalnya makan malam perusahaan bulanan Anda. Ini bisa dilakukan seperti itu:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));Dan Anda juga dapat mengulangi acara pada seperangkat tanggal:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);Singkatnya, aturan pengulangan atau rrule, agar memungkinkan untuk menambahkan peristiwa berulang di kalender Anda dengan menggambarkan kapan berulang dalam rrule. Pertama, kita harus membuat rrule:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ()); Aturan ini menggambarkan suatu peristiwa yang akan diulang setiap hari. Anda juga dapat menetapkan frekuensi menjadi secondly , minutely , hourly , weekly , monthly atau yearly .
RRULE dapat ditambahkan ke suatu acara seperti itu:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));Dimungkinkan untuk melakukan rrule ke selera pribadi Anda; Mari kita lihat!
Rrule dapat dimulai dari titik waktu tertentu:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));Dan berhenti pada titik tertentu:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));Ini hanya dapat diulangi beberapa kali, 10 kali misalnya:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );Interval pengulangan dapat diubah:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );Ketika acara ini dimulai pada hari Senin, misalnya, pengulangan acara berikutnya tidak akan terjadi pada hari Selasa tetapi Rabu. Anda dapat melakukan hal yang sama untuk semua frekuensi.
Dimungkinkan juga untuk mengulangi acara pada hari kerja tertentu:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);Atau pada hari kerja tertentu seminggu di bulan ini:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);Atau pada hari kerja terakhir sebulan:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);Anda dapat mengulangi pada hari tertentu di bulan ini:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );Bahkan dimungkinkan untuk memberikan serangkaian hari di bulan ini:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);Pengulangan dapat dilakukan selama berbulan -bulan (misalnya hanya pada kuartal kedua):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);Atau hanya satu bulan:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);Dimungkinkan untuk mengatur hari ketika minggu dimulai:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);Anda dapat memberikan tanggal tertentu di mana suatu acara tidak akan diulang:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));Dimungkinkan juga untuk memberikan berbagai tanggal di mana acara tersebut tidak akan diulang:
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 ' )]);Atau Anda dapat menambahkan rrule sebagai string:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );Jika Anda menambahkan rrule sebagai string, waktu zona yang termasuk dalam dtStart dan sampai tidak diketahui paket karena string tidak pernah diuraikan dan dievaluasi. Jika diketahui, Anda dapat menambahkan DTStart dan sampai secara terpisah untuk membantu paket menemukan zona waktu:
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 ' ))
);Anda dapat menggunakan respons Laravel untuk streaming ke aplikasi kalender:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );Jika Anda ingin menambahkan kemungkinan bagi pengguna untuk mengunduh kalender dan mengimpornya ke dalam aplikasi kalender:
$ 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" ' ,
]);Jika Anda ingin membuat komponen zona waktu sendiri, Anda berada di tempat yang tepat, meskipun kami menyarankan Anda untuk membaca bagian tentang zona waktu dari RFC terlebih dahulu.
Anda dapat membuat zona waktu seperti itu:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );Dimungkinkan untuk memberikan tanggal yang dimodifikasi terakhir:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));Atau tambahkan URL dengan informasi lebih lanjut tentang zona waktu:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );Sebuah zona waktu terdiri dari beberapa entri di mana waktu zona waktu berubah relatif terhadap UTC, entri tersebut dapat dibangun untuk waktu standar atau siang hari:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
); Pertama, Anda memberikan jenis entri ( standard atau daylight ). Kemudian DateTime saat waktu berubah. Terakhir, offset relatif ke UTC dari sebelum perubahan dan offset relatif terhadap UTC setelah perubahan.
Dimungkinkan juga untuk memberikan entri ini nama dan deskripsi:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );Rrule untuk entri dapat diberikan seperti itu:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));Pada akhirnya Anda dapat menambahkan entri ke zona waktu:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );Atau bahkan menambahkan beberapa entri:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);Sekarang kami telah membangun zona waktu kami, sudah waktunya (?) Untuk menambahkan zona waktu ini ke kalender kami:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );Dimungkinkan juga untuk menambahkan beberapa zona waktu:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);Kami mencoba menjaga paket ini sesudah mungkin. Itulah mengapa banyak properti dan subkomponen dari RFC tidak termasuk dalam paket ini. Kami memungkinkan untuk menambahkan properti atau subkomponen lain ke setiap komponen jika Anda mungkin memerlukan sesuatu yang tidak termasuk dalam paket. Tapi hati -hati! Mulai saat ini, Anda sendiri dengan benar menerapkan RFC.
Anda dapat menambahkan properti baru ke komponen seperti ini:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . . Di sini kami telah menambahkan TextProperty , dan ini adalah jenis properti nilai kunci default dengan teks sebagai nilai. Anda juga dapat menggunakan salah satu properti default yang termasuk dalam paket atau membuat sendiri dengan memperluas kelas Property .
Terkadang suatu properti dapat memiliki beberapa parameter tambahan, ini adalah entri nilai kunci dan dapat ditambahkan ke properti seperti itu:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .Subkomponen dapat ditambahkan seperti itu:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . . Dimungkinkan untuk membuat subkomponen Anda dengan memperluas kelas Component .
composer testKami berjuang untuk API yang sederhana dan mudah digunakan. Ingin sesuatu yang lebih? Kemudian periksa paket ini oleh Markus Poerschke.
Silakan lihat Changelog untuk informasi lebih lanjut tentang apa yang telah berubah baru -baru ini.
Silakan lihat berkontribusi untuk detailnya.
Jika Anda telah menemukan bug tentang keamanan, silakan kirimkan [email protected] alih -alih menggunakan pelacak masalah.
Anda bebas menggunakan paket ini, tetapi jika itu membuatnya ke lingkungan produksi Anda, kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, menyebutkan paket mana yang Anda gunakan.
Alamat kami adalah: Spatie, Kruikstraat 22, Kotak 12, 2018 Antwerp, Belgia.
Kami menerbitkan semua kartu pos yang diterima di situs web perusahaan kami.
Lisensi MIT (MIT). Silakan lihat file lisensi untuk informasi lebih lanjut.