Atom est une spécification XML qui identifie les informations contenues dans un site Web. L’utilisation d’Atom permet aux développeurs Web de produire des flux (feeds) permettant aux autres développeurs de sites Web, et même des consommateurs qui utilisent des lecteurs de flux, de localiser rapidement et d’afficher des informations d’intérêt sur un site distant.
En PHP on peut facilement produire un flux Atom qui peut ensuite être mis à la disposition des différents lecteurs de flux et des autres développeurs Web.
Qu’est-ce qu’Atom ?
Atom, tel qu’il est utilisé ici, se réfère à un langage XML vous permettant de syndiquer le contenu de votre site Web pour vos différents consommateurs. En utilisant Atom, vous êtes en mesure de créer un flux Web dans un format normalisé. Ce flux permet aux utilisateurs de lire le contenu du site Web avec un logiciel appelé agrégateur (par exemple Google Reader). Il permet également aux autres développeurs Web de publier votre contenu sur leurs propres sites Web.
Atom n’est pas la norme de syndication seulement en usage aujourd’hui. RSS est un format normalisé (également en utilisant XML), antérieur à Atom. En fait, Atom a été créé en réponse à certaines limitations des flux RSS.
Par conséquent, la spécification Atom contient de nombreux avantages par rapport à RSS. Atom est un moyen pour définir le format des données fournies, par exemple HTML, XHTML, et ainsi de suite contrairement au format RSS. Atom, contrairement à RSS, supporte l’internationalisation avec xml:lang attribute
.
Pourquoi PHP avec Atom ?
PHP est un langage de script qui produit un contenu dynamique côté serveur. Il travaille en complément de l’HTML pour produire le contenu dynamique.
En réponse à la question au début de cette section, PHP permet aux développeurs une flexibilité de production de contenu dynamique dans un format facile à lire et facile à développer. Le contenu dynamique est récupéré à partir d’une base de données MySQL. Le moteur d’exécution est codé en PHP afin que la sortie XML soit conforme à la spécification Atom.
Notez que les explications dans cet article ont été écrites en supposant que vous êtes familiarisé avec les bases de MySQL et PHP. Si vous ne l’êtes pas, consultez les liens vers des tutoriels d’initiation à la fin de cet article.
Définition du cas d’utilisation
Imaginons que vous avez un site Web sur votre club de football et que ce dernier est actuellement en ligne. Le site vous permet de gérer les résultats et classements de vos équipes, gérer les différentes compétitions, etc… De plus, votre site offre également un forum pour les rapports de match, dans lequel les spectateurs sont enthousiastes de partager leurs commentaires.
Et puis un jour vous vous plaignez que le site Web n’est pas assez exposé. Pour cela, vous voulez utiliser les rapports de matchs de la page Web pour attirer plus de spectateurs sur le site Web.
Vous vous penchez en arrière dans votre fauteuil et vous vous mettez à penser… Un instant plus tard une idée vous vient : syndication ! Au lieu de simplement mettre à disposition des utilisateurs la section des rapports, vous pouvez syndiquer le forum afin que les gens puissent lire des résumés de rapports de matchs avec leurs lecteurs de flux. De plus, d’autres développeurs Web peuvent également inclure les flux de syndication dans leurs propres pages Web.
Dans les deux cas, les gens pourront cliquer sur les titres en rapport avec leur centre d’intérêt et être reliés à votre site Web. C’est une excellente idée !
La conception de base de données
Bien avant que cette idée lumineuse vous traverse l’esprit, la base de données pour les rapports de matchs du forum était déjà conçue. Rappelons que la section de rapports de matchs de la page Web existe déjà. Elle n’a tout simplement pas encore été syndiquée.
Alors quels sont les changements dans la base de données que vous avez besoin de faire de syndiquer son contenu ? Aucun ! C’est l’un des grands avantages au sujet de la syndication.
Dans la plupart des cas, vous pouvez syndiquer vos articles sans changer votre modèle de données. La raison c’est que dans la plupart des cas, les articles ont généralement toujours l’information requise par la spécification Atom.
Le listing ci-dessous présente le modèle de base de données actuellement utilisé pour la section des rapports de matchs. Il contient également des INSERT de sorte que vous ayez des données de test.
Note : La structure de la table est en anglais. En effet, il est toujours préférable de mettre les tables, champs dans la langue de Shakespeare puisque généralement les labels sont plus cours et ne comportent aucun accents.
CREATE TABLE IF NOT EXISTS `reports` (
`ID` bigint(20) NOT NULL auto_increment,
`AUTHOR` varchar(32) NOT NULL,
`TITLE` varchar(64) NOT NULL,
`SUBTITLE` varchar(128) NOT NULL,
`CONTENT` varchar(2000) NOT NULL,
`POSTED` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
INSERT INTO `reports` (`id`, `author`, `title`, `subtitle`, `content`, `posted`) VALUES
(1, ‘Doe John’, ‘Une victoire méritée’, ‘Résultat 2 à 0’, ‘Le match s\’est déroulé sur un terrain difficile, mais la victoire est méritée. Bravo à tous !’, ‘2011-01-12 18:54:33’),
(2, ‘John’, ‘On était où ?’, ‘Défaite 8 à 1’, ‘J\’ai l\’impression que nous étions encore à la soirée d\’hier les gars…’, ‘2011-01-12 18:56:06’),
(3, ‘Mimich’, ‘Défaite malgré un bon match’, ‘Défaite 2 à 1’, ‘Une équipe supérieur meilleure que nous rien à dire vous avez fait un bon match.’, ‘2011-01-12 18:57:19’),
(4, ‘Roger’, ‘Victoire au forceps’, ‘Victoire 5 à 3’, ‘Mené au score 3 à 0 et revenir à la marque puis gagner, super !’, ‘2011-01-12 18:59:00’);
[/sourcecode]
Si vous voulez tester réellement le code présenté dans cet article, vous pouvez le faire en créant une base de données MySQL appelée football
et exécuter le code ci-dessus dans cette base de données.
La première colonne (ID
) est la clé primaire de la table. Notez qu’elle utilise l’attribut auto_increment
signifiant qu’a chaque fois qu’une nouvelle ligne est insérée dans la table, l’ID
de la colonne est automatiquement incrémenté par la valeur précédente de l’identifiant.
La colonne AUTHOR
indique simplement le nom d’utilisateur de la personne qui a posté le rapport de match.
La colonne TITLE
est le titre de l’article. De même, le SUBTITLE
est le sous-titre de l’article et est utilisé dans le flux Atom pour le synopsis de l’article.
La colonne CONTENT
est le rapport de match en lui-même. Généralement dans le flux Atom, le résumé de l’article est obsolète, ce qui encourage les utilisateurs à cliquer sur le lien et accéder au site Web. D’ailleurs un sondage a été lancé sur ce blog pour savoir si oui ou non on devait publier le contenu en entier dans un flux.
Enfin, la colonne POSTED
est un DATETIME
qui stocke la date à laquelle l’article a été publié sur le site Web.
Pour garder les choses simples, je ne fournis que quelques rapports. Dans une situation du monde réel, il y aurait des milliers de rapports à partir des centaines d’auteurs différents.
Le début des travaux
Maintenant que vous avez la conception de base de données en place, il est temps de réaliser le code de la page PHP qui doit produire le flux Atom. Cet article vous guidera à travers les bases de la création d’un flux Atom simple, que vous pouvez tester en utilisant PHP.
Accès à la base de données en PHP
Créer un fichier PHP appelé syndication.php
par exemple. C’est là que vous allez mettre votre code.
Tel que mentionné précédemment, PHP et MySQL vont de pair depuis bien longtemps. Certains pourraient aller jusqu’à dire qu’ils sont mariés et fait pour aller ensemble 🙂
Le listing ci-dessous fournit un extrait de code de base qui vous permet d’accéder à la base de données MySQL créée avec le code du listing 1.
$link = mysql_connect(‘localhost’, ‘admin’, ‘password’)
or die(‘Could not connect: ‘ . mysql_error());
mysql_select_db(‘football’)
or die(‘Could not select database’);
$query = ‘SELECT id,title,subtitle,author,posted
FROM reports
ORDER BY posted DESC limit 25;’;
$result = mysql_query($query)
or die(‘Query failed: ‘ . mysql_error());
[/sourcecode]
Ce code est important puisqu’il permet de récupérer nos informations, il est donc important d’expliquer le code ci-dessus étape par étape.
D’abord vient la fonction mysql_connect()
. Vous devez changer les paramètres selon les spécifications de votre propre environnement. Le premier paramètre est l’hôte de la base de données. Dans certains cas, il sera comme le listing, localhost
, si vous travaillez sur votre machine, dans d’autres cas ce sera un hôte distant, par exemple l’adresse IP : 10.0.0.1. Il pourra aussi être un nom d’hôte réel, en supposant que vous avez une résolution Domain Name System (DNS), par exemple : myhostmysql.com.
Le deuxième paramètre est le nom de l’utilisateur MySQL qui aura accès à la base de données. Vous pouvez utiliser admin, comme je le montre, que si celui-ci est un compte valide dans votre propre environnement MySQL. Reportez-vous à la documentation de MySQL pour apprendre à créer des comptes pour une base de données MySQL. Gardez à l’esprit que le compte utilisé ici doit avoir les droits en lecture sur la table REPORTS
de la base de données.
Le troisième paramètre est le mot de passe de l’utilisateur. Cela doit correspondre au mot de passe utilisé pour l’utilisateur identifié dans le second paramètre.
La clause or die
est incluse afin de fournir aux développeurs des informations de diagnostic dans le cas d’un échec. Si une connexion ne peut pas être réalisée au système de gestion de base de données, vous recevez un message indiquant que la connexion a échoué et la raison pour laquelle celle-ci a échoué lorsque le script PHP est exécuté.
Note : Exemple de retour d’erreur lorsque vous vous connectez au serveur de base de données avec des mauvais identifiants.
Ensuite vient la fonction mysql_select_db()
. C’est ici que vous allez réellement choisir quelle base de données vous prévoyez d’utiliser.
Rappelez-vous que je vous recommande de créer une base de données MySQL appelée football
si vous voulez tester la fonctionnalité du code fourni dans cet article. La ligne mysql_select_db()
spécifie que vous allez utiliser cette base de données.
Ensuite vient la requête réelle. Dans notre cas, on veut récupérer le résultat de la requête dans une chaîne. Ici, vous prenez les colonnes de la table REPORTS
suivant : ID
, TITLE
, SUBTITLE
, AUTHOR
, et POSTED
. L’ordre souhaité d’affichage DESC
dans la clause de la requête indique que les lignes renvoyées seront dans l’ordre décroissant de la colonne POSTED
(qui est la date à laquelle l’article a été publié sur le site Web).
Ainsi, vous récupérez les articles récents en premier. C’est une pratique standard pour les flux.
La limite de 25 (LIMIT 25
) est importante. C’est là que vous spécifiez que vous souhaitez un maximum de 25 articles retournés pour ce flux. Rappelons comme je l’ai mentionné plus tôt, que des forums tels que celui-ci peuvent avoir des milliers d’articles. Il n’est tout simplement pas conseillé de retourner des milliers d’articles dans un flux, d’une part car la bande passante utilisée sera trop importante, et d’autre part la plupart des lecteurs devront attendre un certain temps non considérable.
Comme je l’ai dis ci-dessus, la requête retourne une chaîne qui est assignée à une variable nommée intuitivement $query
.
Dans la fonction mysql_query()
, vous exécutez la requête définie dans la ligne précédente. Les résultats de cette requête sont stockées dans la variable $result
. Encore une fois, la clause or die
est mise pour retourner les erreurs le cas échéant.
Spécification du flux Atom et boucle de production de celui-ci
Spécification du flux Atom
Maintenant que vous avez les données de la base de données, il est temps de commencer à les afficher dans un format conforme à la spécification Atom. Parce qu’Atom est un langage XML, la sortie du fichier PHP doit-être au format XML, par opposition au format HTML.
Si vous avez l’intention d’utiliser un navigateur Web pour afficher la sortie, il suffit de garder à l’esprit que le résultat sera différent selon votre navigateur et sa version. Pour afficher la sortie XML, il est généralement préférable de faire un clic droit sur la sortie dans un navigateur et sélectionner « Afficher la source », « Code source de la page », … Ensuite vous pourrez voir la sortie XML brute
Avant d’afficher des informations sur chaque article, il est important d’inclure le préambule au flux Atom. C’est la partie qui identifie la sortie sous forme de flux Atom et fournit des informations pertinentes sur le flux, comme indiqué dans le listing ci-dessous :
<feed xml:lang="fr-fr" xmlns="http://www.w3.org/2005/Atom">
<title>Rapports Football</title>
<subtitle>Les derniers rapports de football de monclub.fr</subtitle>
<link href="http://www.monclub.fr/reports/syndication.php" rel="self"/>
<updated><?php echo date(DATE_ATOM); ?></updated>
<author>
<name>Votre Nom</name>
<email>[email protected]</email>
</author>
<id>
tag:monclub.fr,2011http://www.monclub.fr/reports/syndication.php
</id>
…
</feed>
[/sourcecode]
Vous pouvez immédiatement remarquer que le code ne ressemble pas à du PHP. C’est parce que la plupart de celui-ci n’en est pas. La sortie standard ne nécessite que très peu de contenu dynamique.
L’élément <feed>
identifie ce document XML comme un flux Atom. L’espace de noms utilisé pour définir les éléments est fourni comme attribut de l’élément <feed>
. Vous pouvez également utiliser l’attribut xml:lang
pour spécifier qu’il s’agit d’un document écrit en français.
L’élément <title>
spécifie un titre pour le flux global. De même, <subtitle>
spécifie un sous-titre pour le flux.
L’élément <link>
décrit l’URL du document syndication.php
. L’adresse de l’exemple sert uniquement de démonstration. En aucun cas celle-ci est valide sur le World Wide Web.
L’élément <updated>
produit un timestamp (conforme à la norme RFC 3339) présentant au lecteur (reader la date de la dernière mise à jour. Dans notre cas, le flux est toujours à jour puisqu’il récupère directement les dernières données de la base de données ainsi, j’utilise le timestamp courant. C’est le seul élément qui nécessite du PHP. La fonction date(DATE_ATOM)
produit un timestamp au format RFC 3339.
L’élément <author>
définit l’auteur de du flux global, c’est-à -dire vous généralement !
Enfin, l’élément <id>
identifie le flux dans le format Internationalized Resource Identifier (IRI).
Boucle PHP de production du flux Atom
Maintenant nous allons analyser la boucle produisant le flux Atom. La principale partie de développement PHP pour la production du flux se fait ici :
<?php
// Parcours des résultats et création du flux ATOM
$i = 0;
while($row = mysql_fetch_array($result)) {
if ($i > 0) {
echo "</entry>";
}
echo "<entry>";
echo "<title>";
echo $row[‘title’];
echo "</title>";
echo "<link type=’text/html’ href=’http://www.monclub.fr/reports/report.php?id=".$row[‘id’]."’/>";
echo "<id>";
echo "tag:monclub.fr,2011:http://www.monclub.fr/reports/report.php?id=".$row[‘id’];
echo "</id>";
echo "<updated>";
echo date(DATE_ATOM, strtotime($row[‘posted’]));
echo "</updated>";
echo "<author>";
echo "<name>";
echo $row[‘author’];
echo "</name>";
echo "</author>";
echo "<summary>";
echo $row[‘subtitle’];
echo "</summary>";
$i++;
}
?>
[/sourcecode]
Vous avez compris ? Allez on attaque. Premièrement, la boucle while
. Fondamentalement, ce mot clé dans le code est décrit en anglais comme suit :
as long as there are rows in the table that haven’t been included in the output yet, keep going
Chaque ligne de chaque itération est stockée dans une variable PHP intuitivement appelée $row
. Voici le résultat obtenu lors de l’appel à la fonction mysql_fetch_array
:
Array
(
[0] => 4
[id] => 4
[1] => Victoire au forceps
[title] => Victoire au forceps
[2] => Victoire 5 à 3
[subtitle] => Victoire 5 à 3
[3] => Roger
[author] => Roger
[4] => 2011-01-12 18:59:00
[posted] => 2011-01-12 18:59:00
)
[/sourcecode]
Ensuite, le compteur ($i
) est testé pour savoir s’il est nécessaire de fermer l’itération de l’élément précédent <entry>
, dans le cas où le compteur est supérieur à 0.
Ensuite, on insère l’élément <entry>
. Puis l’élément <title>
, est peuplé avec la colonne TITLE
de la ligne actuelle.
L’élément <link>
est auto-fermant. Autrement dit, il ne contient pas de valeur. Au lieu de cela, le lien réel est référencé comme un attribut. Cela fait partie de la norme Atom. Le lien pointe tout simplement à l’adresse URL où l’utilisateur peut lire l’article complet. Rappelons que ce flux ne fournit qu’un résumé à l’utilisateur.
L’élément <id<
est semblable à celle du titre décrit précédemment. Il identifie de façon unique cet élément au format IRI. Et, comme avant, il est construit à partir de l’URL.
L’élément <updated>
contient la valeur du DATETIME (au format RFC 3339) de la colonne POSTED
. De plus, on note que l’on ne récupère pas directement la valeur de la colonne, mais nous la transformons avec la fonction date(DATE_ATOM)
, toujours dans le but de l’obtenir au bon format.
Ensuite vient l’élément <author>
. Cet élément, contrairement aux autres, possède des éléments fils (child). Pour cet article, un seul de ces fils est utilisé : le nom de l’auteur. Ce dernier est rempli à l’aide de la colonne AUTHOR
de la ligne actuelle.
<summary>
contient l’information récupérée de la colonne SUBTITLE
.
Enfin, le compteur de boucle ($i
) est incrémenté, et la boucle continue.
C’est, en un mot, le corps du code associé à la production d’un document Atom. Comme vous pouvez le voir, il n’est pas aussi compliqué qu’il n’y paraît au premier abord.
De plus, gardez à l’esprit que de nombreux éléments de la spécification Atom ne sont pas couverts ici. Vous pouvez tout aussi facilement les ajouter en suivant les mêmes règles que vous venez de voir. Rien de bien compliqué en soit.
Testez-le !
Maintenant vient la partie amusante : les test !
Plutôt que de retaper (ou copier-coller) tous les codes décrits ci-dessus, vous pouvez simplement télécharger l’archive qui se trouve en bas de l’article. Copiez le fichier PHP dans un répertoire local et faites les changements nécessaires pour l’appel à la base de données tel que j’ai décris précédemment (user, password et host).
Lorsque tout est prêt, lancez votre navigateur et ouvrez la page suivante : http://locahost/syndication.php
Note : Comme pour toute solution personnalisée, vous devez modifier les valeurs de l’URL pour correspondre à votre environnement spécifique.
Comme je l’ai indiqué précédemment, les résultats varient selon le type de navigateur et la version que vous utilisez. Quelques-uns des navigateurs les plus modernes sont capables de détecter qu’il s’agit d’un flux Atom et afficher les résultats en conséquence. D’autres l’affiche au format XML brut. D’autres encore ne produisent rien parce que le document n’est pas un document HTML standard. Donc pas de panique si votre page est blanche !
Note : N’hésitez pas à faire la manipulation décrite au début de l’article pour afficher le code source.
Une fois que tout est OK vous devriez avoir un écran semblable :
Voilà c’est fini ! Rien d’insurmontable…
[samples id= »2076″]
Conclusion
La spécification Atom est un moyen idéal de syndication de votre contenu Web. Utiliser PHP avec MySQL, vous permet de facilement produire un flux Web qui est conforme à la norme Atom et qui est toujours à jour car il lit directement les données à partir de la base.
Le flux peut ensuite être lu par un lecteur de flux RSS ou intégré dans d’autres sites Web.
Le résultat final est une plus grande visibilité de votre contenu Web, signifiant plus de visiteurs et très probablement, une augmentation de vos revenus, alors pourquoi s’en priver ?
Avez-vous vous même implémenter cette méthode ? Si oui, quel en est le retour ?
Ressources
Pour en savoir plus :
- Atom: Spécification Atom sur Wikipédia
- RFC 3339 : Explorer la spécification de date/time utilisée par Atom
- Tutoriel PHP: Apprendre les bases de PHP
- Tutoriel MySQL: Apprendre comment créer un simple base MySQL