Dans le premier article, j'indiquais comment configurer son compte Google pour pouvoir recevoir des notifications par SMS.
Maintenant que cette partie est faite, nous allons pouvoir entrer dans le vif du sujet et commencer à coder ce qui déclenchera l'envoi du rappel par SMS pour vous tenir au courant des mises à jour de votre site.

Je suppose donc que vous avez configuré tout ce qui est décrit dans le premier article "Côté Google", à savoir : un compte Google d'aide, le partage des agendas, et l'ajout des notifications par défaut.

Ok ? Allons-y !

Avant de rentrer dans le vif du sujet, mettons les choses à plat : nous souhaitons juste ajouter des événements dans l'agenda Google. Les événements seront mis avec une date dans le futur de une minute, ce qui déclenchera l'envoi immédiat du SMS de rappel.
Le bon côté des choses, c'est que Google fournit une API toute faite pour manipuler ses données. Le mauvais côté, c'est qu'il s'agit d'une bonne grosse usine à gaz...
Ce qui m'amène à rappeler les conditions :

  • Un serveur web hébergeant PHP 5.2.4 ou supérieur ;
  • Les extensions PHP suivantes : ctype, dom, libxml, spl, standard, openssl (normalement inclues par défaut dans la plupart des configurations, même gratuites).

Et comme on aime bien savoir où on va, voici le plan que je vais suivre :

  1. Télécharger l'API Google ;
  2. Configurer une page du serveur pour utiliser l'API ;
  3. Tester ;
  4. Insertion d'un événement ;
  5. Tester le final.

Rien de bien compliqué, on est parti !

1. Télécharger l'API Google

Rendez-vous sur http://framework.zend.com/download/gdata et téléchargez la dernière version de la librairie. Décompressez le tout, et envoyez l'intégralité du dossier library sur votre FTP (de façon à avoir un chemin du type chemin/vers/library/Zend/, j'insiste sur la présence du library dans l'arborescence.
Et voilà pour la première étape, on a connu pire.

2. Configurer une page du serveur pour utiliser l'API

Comme je le disais (et comme vous avez pu le constater en uploadant les fichiers), l'API est relativement lourde et il ne parait pas utile de l'inclure à chaque fois. Je vous conseille donc de créer une page notifier.php que vous inclurez quand vous souhaiterez communiquer avec Google.

Dans cette page, il va falloir inclure l'ensemble de l'API Google. Pour cela, il faut indiquer au serveur où se trouve la librairie : un peu comme la variable $PATH sous Linux en fait.

//1 : régler le chemin vers la librairie Google
$clientLibraryPath = substr(__FILE__,0,strrpos(__FILE__,'/')) . '/library';
set_include_path(get_include_path() . PATH_SEPARATOR . $clientLibraryPath);

//2 : charger les librairies
require_once 'Zend/Loader.php';//Adresse connue grâce à l'ajout de la ligne précédente
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');

ATTENTION, ce code suppose que votre page notifier.php est au même niveau que votre dossier library/. Ajustez le code si nécessaire, mais pensez à utiliser un chemin absolu.

3. Tester

À ce point, Google recommande de tester pour vérifier si votre serveur est vraiment compatible. Collez-donc à la suite de votre code le code suivant (sans le <?php, évidemment) le contenu de cette page.
Vous devriez obtenir le résultat suivant :
Installation de Google API OK
Si ce n'est pas le cas, effectuez les modifications demandées.

4. Insertion d'un événement

Parfait, ne reste plus qu'à insérer un élément. À l'aide de la documentation de Google Calendar, on arrive assez rapidement à créer le code correct que je détaille ici.

4.1. Connexion au compte Google

On touche ici à l'intérêt d'avoir crée un compte helper : il va falloir entrer en clair le mot de passe dans la page. Et pour ce genre de situations, mieux vaut n'offrir au hacker potentiel que votre compte inutile !

//3 : connexion
$user='This email address is being protected from spambots. You need JavaScript enabled to view it.';
$pass='mdp';
$service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;

$client = Zend_Gdata_ClientLogin::getHttpClient($user,$pass,$service);

4.2. Insertion de l'élément

Une fois connecté, reste à insérer un élément. On va se servir de la fonction time() qui renvoie le timestamp actuel et de la fonction date() qui permet de formater ce nombre à la manière voulue.
Il faut aussi préciser le fuseau horaire sur lequel on se situe, "+01" en France.

//4 : Insertion de l'élément

$start=time()+130;
$startDate = date('Y-m-d',$start);//2009-11-23';
$startTime = date('H:i',$start);

$tzOffset = '+01';

$gdataCal = new Zend_Gdata_Calendar($client);
$newEvent = $gdataCal->newEventEntry();

$newEvent->title = $gdataCal->newTitle($notifTitre);
$newEvent->content = $gdataCal->newContent($notifDesc);

$when = $gdataCal->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
$newEvent->when = array($when);
$event = $gdataCal->insertEvent($newEvent);

(Bien évidemment, à vous de régler correctement les variables $notifTitre et $notifDesc qui contiennent respectivement le titre et la description de l'évènement à ajouter.
Précisons que le titre ne doit pas dépasser 60 caractères pour recevoir le SMS valide, et que la description ne sera pas visible dans la notification.
)

Normalement, vous devriez vous demander : pourquoi ce +130 dans le code ?
En fait, il faut ajouter au moins 60 secondes puisque la notification sera déclenchée une minute avant l'évènement : si on mettait la date exacte, le rappel ne serait pas envoyé.
À ces 60 secondes viennent s'ajouter 10 secondes "de latence", qui prennent en compte la possibilité d'un lag du serveur google / de votre serveur / des échanges réseaux : déjà 70 secondes.
Enfin, vous aurez remarqué que la définition de la date se fait sans les secondes : en conséquence, si on en est à 59 secondes de la minute actuelle, on a 59 secondes de retard pour l'évènement... et une nouvelle fois, la notification ne sera pas envoyée car l'évènement n'est pas enregistré assez loin dans le futur. Au final, 60 + 10 + 60 = 130.
J'ajoute que le deuxième 60 n'est pas utile dans tous les cas (en théorie, on pourrait donc faire 130 - date('s')) ; c'est son utilisation qui fait que vous ne recevrez pas instantanément le SMS (latence d'une minute).

5. Tester le final

Je vous conseille d'ajouter tout en haut de votre script la ligne suivante, qui vous permettra de réaliser des tests et aussi de vérifier la cohérence de vos appels :

//0 : Avant d'appeler le script, penser à  préciser les variables
//$notifTitre = 'Ttitre';
//$notifDesc='Description';
if(!isset($notifTitre) || !isset($notifDesc))
{
	if(!isset($_GET['test']))
		exit('Paramétres mal spécifiés');
	$notifTitre="(defaut)";
	$notifDesc='';
}

Il ne vous reste plus qu'à appeler la page notifier.php?test pour tester votre réalisation... sous 90 secondes, vous devriez recevoir votre SMS. Alors, on dit merci qui ?

Code complet

Pour les fainéants, voici l'intégralité du code :

newEventEntry();

$newEvent->title = $gdataCal->newTitle($notifTitre);
//$newEvent->where = array($gdataCal->newWhere($where));
$newEvent->content = $gdataCal->newContent($notifDesc);

$when = $gdataCal->newWhen();
$when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
$newEvent->when = array($when);

$event = $gdataCal->insertEvent($newEvent);

Je vous laisse connecter cette page avec votre fonction d'ajout d'article / de commentaire : il suffit de régler les deux $notif et d'inclure la page.