2009-05-12 6 views
11

Je suis en train de créer un blog pour quelqu'un. Ils veulent extraire beaucoup de données et les intégrer assez étroitement dans la conception, de sorte que les widgets standard sont un non-non. Ça s'est bien passé jusqu'à maintenant. Ils ont un accès public Google Agenda avec divers événements et je veux saisir les 5 prochains événements (à partir de "maintenant") et afficher le titre de l'événement, quand cette instance de l'événement commence, son emplacement et un lien vers l'article gcal. D'après ce que je peux voir, il y a trois options pour saisir les flux gcal: XML, ical ou HTML (contenant du vrai JSON). XML semble être le choix logique, non?Obtenir des événements Google Agenda en PHP

Eh bien le flux XML est (après la description du flux atomique) en fait juste beaucoup de faffy HTML. L'analyse est possible mais c'est une énorme douleur dans le derrière parce que les événements récurrents (dont il y en a plusieurs sur le calendrier) montrent seulement la première instance de cet événement et (apparemment) aucune information sur la prochaine instance.

Alors, est-ce que je suis juste un peu dense? Existe-t-il un moyen de montrer ce que je veux juste hacker à travers l'API XML?

Ou aurais-je plus de chance avec iCal? Je n'ai jamais fait d'iCal avec PHP, donc si vous avez, suggérez toutes les libs que vous avez utilisées pour rendre les choses plus simples.

Edit: grâce à la réponse, je téléchargé le pack Zend Gdata (qui, heureusement, est séparée du reste du Zend Framework). Faire ce que je besoin était aussi facile que cela:

require_once 'Zend/Loader.php'; 
Zend_Loader::loadClass('Zend_Gdata'); 
Zend_Loader::loadClass('Zend_Gdata_HttpClient'); 
Zend_Loader::loadClass('Zend_Gdata_Calendar'); 
$service = new Zend_Gdata_Calendar(); 
$query = $service->newEventQuery(); 

$query->setUser('[email protected]'); 

$query->setVisibility('public'); 
$query->setProjection('full'); 
$query->setStartMin(date('Y-n-j')); 
$query->setStartMax(date('Y-n-j', time() + (60*60 *24*8))); 
$query->setOrderby('starttime'); 

try { $eventFeed = $service->getCalendarEventFeed($query); } 
catch (Zend_Gdata_App_Exception $e) { return; } 

foreach ($eventFeed as $event) 
    echo $event; // do something real here 

Cela devrait vous avoir pour des événements (oui setStartMax est exclusif couchait il 8 jours à l'avenir est nécessaire) une semaine.

J'espère que cela aidera quelqu'un d'autre à l'avenir.

Répondre

8

Une autre option consiste à utiliser la bibliothèque de calendrier Zend Google, il est une partie distincte du cadre zend afin que vous n'avez pas besoin tout le zend framework

http://framework.zend.com/manual/en/zend.gdata.calendar.html

il est pas si difficile une fois que vous jetez un oeil aux exemples.

+0

Je l'ai vu avant de demander mais a été effrayé par le "Zend" dans le nom. Maintenant, vous avez dit que je n'ai pas besoin de toute la structure de cludging, je vais y jeter un coup d'œil. Merci. – Oli

1

Comme une tête à quiconque utilisant le code, echo $event; n'affichait rien pour moi, donc je pensais que la requête échouait.

Voici un extrait qui devrait imprimer quelque chose:

foreach ($eventFeed as $event) { 
    echo $event->title->text . '<br />'; 
} 
3

Dans le cas où il aide quelqu'un d'autre, je me suis dit comment obtenir des calendriers autres que la valeur par défaut. Si vous allez dans votre agenda google et que vous recherchez des paramètres de calendrier, vous trouverez au bas de la page un ID d'agenda formaté comme une adresse e-mail très longue (exemple: [email protected]). Utilisez-le avec $ query- > setUser() pour utiliser ce calendrier spécifique.

+0

Merci ... été récurer le web pour savoir comment faire cela! –

Questions connexes