tus camisetas frikis en camisetafriki.com

Archive

Posts Tagged ‘zend’

Google Calendar API + PHP (II), consultar eventos de otros calendarios

July 9th, 2009 No comments

Bueno, sigo en mis trece de hacer que esto funcione, y quién sabe, hacer algo rentable de ello.

El caso es que como ya conseguí insetar los eventos en mi calendario recién creado, quería ver que los eventos que iba a meter no existían ya.

Para esto lo más cómodo es averiguar la cadena que identifica al calendario, pero ojo, porque no es ni el id del calendario ($calFeed[i]->id->text) ni la URL ($calFeed[i]->link[0]->href) sino una cadena que las contiene. Lo más rapido es quitar la URL base que no nos interesa para que nos quede el userID del calendario (que parece ser distinto para cada calendario).

$user = str_replace(Zend_Gdata_Calendar::CALENDAR_FEED_URI.'/default/', "", $calFeed[6]->id->text);

Después, hacemos una query a ESE calendario:

1
2
3
4
5
6
7
8
9
$gdataCal = new Zend_Gdata_Calendar($client);
	$query = $gdataCal->newEventQuery();
	$query->setUser($user);
	$query->setVisibility('private');
	$query->setProjection('full');
	$query->setOrderby('starttime');
	$query->setStartMin($fechaIni);
	$query->setStartMax($fechafin);
	$eventFeed = $gdataCal->getCalendarEventFeed($query);

Y luego ya, podemos reccorer sus eventos:

10
11
12
13
14
15
16
foreach ($eventFeed as $event)
	{
	 	echo "Comprobando ".$event->title->text."<br>";	    
		foreach ($event->when as $when) {
			echo $when->startTime."<br>";
		}
	}

Si no queremos hacer una búsqueda por parámetros sino sacarlos todos, es más fácil, primero sacamos el enlace al calendario:

1
$url = $calFeed[1]->link[0]->href;

Y después pedimos los eventos:

2
$events = $gdataCal->getCalendarEventFeed($url);

(Fuente: http://www.zfforums.com/zend-framework-components-13/web-web-services-22/gdata-how-get-other-calendar-than-default-one-245.html)

De verdad que no se por qué la API esta está tan mal documentada…

Google Calendar API + PHP (I)

July 5th, 2009 1 comment

Bueno, llevo un par de días pegándome con una chorrada de aplicación que se me había ocurrido hacer por entretenimiento y al final ha resultado la mar de estresante, aunque eso si, puedo decir que he aprendido algunos entresijos de las APIs de Google, en concreto de la de calendar, aunque en definitiva son todas parecedas, ya que se basan en el envío de XML a través de métodos POST previa autenticación con Google por 3 vías diferentes.

Como hay miles de tutoriales por ahí para empezar, prefiero comentar problemas que haya ido encontrando, además, como todo buen programador masoquista, paso de usar la libreria-para-tontos de PHP basada en Zend Framework que hay creada para usar, aunque al final he tenido que sucumbir, no por voluntad propia, sino por un error 411 Length Required que no hacía más que salirme por mucho que cambiase las cabeceras del POST, así que solución 1, pasarse a la librería Zend, solución 2, ver como porras lo hace la librería para copiarlo xD

Para mas inri, el error me lo estaba dando al crear un nuevo calendario enviando por POST el xml que hace falta para indicar que se desea crearlo, me pasé a la librería Zend pensando que ahí habría algún método mágico tipo createCalendar al igual que hay uno para crear eventos. Craso error amigo mío, cuando veo que ni por asomo hay una función para crear calendarios. Menos mal que rebuscando por ahí, un alma caritativa da una solución que ya se me había ocurrido y no sabía hacer, que es, nuevamente, enviar por POST el xml a pelo (pero esta vez con la libreria Zend) y voilá! funcionó :D

Para crear un calendario nuevo, se debe escribir el XML correspondiente, se puede usar una plantilla como la siguiente:
$xmlEntry = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' xmlns:gCal='http://schemas.google.com/gCal/2005'> <title type='text'>[TITLE]</title> <summary type='text'>[SUMMARY]</summary> <gCal:timezone value='Spain/Madrid'></gCal:timezone> <gCal:hidden value='false'></gCal:hidden> <gCal:color value='[COLOR]'></gCal:color> <gd:where rel='' label='' valueString='Madrid'></gd:where> </entry>";

De ahí solo hay que rellenar 3 cosas, [TITLE] que es el nombre del calendario, [SUMMARY] que es el resumen (y no es importante) y [COLOR] que define el color de la etiqueta del calendario y no puede ser cualquier color sino uno de estos:
'#A32929'
'#B1365F',
'#7A367A',
'#5229A3',
'#29527A',
'#2952A3',
'#1B887A',
'#28754E',
'#0D7813',
'#528800',
'#88880E',
'#AB8B00',
'#BE6D00',
'#B1440E',
'#865A5A',
'#705770',
'#4E5D6C',
'#5A6986',
'#4A716C',
'#6E6E41',
'#8D6F47',

(que no se cual es cual…)

Total, que una vez sustituidos los campos de la plantilla con nuestros datos del calendario, pues hay que autenticarse si no lo estamos ya, y enviar el POST así:

function crearCalendario($nombre, $resumen, $client)
{
	$gdataCal = new Zend_Gdata_Calendar($client);
	$uri = 'http://www.google.com/calendar/feeds/default/owncalendars/full';	
	$xmlEntry = str_replace('[TITLE]', $nombre, $xmlEntry);
	$xmlEntry = str_replace('[SUMMARY]',	$resumen, $xmlEntry);
	$gdataCal->post($xmlEntry, $uri);
}

También se puede guardar el xml en un archivo plantilla, por ejemplo createcal.xml y cargarlo antes de sustituir:
$xml = file_get_contents('createcal.xml');

Después de ejecutar esto vamos a Google Calendar (o listamos de nuevo los calendarios) y vemos que el calendario que le hemos dicho se ha creado correctamente.

Por cierto, para los que usan WAMP como servidor local de prueba, para usar las librerias Zend hay que ir al php.ini pero no el de la carpeta PHP sino al de Apache (C:\wamp\bin\apache\Apache2.2.11\bin\php.ini) y buscar la línea que empieza por ;include_path, quitarle el ; del principio y añadir al final la ruta del disco duro hasta la carpeta library del directorio donde hemos descargado el Zend (línea 528: include_path = “.;c:\php\includes;C:\wamp\apps\ZendGdata-1.8.4\library”)