Möchten Sie Online -Kalender erstellen, damit Sie sie in der Kalender -App eines iPhone oder im Google -Kalender anzeigen können? Dies kann durch Generieren von Kalendern im Icalendar -Format (RFC 5545) erfolgen, einem Textformat, das durch verschiedene Anwendungen geladen werden kann.
Das Format solcher Kalender ist in RFC 5545 definiert, was kein angenehmes Leseerlebnis ist. Dieses Paket implementiert RFC 5545 und einige Erweiterungen von RFC 7986, um Ihnen eine einfach zu verwendende API zum Erstellen von Kalendern zu bieten. Es ist nicht unsere Absicht, diese RFCs vollständig zu implementieren, sondern eine einfache API bereitzustellen, die einfach zu bedienen ist.
Hier ist ein Beispiel dafür, wie man es benutzt:
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 ();
Der obige Code generiert diese Zeichenfolge:
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
Wir investieren viele Ressourcen in die Erstellung von Open -Source -Paketen in der Klasse. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welche unserer Pakete Sie verwenden. Sie finden unsere Adresse auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten an unserer virtuellen Postkarte.
Sie können das Paket über Komponist installieren:
composer require spatie/icalendar-generator
Es gab einige wesentliche Änderungen zwischen V1 und V2 des Pakets. Weitere Informationen finden Sie im Upgrade -Handbuch.
So können Sie einen Kalender erstellen:
$ calendar = Calendar :: create ();
Sie können dem Kalender einen Namen geben:
$ calendar = Calendar :: create ( ' Laracon Online ' );
Eine Beschreibung kann einem Kalender hinzugefügt werden:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );
Am Ende möchten Sie Ihren Kalender in Text konvertieren, damit er gestreamt oder an den Benutzer heruntergeladen werden kann. So machst du das:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...
Beim Streamieren eines Kalenders in eine Anwendung ist es möglich, das Aktualisierungsintervall des Kalenders in Minuten dauerhaft festzulegen. Bei der Einstellung wird die Kalenderanwendung Ihr Server jedes Mal nach der angegebenen Dauer auf Änderungen am Kalender überprüft:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .
Ein Ereignis kann wie folgt erstellt werden. Ein Name ist nicht erforderlich, aber ein Startdatum sollte immer angegeben werden:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));
Sie können die folgenden Eigenschaften für ein Ereignis festlegen:
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 ' ));
Möchten Sie schnell ein Ereignis mit einem Start- und Enddatum erstellen?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));
Sie können einem Ereignis einen Ort hinzufügen::
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .
Sie können den Organisator einer Veranstaltung festlegen, die E -Mail -Adresse ist erforderlich, der Name kann jedoch weggelassen werden:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .
Teilnehmer einer Veranstaltung können als solche hinzugefügt werden:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .
Sie können auch den Teilnahmestatus eines Teilnehmers festlegen:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .
Es gibt fünf Teilnahmestatus:
ParticipationStatus::accepted()
ParticipationStatus::declined()
ParticipationStatus::tentative()
ParticipationStatus::needs_action()
ParticipationStatus::delegated()
Sie können angeben, dass ein Teilnehmer RSVP zu einer Veranstaltung verpflichtet ist:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .
Eine Veranstaltung kann transparent gemacht werden, sodass es sich nicht visuell mit anderen Ereignissen in einem Kalender überlappt:
Event :: create ()
-> transparent ()
. . .
Es ist möglich, ein Ereignis zu erstellen, das einen ganzen Tag umfasst:
Event :: create ()
-> fullDay ()
. . .
Der Status eines Ereignisses kann festgelegt werden:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .
Es gibt drei Ereignisstatus:
EventStatus::confirmed()
EventStatus::cancelled()
EventStatus::tentative()
Eine Veranstaltung kann als solche klassifiziert werden ( public
, private
, confidential
):
Event :: create ()
-> classification ( Classification :: private ())
. . .
Sie können als solches einen URL -Anhang hinzufügen:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .
Sie können einen eingebetteten Anhang (Base64) als solches hinzufügen:
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .
Sie können ein Bild als solches hinzufügen:
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 ())
. . .
Es gibt vier verschiedene Bildanzeigearten:
Display::badge()
Display::graphic()
Display::fullsize()
Display::thumbnail()
Nach dem Erstellen Ihres Ereignisses sollte es einem Kalender hinzugefügt werden. Dies gibt mehrere Optionen, um dies zu tun:
// 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 ' );
})
. . .
Sie können die beliebte Kohlenstoffbibliothek verwenden:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . .
Ereignisse verwenden die Zeitzonen, die in den von Ihnen angegebenen DateTime
-Objekten definiert sind. PHP legt diese Zeitzonen immer in einem DateTime
-Objekt fest. Standardmäßig ist dies die UTC -Zeitzone, aber es ist möglich, dies zu ändern.
Nur eine Erinnerung: Verwenden Sie die setTimezone
-Funktion von PHP in einem DateTime
-Objekt nicht, sie ändert die Zeit entsprechend der TimeZone! Es ist besser, ein neues DateTime
-Objekt mit einer Zeitzone als solche zu erstellen:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))
Ein Punkt kann zum Auslassen von Zeitzonen gemacht werden. Zum Beispiel, wenn Sie eine Veranstaltung mittags in der Welt zeigen möchten. Wir definieren mittags um 12 Uhr, aber diese Zeit ist relativ. Es ist nicht dasselbe für Menschen in Belgien, Australien oder einem anderen Land der Welt.
Deshalb können Sie Timezones bei Veranstaltungen deaktivieren:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .
Sie können sogar Zeitzonen für einen ganzen Kalender deaktivieren:
Calendar :: create ()
-> withoutTimezone ()
. . .
Jeder Kalender sollte Zeitzonkomponenten haben, die die in Ihrem Kalender verwendeten Zeitzonen beschreiben. Obwohl nicht alle Kalender -Clients dies benötigen, wird empfohlen, diese Komponenten hinzuzufügen.
Das Erstellen solcher Zeitzone -Komponenten ist sehr kompliziert. Aus diesem Grund fügt dieses Paket sie automatisch ohne Konfiguration für Sie hinzu.
Sie können dieses Verhalten als solches deaktivieren:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .
Sie können einen Kalender manuell zu einem Kalender hinzufügen, falls dies gewünscht wird:
$ 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 )
. . .
Mehr zu diesen Zeitzonen später.
Bei Benachrichtigungen können Kalender -Clients Erinnerungen an bestimmte Ereignisse senden. Beispielsweise sendet Apple Mail auf einem iPhone Benutzer eine Benachrichtigung über das Ereignis. Eine Warnung gehört immer zu einem Ereignis und hat eine Beschreibung und einige Minuten vor dem Ereignis, das er ausgelöst wird:
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );
Sie können nach dem Ereignis auch eine Warnung auslösen:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );
Oder eine Warnung an einem bestimmten Datum auslösen:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);
Durch das Entfernen von Zeitzonen in einem Kalender oder Ereignis werden auch Zeitzonen in der Warnung entfernt.
Es ist möglich, dass Veranstaltungen sich wiederholen, zum Beispiel Ihr monatliches Firmendinner. Dies kann als solches geschehen:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
Und Sie können das Ereignis auch auf einem Satz von Daten wiederholen:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);
Rezidivregeln oder Rrules Kurz gesagt, ermöglichen es, in Ihrem Kalender ein wiederholtes Ereignis hinzuzufügen, indem Sie beschreiben, wann es sich in einem RRUE wiederholt. Zunächst müssen wir eine Rrule erstellen:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ());
Diese Regel beschreibt ein Ereignis, das täglich wiederholt wird. Sie können die Frequenz yearly
auf secondly
, minutely
, hourly
, weekly
oder monthly
einstellen.
Die Rrule kann einem Ereignis als solcher hinzugefügt werden:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
Es ist möglich, die Rrule mit Ihrem persönlichen Geschmack zu beenden. Schauen wir uns an!
Ein Rrule kann von einem bestimmten Zeitpunkt ausgehen:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));
Und stoppen Sie an einem bestimmten Punkt:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));
Es kann nur für einige Male, zehnmal wiederholt werden, zum Beispiel:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );
Das Intervall der Wiederholung kann geändert werden:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );
Wenn diese Veranstaltung beispielsweise am Montag beginnt, wird die nächste Wiederholung dieses Ereignisses nicht am Dienstag, sondern am Mittwoch stattfinden. Sie können dasselbe für alle Frequenzen tun.
Es ist auch möglich, das Ereignis an einem bestimmten Wochentag zu wiederholen:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);
Oder an einem bestimmten Wochentag einer Woche im Monat:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);
Oder am letzten Wochentag eines Monats:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);
Sie können an einem bestimmten Tag im Monat wiederholen:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );
Es ist sogar möglich, eine Reihe von Tagen im Monat zu geben:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);
Das Wiederholen kann für bestimmte Monate durchgeführt werden (z. B. nur im zweiten Quartal):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);
Oder nur nur einen Monat:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);
Es ist möglich, den Tag zu setzen, an dem die Woche beginnt:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);
Sie können ein bestimmtes Datum angeben, an dem ein Ereignis nicht wiederholt wird:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
Es ist auch möglich, eine Reihe von Daten zu geben, an denen das Ereignis nicht wiederholt wird:
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 ' )]);
Alternativ können Sie RRULES als Zeichenfolge hinzufügen:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );
Wenn Sie RRULES als Zeichenfolge hinzufügen, sind die in dtstart enthaltenen Zeitzonen und bis zum Paket unbekannt, da die Zeichenfolge niemals analysiert und bewertet wird. Wenn sie bekannt sind, können Sie DTStart hinzufügen und bis sie separat sind, um das Paket zu helfen, die TimeZones zu entdecken:
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 ' ))
);
Sie können Laravel -Antworten zum Stream zu Kalenderanwendungen verwenden:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );
Wenn Sie den Benutzern die Möglichkeit hinzufügen möchten, einen Kalender herunterzuladen und in eine Kalenderanwendung zu importieren:
$ 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" ' ,
]);
Wenn Sie TimeZone -Komponenten selbst herstellen möchten, sind Sie am richtigen Ort, obwohl wir Ihnen raten, zuerst den Abschnitt über Timezones aus dem RFC zu lesen.
Sie können eine Zeitzone als solche erstellen:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );
Es ist möglich, das zuletzt geänderte Datum anzugeben:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));
Oder fügen Sie eine URL mit weiteren Informationen über die Zeitzone hinzu:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );
Eine Zeitzone besteht aus mehreren Einträgen, in denen sich die Zeit der Zeitzone im Verhältnis zur UTC geändert hat. Ein solcher Eintrag kann für Standard- oder Tageslichtzeit konstruiert werden:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
);
Zunächst stellen Sie die Art des Eintritts ( standard
oder daylight
) an. Dann eine DateTime
, wenn sich die Zeit ändert. Zuletzt ein Versatz in Bezug auf UTC vor der Änderung und ein Versatz in Bezug auf UTC nach der Änderung.
Es ist auch möglich, diesem Eintrag einen Namen und eine Beschreibung zu geben:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );
Ein Rrule für den Eintrag kann als solche angegeben werden:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));
Am Ende können Sie einer Zeitzone einen Eintrag hinzufügen:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );
Oder sogar mehrere Einträge hinzufügen:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);
Jetzt haben wir unsere Zeitzone konstruiert. Es ist Zeit (?), Diesen Zeitzone zu unserem Kalender hinzuzufügen:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );
Es ist auch möglich, mehrere Zeitzonen hinzuzufügen:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);
Wir versuchen, dieses Paket so einfach wie möglich zu halten. Deshalb sind viele Eigenschaften und Unterkomponenten aus dem RFC nicht in diesem Paket enthalten. Wir haben es ermöglicht, jeder Komponente andere Eigenschaften oder Unterkomponenten hinzuzufügen, wenn Sie möglicherweise etwas nicht im Paket enthalten benötigen. Aber sei vorsichtig! Von diesem Moment an sind Sie alleine richtig implementiert, um die RFCs zu implementieren.
Sie können einer Komponente wie folgt eine neue Eigenschaft hinzufügen:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . .
Hier haben wir eine TextProperty
hinzugefügt, und dies ist ein Standard-Taste-Wert-Eigenschaftstyp mit einem Text als Wert. Sie können auch eines der im Paket enthaltenen Standardeigenschaften verwenden oder Ihre eigene erstellen, indem Sie die Property
erweitern.
Manchmal kann eine Eigenschaft einige zusätzliche Parameter haben, dies sind Schlüsselwerteinträge und können als solche den Eigenschaften hinzugefügt werden:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .
Eine Unterkomponente kann als solche angehängt werden:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . .
Es ist möglich, Ihre Unterkomponenten durch Erweiterung der Component
zu erstellen.
composer test
Wir streben nach einer einfachen und einfach zu verwendenden API. Willst du etwas mehr? Schauen Sie sich dieses Paket von Markus Poerschke an.
Weitere Informationen zu dem, was sich in letzter Zeit geändert hat, finden Sie in ChangeLog.
Weitere Informationen finden Sie unter Beitrag.
Wenn Sie einen Fehler in Bezug auf Sicherheit gefunden haben, mailen Sie [email protected], anstatt den Ausgaber -Tracker zu verwenden.
Sie können dieses Paket nutzen, aber wenn es in Ihre Produktionsumgebung geschafft, schätzen wir es sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt senden und erwähnen, welche unserer Pakete Sie verwenden.
Unsere Adresse lautet: Spatie, Kruikstraat 22, Box 12, 2018 Antwerpen, Belgien.
Wir veröffentlichen alle erhaltenen Postkarten auf unserer Unternehmenswebsite.
Die MIT -Lizenz (MIT). Weitere Informationen finden Sie unter Lizenzdatei.