Vous souhaitez créer des calendriers en ligne afin que vous puissiez les afficher sur l'application de calendrier d'un iPhone ou dans le calendrier Google? Cela peut être fait en générant des calendriers au format iCicEndar (RFC 5545), un format textuel qui peut être chargé par différentes applications.
Le format de ces calendriers est défini dans RFC 5545, qui n'est pas une expérience de lecture agréable. Ce package implémente RFC 5545 et certaines extensions de RFC 7986 pour vous fournir une API facile à utiliser pour créer des calendriers. Ce n'est pas notre intention de mettre en œuvre entièrement ces RFC, mais de fournir une API simple facile à utiliser.
Voici un exemple de la façon de l'utiliser:
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 ();Le code ci-dessus générera cette chaîne:
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
Nous investissons beaucoup de ressources dans la création de forfaits open source des meilleurs dans la classe. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions beaucoup que vous nous envoyions une carte postale de votre ville natale, mentionnant lequel de nos colis que vous utilisez. Vous trouverez notre adresse sur notre page de contact. Nous publions toutes les cartes postales reçues sur notre mur de cartes postales virtuels.
Vous pouvez installer le package via le compositeur:
composer require spatie/icalendar-generatorIl y a eu des changements substantiels entre V1 et V2 du package. Vérifiez le guide de mise à niveau pour plus d'informations.
Voici comment créer un calendrier:
$ calendar = Calendar :: create ();Vous pouvez donner un nom au calendrier:
$ calendar = Calendar :: create ( ' Laracon Online ' );Une description peut être ajoutée à un calendrier:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );En fin de compte, vous souhaitez convertir votre calendrier en texte afin qu'il puisse être diffusé ou téléchargé à l'utilisateur. Voici comment vous faites cela:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...Lors de la diffusion d'un calendrier à une application, il est possible de définir l'intervalle de rafraîchissement du calendrier par durée en minutes. Lors de la définition de cela, l'application de calendrier vérifiera votre serveur à chaque fois après la durée spécifiée pour les modifications du calendrier:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .Un événement peut être créé comme suit. Un nom n'est pas requis, mais une date de début doit toujours être donnée:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));Vous pouvez définir les propriétés suivantes sur un événement:
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 ' ));Vous voulez créer un événement rapidement avec une date de début et de fin?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));Vous pouvez ajouter un emplacement à un événement a tel:
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .Vous pouvez définir l'organisateur d'un événement, l'adresse e-mail est requise, mais le nom peut être omis:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .Les participants d'un événement peuvent être ajoutés comme tels:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .Vous pouvez également définir le statut de participation d'un participant:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .Il y a cinq statuts de participation:
ParticipationStatus::accepted()ParticipationStatus::declined()ParticipationStatus::tentative()ParticipationStatus::needs_action()ParticipationStatus::delegated()Vous pouvez indiquer qu'un participant est tenu de RSVP à un événement:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .Un événement peut être rendu transparent, il ne se chevauche donc pas visuellement avec d'autres événements dans un calendrier:
Event :: create ()
-> transparent ()
. . .Il est possible de créer un événement qui s'étend sur une journée complète:
Event :: create ()
-> fullDay ()
. . .Le statut d'un événement peut être défini:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .Il y a trois statuts d'événements:
EventStatus::confirmed()EventStatus::cancelled()EventStatus::tentative() Un événement peut être classé ( public , private , confidential ) en tant que tel:
Event :: create ()
-> classification ( Classification :: private ())
. . .Vous pouvez ajouter une pièce jointe d'URL en tant que telle:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .Vous pouvez ajouter une fixation intégrée (base64) en tant que telle:
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .Vous pouvez ajouter une image en tant que telle:
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 ())
. . .Il existe quatre types d'affichage d'images différents:
Display::badge()Display::graphic()Display::fullsize()Display::thumbnail()Après avoir créé votre événement, il doit être ajouté à un calendrier. Il existe plusieurs options pour ce faire:
// 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 ' );
})
. . .Vous pouvez utiliser la populaire bibliothèque de carbone:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . . Les événements utiliseront les fuseaux horaires définis dans les objets DateTime que vous fournissez. PHP définit toujours ces fuseaux horaires dans un objet DateTime . Par défaut, ce sera le fuseau horaire UTC, mais il est possible de changer cela.
Juste un rappel: n'utilisez pas la fonction setTimezone de PHP sur un objet DateTime , cela changera l'heure en fonction du fuseau horaire! Il est préférable de créer un nouvel objet DateTime avec un fuseau horaire en tant que tel:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))Un point peut être fait pour omettre les fuseaux horaires. Par exemple, lorsque vous souhaitez montrer un événement à midi au monde. Nous définissons midi à 12 heures, mais ce temps est relatif. Ce n'est pas la même chose pour les habitants de la Belgique, de l'Australie ou de tout autre pays dans le monde.
C'est pourquoi vous pouvez désactiver les fuseaux horaires sur les événements:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .Vous pouvez même désactiver les fuseaux horaires pour un calendrier entier:
Calendar :: create ()
-> withoutTimezone ()
. . .Chaque calendrier doit avoir des composants du fuseau horaire décrivant les fuseaux horaires utilisés dans votre calendrier. Bien que tous les clients du calendrier n'en aient pas besoin, il est recommandé d'ajouter ces composants.
Créer de telles composants de fuseau horaire est assez compliqué. C'est pourquoi ce package les ajoutera automatiquement sans configuration.
Vous pouvez désactiver ce comportement en tant que tel:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .Vous pouvez ajouter manuellement les fuseaux horaires à un calendrier si vous le souhaitez comme tel:
$ 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 )
. . .Plus sur ces fuseaux horaires plus tard.
Les alertes permettent aux clients du calendrier d'envoyer des rappels sur des événements spécifiques. Par exemple, Apple Mail sur un iPhone enverra les utilisateurs une notification sur l'événement. Une alerte appartient toujours à un événement a une description et un certain nombre de minutes avant l'événement, il sera déclenché:
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );Vous pouvez également déclencher une alerte après l'événement:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );Ou déclenchez une alerte à une date spécifique:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);La suppression des fuseaux horaires sur un calendrier ou un événement supprimera également les fuseaux horaires sur l'alerte.
Il est possible que les événements se répétent, par exemple votre dîner mensuel d'entreprise. Cela peut être fait en tant que tel:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));Et vous pouvez également répéter l'événement à un ensemble de dates:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);Les règles de récidive ou Rrule sont en bref, permettent d'ajouter un événement répétitif dans votre calendrier en décrivant quand il se répète dans un Rrule. Tout d'abord, nous devons créer un rrule:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ()); Cette règle décrit un événement qui sera répété quotidiennement. Vous pouvez également définir la fréquence sur secondly , minutely , hourly , weekly , monthly ou yearly .
Le Rrule peut être ajouté à un événement en tant que tel:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));Il est possible de Finetune le Rrule à votre goût personnel; Jetons un coup d'œil!
Un rrule peut commencer à partir d'un certain moment:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));Et arrêtez-vous à un certain point:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));Il ne peut être répété que quelques fois, 10 fois par exemple:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );L'intervalle de la répétition peut être modifié:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );Lorsque cet événement commencera lundi, par exemple, la prochaine répétition de cet événement ne se produira pas mardi mais mercredi. Vous pouvez faire de même pour toutes les fréquences.
Il est également possible de répéter l'événement un jour de semaine spécifique:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);Ou un jour de semaine spécifique d'une semaine dans le mois:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);Ou le dernier jour de la semaine d'un mois:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);Vous pouvez répéter un jour spécifique du mois:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );Il est même possible de donner un éventail de jours dans le mois:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);La répétition peut être effectuée pendant certains mois (par exemple uniquement au deuxième trimestre):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);Ou juste sur un seul mois:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);Il est possible de définir le jour où la semaine commence:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);Vous pouvez fournir une date spécifique à laquelle un événement ne sera pas répété:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));Il est également possible de donner un tableau de dates à laquelle l'événement ne sera pas répété:
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 ' )]);Vous pouvez également ajouter des rreles en tant que chaîne:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );Si vous ajoutez des rreles en tant que chaîne, les fuseaux horaires inclus dans DTSTART et jusqu'à ce que vous soyez inconnu du package car la chaîne n'est jamais analysée et évaluée. S'ils sont connus, vous pouvez ajouter DTSTART et jusqu'à ce que le package à découvrir les fuseaux horaires:
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 ' ))
);Vous pouvez utiliser les réponses Laravel au flux pour les applications de calendrier:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );Si vous souhaitez ajouter la possibilité pour les utilisateurs de télécharger un calendrier et de l'importer dans une application de calendrier:
$ 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" ' ,
]);Si vous voulez créer vous-même des composants du fuseau horaire, vous êtes au bon endroit, bien que nous vous conseillons de lire la section sur les fuseaux horaires de la RFC en premier.
Vous pouvez créer un fuseau horaire en tant que tel:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );Il est possible de fournir la dernière date modifiée:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));Ou ajoutez une URL avec plus d'informations sur le fuseau horaire:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );Un fuseau horaire se compose de plusieurs entrées où l'heure du fuseau horaire a changé relatif en UTC, une telle entrée peut être construite pour l'heure standard ou en lumière du jour:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
); Tout d'abord, vous fournissez le type d'entrée ( standard ou daylight ). Puis une DateTime lorsque le temps change. Enfin, un décalage par rapport à l'UTC avant le changement et un décalage par rapport à l'UTC après le changement.
Il est également possible de donner à cette entrée un nom et une description:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );Un rlule pour l'entrée peut être donné comme tel:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));En fin de compte, vous pouvez ajouter une entrée à un fuseau horaire:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );Ou même ajouter plusieurs entrées:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);Maintenant, nous avons construit notre fuseau horaire, il est temps (?) Pour ajouter ce fuseau horaire à notre calendrier:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );Il est également possible d'ajouter plusieurs fuseaux horaires:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);Nous essayons de garder ce package le plus simple possible. C'est pourquoi de nombreuses propriétés et sous-composants de la RFC ne sont pas inclus dans ce package. Nous avons permis d'ajouter d'autres propriétés ou sous-composants à chaque composant si vous avez besoin de quelque chose de non inclus dans le package. Mais soyez prudent! À partir de ce moment, vous implémentez correctement les RFC.
Vous pouvez ajouter une nouvelle propriété à un composant comme ceci:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . . Ici, nous avons ajouté un TextProperty , et il s'agit d'un type de propriété de valeur clé par défaut avec un texte en tant que valeur. Vous pouvez également utiliser l'une des propriétés par défaut incluses dans le package ou créer la vôtre en étendant la classe Property .
Parfois, une propriété peut avoir des paramètres supplémentaires, ce sont des entrées de valeur clé et peuvent être ajoutées aux propriétés en tant que telles:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .Un sous-composant peut être annexé en tant que tel:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . . Il est possible de créer vos sous-composants en étendant la classe Component .
composer testNous recherchons une API simple et facile à utiliser. Vous voulez quelque chose de plus? Consultez ensuite ce package par Markus Poerschke.
Veuillez consulter Changelog pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter la contribution pour plus de détails.
Si vous avez trouvé un bogue concernant la sécurité, veuillez envoyer un mail à sécurité@spatie.be au lieu d'utiliser le tracker du problème.
Vous êtes libre d'utiliser ce package, mais s'il arrive dans votre environnement de production, nous apprécions beaucoup de nous avoir envoyé une carte postale de votre ville natale, mentionnant lequel de nos packages que vous utilisez.
Notre adresse est: Spatie, Kruikstraat 22, Box 12, 2018 Antwerp, Belgique.
Nous publions toutes les cartes postales reçues sur le site Web de notre entreprise.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.