Hola a todos:
Si mostramos eventos en una página web puede ser interesante añadir un botón para que el visitante pueda pinchando en el añadir el evento a su calendario en google calendar.
He creado una función en php que nos permite de forma sencilla crear la url necesaria para crear el enlace que nos cree el evento en google calendar:
<?php /******************************************************************** * Función getGCalendar (Eduardo Revilla Vaquero) * * Genera url para la creación de un evento en google calendar. * *********************************************************************/ function getGCalendarUrl($event){ $titulo = urlencode($event['titulo']); $descripcion = urlencode($event['descripcion']); $localizacion = urlencode($event['localizacion']); $start=new DateTime($event['fecha_inicio'].' '.$event['hora_inicio'].' '.date_default_timezone_get()); $end=new DateTime($event['fecha_fin'].' '.$event['hora_fin'].' '.date_default_timezone_get()); $dates = urlencode($start->format("Ymd\THis")) . "/" . urlencode($end->format("Ymd\THis")); $name = urlencode($event['nombre']); $url = urlencode($event['url']); $gCalUrl = "http://www.google.com/calendar/event?action=TEMPLATE&text=$titulo&dates=$dates&details=$descripcion&location=$localizacion&trp=false&sprop=$url&sprop=name:$name"; return ($gCalUrl); }
La función recibe como parámetro un array asociativo con los campos necesarios para crear el evento.
Un ejemplo del array sería este:
$evento = array( 'titulo' => 'Mi evento de prueba', 'descripcion' => 'Descripcion del evento de prueba', 'localizacion' => 'Aqui ponemos la dirección donde se celebra el evento', 'fecha_inicio' => '2014-04-10', // Fecha de inicio de evento en formato AAAA-MM-DD 'hora_inicio'=>'17:30', // Hora Inicio del evento 'fecha_fin'=>'2014-04-12', // Fecha de fin de evento en formato AAAA-MM-DD 'hora_fin'=>'19:00', // Hora final del evento 'nombre'=>'ReviBlog', // Nombre del sitio 'url'=>'www.reviblog.net' // Url de la página );
Ahora solo nos queda crear el link en html asignandole la url devuelta por la función getGCalendarUrl:
<a href="<?php echo getGCalendarUrl($evento); ?>"><img src="http://www.google.com/calendar/images/ext/gc_button6_es.gif" border="0"></a>
Para probarlo puedes crear un archivo php y pegar el siguiente código donde todo junto quedaria así:
<?php /******************************************************************** * Función getGCalendar (Eduardo Revilla Vaquero) * * Genera url para la creación de un evento en google calendar. * *********************************************************************/function getGCalendarUrl($event){ $titulo = urlencode($event['titulo']); $descripcion = urlencode($event['descripcion']); $localizacion = urlencode($event['localizacion']); $start=new DateTime($event['fecha_inicio'].' '.$event['hora_inicio'].' '.date_default_timezone_get()); $end=new DateTime($event['fecha_fin'].' '.$event['hora_fin'].' '.date_default_timezone_get()); $dates = urlencode($start->format("Ymd\THis")) . "/" . urlencode($end->format("Ymd\THis")); $name = urlencode($event['nombre']); $url = urlencode($event['url']); $gCalUrl = "http://www.google.com/calendar/event?action=TEMPLATE&text=$titulo&dates=$dates&details=$descripcion&location=$localizacion&trp=false&sprop=$url&sprop=name:$name"; return ($gCalUrl); } // array asociativo con los parametros mecesarios. $evento = array( 'titulo' => 'Mi evento de prueba', 'descripcion' => 'Descripcion del evento de prueba', 'localizacion' => 'Aqui ponemos la dirección donde se celebra el evento', 'fecha_inicio' => '2014-04-10', // Fecha de inicio de evento en formato AAAA-MM-DD 'hora_inicio'=>'17:30', // Hora Inicio del evento 'fecha_fin'=>'2014-04-12', // Fecha de fin de evento en formato AAAA-MM-DD 'hora_fin'=>'19:00', // Hora final del evento 'nombre'=>'ReviBlog', // Nombre del sitio 'url'=>'www.reviblog.net' // Url de la página ); ?> <a href="<?php echo getGCalendarUrl($evento); ?>"><img src="http://www.google.com/calendar/images/ext/gc_button6_es.gif" border="0"></a>
Este código nos generará un botón como este:
Espero que sea de utilidad.
Un saludo, y si aún no lo has hecho no olvides suscribirte a mi blog para no perderte los próximos posts :-),También puedes seguirme en Twitter en @revigames y no olvides que me ayudas mucho si compartes este post en las redes sociales.
Muy útil. Muchas gracias por la información, estoy deseando probarlo para ver si funciona.
Gracias por comentar, espero que te sea de utilidad.
es una gran función
Gracias Andres 🙂
Estudio Ingeniería en Computación, lo probé y funciona perfecto. Con su permiso lo usaré como parte de mi tesis, dada a su gran funcionalidad. Saludos desde Chile.
Me alegro de que te sirva de utilidad, puedes utilizar libremente el código y cualquier contenido de este blog para lo que necesites.
Gracias por tu comentario y suerte con tu tesis 🙂
Gracias amigo, muy bueno.
Hola Eduardo, me podrías decir qué librería de cliente utilizas?? Tu ejemplo me funciona perfectamente, pero quiero hacerlo yo y no hay manera 🙁
Un saludo y muchas gracias. Ana
Hola Ana,
No se necesita ninguna librería de cliente. En principio llamando a la función pasándole los parámetros como indico debería funcionar. ¿Puedes poner el código que estás utilizando para crear el botón para ver si hay algún error y te puedo ayudar?
Gracias por comentar
<?php
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_CalendarService.php';
$opcion="insertar";
…
En realidad, mi problema es este:
Warning: require_once(google-api-php-client/src/Google_Client.php): failed to open stream
Necesito insertar, modificar, eliminar eventos en un calendario utilizando PHP, hace "mil años" que abandoné la programación y ahora estoy muy perdida con todo esto.
En todos los manuales que encuentro, me dicen que necesito la biblioteca… Como puedes ver estoy muy, muy liada 🙁
Muchas gracias por tu respuesta. Ana.
Hola de nuevo Ana:
Yo en mi post enseño como añadir un evento de manera sencilla generando una url. Esto nos sirve para colocar un botón o un enlace en nuestra página para añadir un evento a google calendar. Si necesitas modificar o eliminar el evento desde php entonces si te hace falta utilizar las librerías que comentas. En ese caso el error que te está dando es que no encuentra ese archivo. Verifica que se encuentra en la ruta correcta a partir de la ruta relativa al archivo que le llama. Por otro lado en este link: http://blogs.ua.es/labseps/2014/10/17/insertar-un-evento-en-un-calendario-publico-de-google-con-php-y-la-api-v3/ he encontrado información que tal vez te sirva de ayuda. No desesperes Ana, la programación puede ser difícil si llevas tiempo sin programar, pero cuando por fin lo consigues es una satisfacción muy grande :-). Ánimo que ya verás como al final lo consigues 🙂
Un saludo
Hola de nuevo, Eduardo:
Muchísimas gracias por tus ánimos, por supuesto que lo voy a conseguir 🙂 y además te lo contaré 😉
Mira, esa página que me envías, la tengo mirada de arriba a abajo. Pero cuando tú me la has indicado, la he vuelto a revisar y he entrado donde pone “… Nos hemos basado principalmente en las indicaciones de este artículo…” Ahí, en la documentación anterior, he encontrado el comentario de un chico, Kyle Fritz, que “se quejaba” de la falta de actualización en la documentación de Google cuando se producen cambios…
En su comentario sí se reflejaban esos cambios y finalmente he conseguido que mi biblioteca FUNCIONE!!!!
Te pongo lo que te escribí en el mensaje anterior, pero esta vez actualizado:
<?php
require_once 'google-api-php-client/src/Google/Client.php';
require_once 'google-api-php-client/src/Google/Service/Calendar.php';
…
Una vez más, muchísimas gracias!!! 😉 … prometo volver a preguntarte alguna duda otro día 😛
Saludos, Ana.
Serás bien recibida, prometo contestarte si mis conocimientos me lo permiten 😉
Muy super útil, muchas gracias.
Hola Eduardo, gracias por el código. Existe algo similar para usuarios de iOS (iphone/ipad) ?
Gracias, saludos
Hola Mark:
Para poder añadir eventos al calendario en iOS (iCalendar) necesitas generar un archivo .ics, lo puedes generar a mano o con algún lenguaje de servidor(php etc), pero no puedes hacerlo directamente desde una url. Lo que si puedes hacer es que esa url enlace al archivo ics.
El el contenido del archivo ics tiene que tener un aspecto similar a esto:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR
Para más información echa un vistazo a este articulo wikipedia:
https://en.wikipedia.org/wiki/ICalendar
Un saludo
Se podría añadir un fichero adjunto al evento del calendario? Gracias
Hola trevice, no se puede añadir un fichero adjunto por este método.
Hola!
Consulta, existe algún parámetro en la URL para que el evento de cree de forma automática?
Fastastico tutorial. ¿Seria posible indicar un calendario en concreto? De la misma manera que ponemos una fecha o descripción por defecto, indicar también el calendario. Intento hacerlo con calendarID=$cal& donde $cal es el id del calendario que quiero, pero por defecto siempre se el mismo…
Hola Pedro, me temo que no es posible, o yo por lo menos no he encontrado la manera de hacerlo.
Muchas gracias por comentar.
Un saludo
Siento comentar el artículo 3 años después de su creación, pero veo que tú contestas los comentarios (algo que se agradece por cierto) y me ha surgido una duda respecto a este método… :).
¿Sabes si existe la manera, mediante parámetros (como en tu ejemplo), de agregar la frecuencia del evento? En lugar de clicar en “Repetir” > “Anual” poder pasarle algún parámetro del estilo “FREQ=YEARLY”?
Gracias, un saludo!
Hola Javier,
yo no he encontrado ningún parámetro para poder indicarle directamente la frecuencia del evento, me temo que no es posible, no obstante si descubres la manera de hacerlo sería de agradecer que lo comentases aquí para ayudar a otros que tengan la misma duda.
Muchas gracias por comentar.
Un saludo
Disculpe, existira alguna forma de poder crear el evento automaticamente?
Estaba buscando esa informacion hace edad, te lo agradezco,
estoy de contrato con tu punto de vista y pienso igual.
Despues de buscar mucho por Internet encontre lo
que buscaba. Genial!!! muchas gracias
Buenisimo!
Tengo una pagina web de alquiler de autocaravanas y para poder gestionar mejor las reservas habia pensado en sincronizar de alguna manera que cada vez que se haga una reserva se cree un evento en google calendar para poder verlo desde el movil, lo ves viable?
Toda la pagina esa en php . Boosstrap.
Gracias!!
Hola Aitor, gracias por tu comentario.
La función que muestro en este post (que por cierto ya es bastante antiguo) nos sirve para crear un botón que directamente te abra google calendar con los datos del evento insertados en un nuevo evento, pero el usuario tiene que guardar el evento después para insertarlo en el calendario.
Para lo que tú necesitas tendrías que llamar a la API de google calendar desde el servidor, requiere autorización y el proceso es un poco más complejo porque tendrás que crear una aplicación en la consola de google para poder utilizar la API.
Te dejo el link a la documentación oficial de la API google calendar por si te sirve de ayuda:
https://developers.google.com/calendar/v3/reference/events/insert#php
Un saludo.
Hola, también tienes ejemplos con angular