¿Quiere crear calendarios en línea para que pueda mostrarlos en la aplicación de calendario de un iPhone o en el calendario de Google? Esto se puede hacer generando calendarios en el formato icalendar (RFC 5545), un formato textual que puede ser cargado por diferentes aplicaciones.
El formato de tales calendarios se define en RFC 5545, que no es una experiencia de lectura agradable. Este paquete implementa RFC 5545 y algunas extensiones de RFC 7986 para proporcionarle una API fácil de usar para crear calendarios. No es nuestra intención implementar estos RFC por completo, sino proporcionar una API directa que sea fácil de usar.
Aquí hay un ejemplo de cómo usarlo:
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 ();
El código anterior generará esta cadena:
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
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto en clase. Puede apoyarnos comprando uno de nuestros productos pagados.
Apreciamos encarecidamente que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrará nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro de postal virtual.
Puede instalar el paquete a través del compositor:
composer require spatie/icalendar-generator
Hubo algunos cambios sustanciales entre V1 y V2 del paquete. Consulte la guía de actualización para obtener más información.
Así es como puedes crear un calendario:
$ calendar = Calendar :: create ();
Puedes dar un nombre al calendario:
$ calendar = Calendar :: create ( ' Laracon Online ' );
Se puede agregar una descripción a un calendario:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );
Al final, desea convertir su calendario en texto para que pueda transmitirse o descargar al usuario. Así es como haces eso:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...
Al transmitir un calendario a una aplicación, es posible establecer el intervalo de actualización del calendario por duración en minutos. Al configurar esto, la aplicación del calendario verificará su servidor cada vez después de la duración especificada para los cambios en el calendario:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .
Se puede crear un evento de la siguiente manera. No se requiere un nombre, pero siempre se debe dar una fecha de inicio:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));
Puede establecer las siguientes propiedades en un evento:
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 ' ));
¿Quieres crear un evento rápidamente con una fecha de inicio y finalización?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));
Puede agregar una ubicación a un evento de tal:
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .
Puede establecer el organizador de un evento, se requiere la dirección de correo electrónico, pero se puede omitir el nombre:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .
Los asistentes a un evento se pueden agregar como tal:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .
También puede establecer el estado de participación de un asistente:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .
Hay cinco estados de participación:
ParticipationStatus::accepted()
ParticipationStatus::declined()
ParticipationStatus::tentative()
ParticipationStatus::needs_action()
ParticipationStatus::delegated()
Puede indicar que se requiere que un asistente confirme a un evento:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .
Un evento puede hacerse transparente, por lo que no se superpone visualmente con otros eventos en un calendario:
Event :: create ()
-> transparent ()
. . .
Es posible crear un evento que abarque un día completo:
Event :: create ()
-> fullDay ()
. . .
Se puede establecer el estado de un evento:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .
Hay tres estados de eventos:
EventStatus::confirmed()
EventStatus::cancelled()
EventStatus::tentative()
Se puede clasificar un evento ( public
, private
, confidential
) como tal:
Event :: create ()
-> classification ( Classification :: private ())
. . .
Puede agregar un accesorio de URL como tal:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .
Puede agregar un accesorio incrustado (base64) como tal:
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .
Puede agregar una imagen como tal:
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 ())
. . .
Hay cuatro tipos de visualización de imágenes diferentes:
Display::badge()
Display::graphic()
Display::fullsize()
Display::thumbnail()
Después de crear su evento, debe agregarse a un calendario. Hay múltiples opciones para hacer esto:
// 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 ' );
})
. . .
Puede usar la popular biblioteca de carbono:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . .
Los eventos utilizarán las zonas horarias definidas en los objetos DateTime
que proporcione. PHP siempre establece estas zonas horarias en un objeto DateTime
. Por defecto, esta será la zona horaria de UTC, pero es posible cambiar esto.
Solo un recordatorio: no use la función setTimezone
de PHP en un objeto DateTime
, ¡cambiará el tiempo de acuerdo con la zona horaria! Es mejor crear un nuevo objeto DateTime
con una zona horaria como tal:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))
Se puede hacer un punto para omitir las zonas horarias. Por ejemplo, cuando quieres mostrar un evento al mediodía en el mundo. Definimos al mediodía a las 12 en punto, pero ese tiempo es relativo. No es lo mismo para las personas en Bélgica, Australia o cualquier otro país del mundo.
Es por eso que puedes deshabilitar las zonas horarias en los eventos:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .
Incluso puede deshabilitar las zonas horarias para un calendario completo:
Calendar :: create ()
-> withoutTimezone ()
. . .
Cada calendario debe tener componentes horarios que describan las zonas horarias utilizadas dentro de su calendario. Aunque no todos los clientes calendario requieren esto, se recomienda agregar estos componentes.
Crear tales componentes horarios es bastante complicado. Es por eso que este paquete los agregará automáticamente sin configuración.
Puede deshabilitar este comportamiento como tal:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .
Puede agregar manualmente las zonas horarias a un calendario si lo desea como tal:
$ 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 )
. . .
Más sobre estas zonas horarias más tarde.
Las alertas permiten a los clientes calendario enviar recordatorios sobre eventos específicos. Por ejemplo, Apple Mail en un iPhone enviará a los usuarios una notificación sobre el evento. Una alerta siempre pertenece a un evento tiene una descripción y varios minutos antes del evento se activará:
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );
También puede activar una alerta después del evento:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );
O activar una alerta en una fecha específica:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);
Eliminar las zonas horarias en un calendario o evento también eliminará las zonas horarias en la alerta.
Es posible que los eventos repitan, por ejemplo, la cena mensual de su compañía. Esto se puede hacer como tal:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
Y también puede repetir el evento en un conjunto de fechas:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);
En resumen, las reglas de recurrencia o RRULE, permiten agregar un evento de repetición en su calendario describiendo cuándo se repite dentro de un RRULE. Primero, tenemos que crear un rRule:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ());
Esta regla describe un evento que se repetirá diariamente. También puede establecer la frecuencia en secondly
, minutely
, hourly
, weekly
, monthly
o yearly
.
El rRule se puede agregar a un evento como tal:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
Es posible finentar el rRule a su gusto personal; ¡Echemos un vistazo!
Un rRule puede comenzar desde cierto punto en el tiempo:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));
Y pare en cierto punto:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));
Solo se puede repetir por varias veces, 10 veces por ejemplo:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );
El intervalo de la repetición se puede cambiar:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );
Cuando este evento comience el lunes, por ejemplo, la próxima repetición de este evento no ocurrirá el martes sino el miércoles. Puede hacer lo mismo para todas las frecuencias.
También es posible repetir el evento en un día de semana específico:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);
O en un día de semana específico de una semana en el mes:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);
O el último día de la semana de un mes:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);
Puede repetir en un día específico en el mes:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );
Incluso es posible dar una variedad de días en el mes:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);
La repetición se puede hacer durante ciertos meses (por ejemplo solo en el segundo trimestre):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);
O simplemente en un mes solo:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);
Es posible establecer el día en que comience la semana:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);
Puede proporcionar una fecha específica en la que no se repetirá un evento:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
También es posible dar una variedad de fechas en las que el evento no se repite:
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 ' )]);
Alternativamente, puede agregar rRules como una cadena:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );
Si agrega rRules como una cadena, las zonas horarias incluidas en DTStart y hasta que se desconoce para el paquete, ya que la cadena nunca se analiza y evalúa. Si son conocidos, puede agregar dtstart y hasta que se separe para ayudar al paquete a descubrir las zonas horarias:
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 ' ))
);
Puede usar respuestas de Laravel a aplicaciones de transmisión a calendario:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );
Si desea agregar la posibilidad de que los usuarios descarguen un calendario e lo importen en una aplicación de calendario:
$ 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 desea crear componentes de la zona horaria usted mismo, está en el lugar correcto, aunque le recomendamos que lea la sección sobre las zonas horarias de la RFC primero.
Puede crear una zona horaria como tal:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );
Es posible proporcionar la última fecha modificada:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));
O agregue una URL con más información sobre la zona horaria:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );
Una zona horaria consta de múltiples entradas donde la hora de la zona horaria cambió en relación con UTC, dicha entrada se puede construir para la hora estándar o de luz del día:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
);
En primer lugar, proporciona el tipo de entrada ( standard
o daylight
). Luego una DateTime
cuando cambia el tiempo. Por último, un desplazamiento relativo a UTC desde antes del cambio y un desplazamiento en relación con UTC después del cambio.
También es posible darle a esta entrada un nombre y descripción:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );
Se puede dar un rRule para la entrada como tal:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));
Al final puede agregar una entrada a una zona horaria:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );
O incluso agregar múltiples entradas:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);
Ahora hemos construido nuestra zona horaria, es hora (?) Agregar esta zona horaria a nuestro calendario:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );
También es posible agregar múltiples zonas horarias:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);
Tratamos de mantener este paquete lo más directo posible. Es por eso que muchas propiedades y subcomponentes del RFC no están incluidos en este paquete. Hemos permitido agregar otras propiedades o subcomponentes a cada componente si puede necesitar algo que no se incluya en el paquete. ¡Pero ten cuidado! A partir de este momento, está por su cuenta implementando correctamente los RFC.
Puede agregar una nueva propiedad a un componente como este:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . .
Aquí hemos agregado una TextProperty
, y este es un tipo de propiedad de valor clave predeterminado con un texto como valor. También puede usar una de las propiedades predeterminadas incluidas en el paquete o crear la suya extendiendo la clase Property
.
A veces, una propiedad puede tener algunos parámetros adicionales, estos son entradas de valor clave y se pueden agregar a las propiedades como tales:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .
Se puede agregar un subcomponente como tal:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . .
Es posible crear sus subcomponentes extendiendo la clase Component
.
composer test
Nos esforzamos por una API simple y fácil de usar. ¿Quieres algo más? Luego mira este paquete de Markus Poerschke.
Consulte ChangeLog para obtener más información sobre lo que ha cambiado recientemente.
Consulte contribuyendo para obtener más detalles.
Si ha encontrado un error con respecto a la seguridad, envíe un correo electrónico a [email protected] en lugar de usar el rastreador de problemas.
Usted es libre de usar este paquete, pero si llega a su entorno de producción, apreciamos que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando.
Nuestra dirección es: Spatie, Kruikstraat 22, Box 12, 2018 Amberes, Bélgica.
Publicamos todas las postales recibidas en el sitio web de nuestra empresa.
La licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.