Christophe Le Bot

  • Navigation rapide
Pratique de la conception numérique

Derniers commentaires

  • Une excellente thèse sur Simile Exhibit
    • Olivier Rossel | Bonjour. Malgre les annees, avez vous toujours en memoire vos usages d’Exhibit? Je serais ravi d’en discuter avec vous. Cordialement, Olivier Rossel.
  • Utiliser le planificateur de tâches OVH (crontab) avec PHP
    • Max | Bonjour, comme faire pour appeler une version de PHP qui n’est plus proposée par défaut dans le manager ? J’essaie de lancer un cron avec php 5.3 mais le log affiche No such file...
    • Christophe | @absolument Merci pour ces précisions. Je n’ai pas mis en place de tâches cron récemment, mais j’ai reçu quelques notifications étranges d’OVH il y a quelques...
  • Récupérer le dernier auto-incrément MySQL avec PHP
    • Thy | Sujet toujours *très* utile en 2015 ! Je réponds à Serge tsimba qui récupère un « Resource id ». (Et à tous ceux qui ont le même souci mais qui ne le disent pas) :)...
  • Régler l’heure de serveurs virtuels sous Debian
    • Ares_XL | Il semble que sur Débian la commande « tzconfig &ra quo; soit dépréciée et remplacée par : « dpkg-reconfigure tzdata » elle donne accès à une...
 

Archives de la catégorie
Programmation avancée

Barcamp PHP toulousain : la synthèse

Bacrcamp PHP Toulouse

Jeudi dernier se tenait le Barcamp PHP Cheese & Wine. Même si le vin et le fromage ont été très appréciés, nous n’étions pas venus (seulement) pour ça. Alors pour les absents qui ont eu tort de l’être, voici une petite synthèse de cette longue soirée.

Un vrai barcamp

Premier bon point : c’est un vrai barcamp où les participants se présentent et définissent le contenu des ateliers. Tous les barcamps ne respectent pas cette règle de base… Xavier Gorse, président de l’AFUP, a donc joué le rôle de « maître de cérémonie » pour établir le programme d’après les souhaits de chacun  :

  • PHP et sécurité
  • PHP 5.3
  • Déploiement d’applications PHP
  • PHP et les bases de données « NoSQL »
  • Outillage PHP
  • PHP et testing
  • Frameworks PHP

Pour ma part, j’ai participé aux ateliers :

  • Déploiement d’applications PHP
  • PHP et les bases de données « NoSQL »
  • PHP et testing

Je limite donc mon article à ces sujets, sachant que d’autres synthèses ont déjà été publiées :

Déploiement d’applications PHP

Cet atelier a mis en évidence la difficulté de déployer des applications web en général (technologies nombreuses et environnement hétérogène). Tous les outils existants ont été passés en revue, du paquet Linux (.deb) aux outils spécifiques à PHP (PEAR, Phing, Phar) en passant par des intermédiaires parfois plus adaptés (makefile, Puppet, Capistrano, Ant). Deux groupes de participants étaient clairement représentés, avec des besoins très différents :

  • Déploiement d’une solution sur un parc important et hétérogène (cas des éditeurs de solutions, comme Linagora avec OBM)
  • Déploiement d’un projet sur-mesure sur un ou quelques serveurs, mais très fréquemment et avec des contraintes d’intégration de contenus externes (cas des agences web, avec plusieurs déploiements par jour).

Dans le premier cas, la difficulté est d’identifier la configuration des serveurs cibles et de préparer les paquets d’installation correspondants (.deb pour chaque distribution Linux, .msi pour chaque version de Windows, etc.), tout en assurant la compatibilité des données sans toujours les connaître (tests de régression).

Dans le second cas, il faut savoir intégrer pendant le déploiement les données du site en exploitation (base de données, templates gérés par un web designer externe, etc.), avec d’éventuelles transformations (ETL, Extract Transform Load).

J’ai ajouté qu’un déploiement ne se limite pas à la livraison de la partie applicative mais doit aussi savoir traiter la mise à jour des outils liés au projet (plate-forme de gestion de tickets, extranet, feuille de route, tests, sauvegardes, alertes, etc.).

En dehors de PEAR, trés utilisé et qui est un outil de déploiement à l’origine, j’ai une préférence pour Ant + Phing et Capistrano.

Bases de données « NoSQL »

Là, on entre dans une autre dimension. Les bases « NoSQL » sont des bases de données non relationnelles. En gros, on ne retrouve pas le schéma habituel « tables contenant des champs et étant reliées entre elles ». L’avantage est d’obtenir des performances exceptionnelles sur des entrepôts de données énormes. Parmi les acteurs majeurs qui développent et utilisent des bases « NoSQL », on peut citer : Google (projet Big Table qui a inspiré le projet Cassandra), Facebook ou Linkedin.

Si on revient à la dure réalité d’un acteur de dimension modeste, on constate que ces technologies émergentes et prometteuses sont encore très spécifiques. Les bases relationnelles ont de beaux jours devant elles. La difficulté est notamment de réintégrer dans l’application PHP ce qui fait la force des systèmes SQL : sélection, jointures, intégrité référentielle, etc. Le volet testing des projets en prend un coup…

PHP et testing

Atelier en petit comité (6 personnes), en concurrence déloyale avec l’atelier Frameworks qui a fait le plein ! Nous avons tenté de lister les types de tests liés à une application web, en dépassant autant que possible la simple vue du développeur :

  • Tests unitaires (PHP et Javascript)
  • Tests fonctionnels
  • Tests d’IHM (via Selenium Core, Selenium RC et Selenium IDE)
  • Tests de recette
  • Tests de non régression
  • Tests de performance
  • Tests de charge
  • Tests de conformité (normes, W3C, accessibilité, etc.)
  • Tests ergonomiques (tri par cartes, paper prototyping, tests utilisateurs, etc.)
  • A/B testing

Les échanges sur nos expériences ont été très instructifs. Nous étions tous d’accord pour insister sur la définition précise des cas d’utilisation qui facilite la gestion des tests pendant toute la durée du projet avec le client. D’où une phase de spécifications sérieuse qui conditionne la qualité du travail livré. Certains tests peuvent faire l’objet de validation contractuelle, comme les wireframes issus de tests ergonomiques qui servent ensuite de feuille de route aux intégrateurs et développeurs.

La difficulté avec les tests, c’est de savoir placer le curseur pour ne pas s’y noyer. Il n’est pas réaliste d’appliquer les tests de façon exhaustive. C’est un idéal en contradiction avec les budgets et les délais imposés en pratique. Il faut donc savoir réaliser les bons tests, au bon endroit et au bon moment. Par exemple, sur le calcul des prix d’un panier de site e-commerce, sur l’intégration des données lors d’un couplage entre deux systèmes, sur l’ergonomie d’une interface riche, etc.

En résumé

Une excellente soirée qui a largement dépassée les 5 heures prévues ! L’accueil de Linagora et de l’AFUP était parfait, l’ambiance très sympathique et le niveau des échanges très pointu. Il y a des gens qui savent faire des choses avec PHP en Midi-Pyrénées ! Je pense qu’on remettra ça sous peu. Prochaine étape : le Bargento, lundi 9 novembre à Paris. Je serai présent avec l’équipe de l’AFUP pour organiser et animer cette journée qui s’annonce exceptionnelle. Et à la suite, le Forum PHP 2009, tout aussi exceptionnel. Sur ce coup-là, je déclare forfait. Il faut bien travailler un peu !

L’Agile Tour 2009 à Toulouse le 22 octobre

Agile Tour 2009

L’Agile Tour est de retour à Toulouse ! Le principe reste le même : faire découvrir les méthodes agiles et partager les retours d’expérience de leur application sur des projets réels.

L’édition 2008 a été un réel succès, alors ne boudez pas celle de 2009 ! L’efficacité des organisateurs et un contenu riche et utile vous rempliront la tête d’idées.

Ce sera le 22 octobre toute la journée, mais pas au même endroit que l’an dernier. Hélas ! Je ne pourrai pas m’y rendre, c’est une catastrophe… Heureusement, les comptes-rendus sont toujours complets, avec une copie des présentations faites à l’assistance. Que du bon en somme.

Informations et inscription : Agile Tour 2009

Magentips, mon nouveau blog Magento

Magentips

Il y a deux ans, quand j’ai commencé à mettre le nez dans Magento, il n’y avait rien ou quasiment rien sur le web pour traiter le sujet. Alors j’ai toujours eu l’idée d’un blog pour centraliser l’information pratique au quotidien. Mais comme souvent, les autres priorités ont gelé cette initiative assez rapidement…

Depuis, il s’est passé beaucoup de choses autour de Magento. De nombreux sites dédiés ont fleuri et m’ont fait douter de l’intérêt de créer un YABAM (Yet another blog about Magento). Alors tout cela est resté dans un carton, à moitié achevé, pendant une dizaine de mois.

Et pourtant, voilà Magentips ! Comme quoi tout arrive. Je doute de ma disponibilité pour en faire le YABAM le plus riche de la planète, mais je souhaitais partager mes expériences Magento en dehors des sentiers battus et des premières évidences. La page A propos détaille cela.

Je vois donc cette initiative personnelle comme un complément à des outils existants. Certains partages de contenu se feront donc naturellement vers des sites de référence comme le blog français officiel Magento, Fragento et Wikigento. Comme dirait Philippe Humeau (Wikigento), « on peut œuvrer ensemble dans le même sens, sans perdre son indépendance et sa liberté de ton ».

Bienvenue sur Magentips !

Vous pouvez aussi retrouver Magentips sur Twitter.

Un bien joli panier pour Magento 1.4

Panier Magento 1.4

Ouf ! Ce fut long et difficile, mais le résultat est là. Magento 1.4 arrive bientôt… avec un contrôle bien plus fin des calculs de prix et de TVA ! Suffisamment pour respecter les lois françaises sur les sites ouverts aux particuliers et pour programmer les promotions les plus folles en déclarant correctement la TVA !

Ceux qui se sont arraché les cheveux avec ça comprendront tout de suite l’intérêt de cette simple capture d’écran…

Je remercie l’équipe de Varien pour cet excellent travail et pour sa compréhension des subtilités de la fiscalité française. Vu des Etats-Unis, ce n’était pas gagné d’avance…

Donc, c’est un grand jour. Il faut maintenant attendre la validation de la version 1.4 qui devrait sortir bientôt. A Varien d’en faire l’annonce ! 😉

Du bon usage des exceptions

Si nous intégrons tous la gestion des exceptions dans notre code source (enfin, je l’espère…), en faisons-nous vraiment bon usage ? Entre les « maniaco-dépressifs » qui en mettent partout et les « bricolo-codeurs » qui savent à peine les mettre en place, il y a un compromis… qui n’est pas toujours évident à trouver.

Erreur, dysfonctionnement et exception

Par définition, une exception n’est levée qu’en cas d’état exceptionnel de l’application. Le tout est d’arriver à définir l’état d’exception. Est-ce un dysfonctionnement applicatif grave (connexion à une base de données qui tombe, fichier applicatif introuvable, allocation mémoire excessive, objet corrompu) ? Est-ce un fonctionnement normal mais exceptionnel (erreur d’authentification utilisateur, données entrantes non conformes) ? Est-ce une situation fréquente mais ne répondant pas au scénario optimal d’utilisation (mauvaise utilisation de l’application, erreurs de saisie d’un utilisateur) ?

Après avoir vu tous les cas sur le terrain, mais aussi dans des documents de référence, j’avoue ne plus savoir où placer le curseur…

Réserver l’exception aux dysfonctionnements

Pour ma part, je préfère garder l’exception pour les situations les plus rares et les plus graves, ce que je définis comme des situations exceptionnelles. Elles sont généralement dues à des dysfonctionnements de l’application, c’est-à-dire des états qui n’ont pas été prévus dans les séquences d’utilisation.

Sur ce principe, une erreur de saisie d’un utilisateur ne devrait jamais déclencher une exception lorsque sa valeur est contrôlée par l’application. Si j’entre une adresse e-mail invalide dans un formulaire, l’application traitera l’événement comme une erreur utilisateur et non comme un dysfonctionnement interne. Elle retournera le formulaire avec un joli message d’erreur… qui n’a rien d’exceptionnel puisque ce traitement fait partie du fonctionnement normal de l’application (mais pas de sa séquence nominal !). Même si cela semble évident (pour moi, du moins…), l’utilisation des exceptions pour ces cas est loin d’être anecdotique.

Bien sûr, si après validation de l’adresse e-mail l’application ne peut pas traiter normalement le formulaire, l’utilisation des exceptions permettra de trouver l’origine du dysfonctionnement, sans mettre les données dans un état inconsistant.

Trouver le bon équilibre

Dans le cas d’applications complexes où la modularité de code est de rigueur (genre « full MVC avec intégration de tous les designs patterns du GoF » !), savoir instancier puis récupérer une exception au meilleur endroit (ou moment pour les aficionados de la programmation événementiel) est déjà moins évident. Quels rôles jouent les différents niveaux de la partie M (modèle) ? Comment réagit la partie C (contrôleur) ? Comment gérer efficacement l’imbrication des exceptions (du noyau à l’interface en passant par les couches métiers) sans perturber la compréhension du problème par l’utilisateur ? Bien sûr, chaque cas est particulier, mais j’avoue que je souhaiterais bien discuter du sujet, autour de vos expériences.

Je vous passe la main !

PHP4, PHP5, PHP6 : la saison des grandes migrations

Logo PHP

Avec un été aux allures d’automne, j’ai eu envie de présenter un flux migratoire d’exception. Nul discours écologique dans mes propos, puisqu’il est question de PHP, le langage le plus répandu pour créer des applications web. Entre la mort de PHP4, la gestation de PHP6 et PHP5 qui tarde à s’imposer, voici un point sur la situation, les enjeux… et les risques.

PHP4 en fin de course

C’est maintenant officiel, PHP4 ne sera plus supporté à partir du 1er janvier 2008. En soit, l’annonce ne choque pas puisque PHP5 a pris le relais depuis 3 ans. Mais, sur le terrain, la percée de la version actuelle de PHP est moins évidente. En cause, les nombreuses applications PHP4 encore exploitées en ligne qui freinent les hébergeurs dans l’adoption de PHP5.

Migrer de PHP4 à PHP5

Sachant que la migration de PHP4 vers PHP5 devient obligatoire, comment la réaliser en douceur dans le temps imparti (5 mois) ?

Premier point : s’informer et comprendre la nécessité de migrer. Le site Go PHP5 est là pour ça !

Go PHP5
L’initiative Go PHP5 pour promouvoir une migration rapide vers PHP5.

Ensuite, il faut mettre le nez dans l’existant et y apporter les corrections ou les évolutions nécessaires pour le rendre compatible avec PHP5. On s’aidera des ressources mises à disposition par le PHP Group :

Préparer l’arrivée de PHP6

Maintenant, quid de PHP6 ? Quitte à migrer cet automne, autant en profiter pour préparer son arrivée ! On sait maintenant à quoi ressemblera la nouvelle mouture PHP et ce qu’elle implique pour les développeurs.

A la lecture de Prepare for PHP 6, on remarque vite que PHP sera beaucoup moins permissif. On ne regrettera pas le Register Globals, ni le Safe Mode (même s’il peut gêner quelques hébergeurs à la traîne).

Bien sûr, l’abandon des Magic Quotes imposera de retoucher de nombreuses applications PHP4 pour éviter les injections de commandes (pour attaquer une base de données, par exemple). On me rétorquera que PHP5 les désactive par défaut… ce qui veut dire qu’on peut les activer pour éviter de « perdre » du temps à mettre en conformité son code ! Avec PHP6, point de salut, il faut s’y coller !

Parmi les fonctionnalités les plus attendues, les namespaces pour la programmation orientée objet, le support natif d’Unicode, l’accélérateur APC par défaut.

Le plus inattendu est sans doute goto pour spécifier où continuer l’exécution du code ! A oublier de suite en programmation orientée objet…

Après le discours, la pratique. Voilà une petite check-list (tirée du magazine Programmez, juin 2007) pour faciliter l’arrivée de PHP6 :

  • Ne pas utiliser register_globals, mais $_POST, $_GET, $_COOKIE et $_REQUEST
  • Ne pas utiliser $HTTP_POST_VARS et $HTTP_SERVER_VARS, mais $_POST et $_SERVER
  • Mettre les directives magic_quotes_* à off
  • Ne pas spécifier le passage par référence dans l’appel de fonction, mais dans le prototype
  • Ne pas utiliser la fonction __autoload() (pratique mais très gourmande)
  • Ne pas mettre une variable derrière un break, mais une constante, un nombre… ou rien
  • Désactiver le safe_mode
  • Ne pas utiliser la librairie GD1 pour traiter les images, mais la GD2
  • Utiliser l’UTF-8 ou l’UTF-16

Le dernier point est, selon moi, le plus critique. Le support d’Unicode (UTF-8 ou UTF-16) impose de convertir la chaîne complète du développement : fichiers de code source, fichiers de données, base de données, navigateur web, etc. Or le support d’Unicode est loin d’être un réflex dans les projets web. Quel webdesigner se préoccupe de déclarer le support de l’Unicode dans Dreamweaver ? La question qui suit est : pourquoi la majorité des outils propose encore l’ISO-8851 ou CP1252 par défaut ? Bref, ce point dépasse le cadre des évolutions de PHP, mais deviendra un vrai Capharnaüm s’il n’est pas traité dans son ensemble.

Une opportunité pour les entreprises… et leurs prestataires

Inutile de tourner autour du pot : la migration nécessaire de PHP4 vers PHP5 demandera d’ici la fin de l’année un certain travail aux équipes de développement PHP de tous bords. Pour le bien des entreprises, c’est certain. Elles verront leur système d’information évoluer et gagner en maturité. Pour leurs prestataires aussi qui sauront profiter de l’opportunité pour aller plus loin qu’une simple mise en conformité iso-fonctionnelle.

Y a-t-il des spécialistes d’Exhibit dans la salle ?

Logo Simile

Cela fait un certain temps que je suis avec beaucoup d’intérêt les travaux du MIT (Massachusetts Institute of Technology) autour de Simile (Semantic Interoperability of Metadata and Information in unLike Environments). Ses intervenants défrichent le terrain du web sémantique avec beaucoup de talent et sans oublier de passer de la théorie à la pratique.

Le projet le plus connu est sans doute Timeline qui se veut le « Google Maps du temps ». J’avoue que le résultat est plutôt à la hauteur de la comparaison, d’autant que l’intégration de Timeline dans un site web est triviale !

Par contre, je suis un peu moins enthousiaste avec Exhibit. Ce framework permet de publier des données structurées et de les manipuler dans une interface web avec une déconcertante facilité. Le concept est génial mais je trouve certains choix techniques très discutables.

Pourquoi avoir créé des attributs HTML spécifiques à Exhibit ? Par exemple, pour réaliser un filtre à facettes, il faut écrire le code suivant :

<div id="exhibit-browse-panel" ex:facets=".discipline, .relationship, .shared, .deceased"></div>

Résultat, le code source n’est pas conforme et la page n’est pas accessible (au sens ergonomique). Des inconvénients qui vont à l’encontre du web sémantique ! Pourquoi ne pas avoir développé une syntaxe particulière pour les valeurs des attributs HTML officiels ? C’est le principe de diffusion adopté par les microformats.

Quant aux données, elles proviennent d’un objet Javascript (plus précisément d’un objet JSON). Adopter JSON est une excellente idée… sauf pour le référencement de la page web. En effet, pour un robot d’indexation, une page Exhibit est vide ! Il y a bien quelques pistes pour résoudre le problème, mais je suis loin d’être convaincu. Il me semblerait plus judicieux d’intégrer les données par défaut dans le code source HTML et de les manipuler via des méthodes non intrusives (unobstrusive Javascript) par le DOM du navigateur.

Et de votre côté, utilisez-vous Exhibit dans vos projets ? Avez-vous trouvé des réponses à ces contraintes ?

Exhibit a un tel potentiel que je ne voudrais pas être bloqué par ces deux défauts majeurs. Surtout qu’un autre projet va en décupler l’intérêt : Potluck (merci Christian pour cette découverte !).

Zend Framework dans les starting-blocks

Logo Zend Framework

Le Zend Framework passe en RC1 (release candidate 1). C’est donc la dernière étape avant sa sortie officielle prévue cet été (peut-être fin juin, disent certains).

Son arrivée dans l’arène bien encombrée des frameworks PHP a déclenché des débats passionnés, avec des clans résolument contre (« ce n’est pas un framework ! ») et des clans qui ne jurent que par lui (« il est soutenu par Zend et IBM autour du langage le plus populaire du web ! »). Je ne parle même pas des allergiques au PHP qui trouvent stupide de construire un framework autour d’un langage aussi immature…

Bref, chacun se fera son avis. Pour ma part, je trouve le projet très pertinent.

C’est vrai que Zend Framework n’est pas aussi complet que Symfony (un très beau projet, je vous conseille de l’étudier !). On peut effectivement le voir comme une bibliothèque d’objets respectant les principes classiques de l’architecture MVC (Modèle Vue Contrôleur). Dans ce cas, je pourrais aussi bien dire que prototype n’est pas un framework Javascript mais une collection de classes. C’est étrange, mais personne n’y songe…

On peut aussi se demander pourquoi ce framework n’est pas intégré directement dans PHP, suivi d’un bon ménage pour éliminer une myriade de fonctions inutiles. En cela, PHP est plus proche de Perl (36 façons de faire une chose) que de Python (1 seule façon de faire un chose). Mais il est difficile de mettre une croix sur ce qui a fait le succès de PHP : sa facilité de prise en main et son approche procédurale. PHP atteindra difficilement la beauté théorique d’une usine à gaz Java ou l’efficacité pragmatique d’un projet Ruby, mais il est partout.

Donc, considérons que le Zend Framework est un framework PHP léger. Quels sont ses avantages ? Pour moi, ils dépassent clairement le cadre purement technique, ce qui en fait déjà une solution incontournable :

  • Il a été créé à l’initiative de Zend, the PHP company (comme elle le dit si bien), pour des applications professionnelles lourdes.
  • Il est soutenu par des acteurs puissants (IBM en tête) qui garantissent sa pérennité.
  • Il utilise le langage le plus répandu sur les serveurs web.
  • Il repose sur les avancées majeures en programmation objet de la version 5 de PHP (il était temps…).
  • Il fonctionne par simple inclusion, donc sur toutes les offres d’hébergement existantes (serveurs mutualisés, notamment).
  • Il donne enfin un cadre de travail aux développeurs PHP (réputés comme les cancres de la programmation).
  • Comme tout framework, il réduit le temps de développement par la mise en facteur des bonnes pratiques et une meilleure définition de l’architecture.
  • Il offre une documentation complète, à jour et claire, un atout essentiel pour son adoption en entreprise.
  • Il bénéficie de l’élan autour d’Eclipse, grâce au développement parallèle de PDT (PHP Development Tools).

Cette orientation très professionnelle, tout en gardant la simplicité de PHP grâce à un framework léger, devrait décider un bon nombre de développeurs et d’architectes à considérer ce choix.

L’avenir me dira si j’ai vu juste…

Utiliser les catégories pour gérer les tags sous WordPress

Logo WordPress

Incroyable mais vrai : WordPress ne gère pas les tags ! Ces petites étiquettes qui donnent du sens au contenu généré par les utilisateurs, sont dans tous les services estampillés « Web 2.0″… sauf dans WordPress. Les utilisateurs râlent depuis longtemps : c’est qu’ils les demandent, ces tags ! Et avec insistance ! Ils devaient être intégrés dans la prochaine version (la v.2.2 à paraître ces jours-ci) et ne le seront que dans la version 2.3. Les plus impatients ont déjà migré sur d’autres plates-formes…

Mais au fait, a-t-on vraiment besoin des tags dans WordPress ?

Non, car ce moteur de blog propose les catégories pour les gérer. Certains vont tout de suite me dire qu’il y a une grosse différence entre les deux et qu’il faut donc les deux. C’est vrai, il y a une telle différence que j’utilise les deux dans ce blog… en m’appuyant seulement sur les catégories.

Gérer les catégories comme un arbre sémantique

L’astuce consiste à utiliser la hiérarchie des catégories comme un arbre sémantique. Ensuite, il suffit de placer certains de ses noeuds dans l’interface. Pour illustrer le principe, je vais prendre l’exemple de ce blog qui utilise à la fois des thèmes et des tags.

Etape 1 : créer les racines

Pour commencer, je crée les catégories qui me serviront de racines :

  • Thèmes
    Pour gérer une classification hiérarchique.
  • Mots-clés
    Pour gérer les tags.

WordPress m’indique les identifiants des deux racines : 3 pour Thèmes et 4 pour Mot-clés. Ces identifiants sont importants pour placer les racines dans l’interface. Leur valeur dépend bien sûr de votre propre installation de WordPress. Mais n’allons pas trop vite…

Etape 2 : créer les thèmes

Mes thèmes sont hiérarchiques. Je crée donc les thèmes principaux (Concevoir, Développer, Exploiter, Imaginer, Savoir) en les plaçant sous la catégorie Thèmes. Puis, viennent les thèmes secondaires placés chacun sous un thème principal. Rien de très compliqué, c’est du WordPress basique !

Thèmes sous WordPress
La liste de mes thèmes dans l’interface de WordPress.

Etape 3 : afficher les thèmes

Maintenant, il faut mettre les mains dans le cambouis. Je vais modifier le thème WordPress de mon blog pour afficher mes thèmes dans la partie latérale de mon blog. Par défaut, WordPress gère la navigation par catégories dans un fichier nommé sidebar.php. J’y ajoute le code suivant :

<ul>
<?php
wp_list_categories('title_li=&orderby=name&show_count=0&use_desc_for_title=1&child_of=3');
?>
</ul>

wp_list_categories est une fonction standard de WordPress pour afficher la liste des catégories. Grâce à ses options, je vais pouvoir placer la racine de mon arbre sémantique :

  • title_li=
    Indique que je ne souhaite pas afficher de titre avant la liste.
  • orderby=name
    Ordonne les catégories par nom.
  • use_desc_for_title=1
    Affiche les catégories sous leur catégorie mère.
  • child_of=3
    Limite la liste aux catégories appartenant à la catégorie 3 (donc Thèmes).

Etape 4 : créer les mots-clés

Les mots-clés sont créés sur le même principe. Je les saisie donc dans le gestionnaire de catégories de WordPress, sous la catégorie Mots-clés.

Mots-clés sous WordPress
La liste de mes mots-clés dans l’interface de WordPress.

Etape 5 : afficher les mots-clés… dans un joli tag cloud

Pour afficher les mots-clés, j’aurais pu me simplifier la vie en reprenant le même principe que pour les thèmes. Dans ce cas, le code suivant suffit :

<ul>
<?php
wp_list_categories('title_li=&orderby=name&show_count=0&hierarchical=0&child_of=4');
?>
</ul>

Mais présenter les mots-clés sous forme d’un tag cloud est quand-même plus « tendance ». Un tag cloud met en valeur les mots-clés (tags) les plus utilisés. Pour cela, inutile de réinventer la roue, j’utilise une extension WordPress très simple et efficace : Category Tagging.

Une fois installée et activée, je n’ai plus qu’à générer le tag cloud dans l’interface :

<ul>
<?php
// Affichage du tag cloud (via plugin Category Tagging)
if (function_exists ('cattag_tagcloud') ) {
echo cattag_tagcloud(1,5,1,'NAME_ASC','1,2,3,4,5,6,7,8,9','','<li><a rel="tag" href="%link%" title="%description%" class="tag-cloud-%size%">%title%</a></li>','Aucun mot-clé trouvé');
}
// Affichage simple
else {
wp_list_categories('title_li=&orderby=name&show_count=0&hierarchical=0&child_of=4');
} ?>
</ul>

A chacun de spécifier ses paramètres (voir le détail sur le site de Category Tagging). Le plus important est sans doute le 5e paramètre qui exclut des catégories. Je l’utilise ici pour ne pas afficher les catégories racines (Thèmes et Mots-clés), ainsi que les thèmes de premier niveau qui sont déjà dans l’interface.

Reste à définir les styles CSS pour afficher les mots-clés en fonction de leur utilisation. Pour moi, c’est le code suivant :

a.tag-cloud-1 {
	font-size:1em;
	color:#9B907F;
}
a.tag-cloud-2 {
	font-size:1.2em;
	color:#7C6E59;
}
a.tag-cloud-3 {
	font-size:1.4em;
	color:#7C6E59;
}
a.tag-cloud-4 {
	font-size:1.6em;
	color:#666;
}
a.tag-cloud-5 {
	font-size:1.8em;
	color:#444;
}

Inconvénients

Comme toute astuce, la solution n’est pas idéale. Il y a aussi des inconvénients :

  • L’ajout d’un tag n’est pas possible pendant la saisie d’un article. En effet, WordPress propose l’ajout de catégorie pendant la rédaction, mais il semble impossible d’ajouter une sous-catégorie. Si quelqu’un connait le truc, je suis preneur !
  • Il faut modifier le code du thème WordPress pour gérer la liste des catégories à ne pas afficher dans le tag cloud. C’est le cas quand j’ajoute ou supprime un thème principal… ce qui est très rare.

Avantages

La solution n’est peut-être pas idéale, mais c’est un bon compromis :

  • On se passe d’un gestionnaire de tags. WordPress s’en trouve plus léger et plus stable.
  • Au niveau des articles, je peux afficher les thèmes et les mots-clés dans la même liste pour proposer un choix plus large aux lecteurs.
  • Si un mot-clé prend de l’importance, je peux le placer dans les thèmes sans toucher aux articles, ni aux outils de navigation. Pour faire la même chose avec un système de tags indépendant, il faut modifier chaque article…

Mise à jour. Thomas VdB voit deux autres avantages essentiels à utiliser les catégories comme arbre sémantique :

  • Les doublons disparaissent (comme Sémantique, sémantique et semantique qui sont habituellement considérés comme trois tags différents).
  • Le référencement est optimisé car l’adresse d’une page d’un tag décrit son contenu et facilite son indexation (par exemple, /category/mots-cles/web-semantique/).

Javascript et ActionScript : le piège de parseInt()

Comme tous développeurs pressés, nous utilisons très souvent des fonctions de façon empirique, sans en comprendre le fonctionnement réel et les subtilités de paramétrage. Et parfois, on le paye cher en mal de crâne, suite à des comportements incompréhensibles… et pourtant normaux.

Prenons la fonction Javascript parseInt(). Elle permet de transformer une chaîne en nombre entier. Si on veut récupérer le département d’un code postal, le premier réflexe est de faire :

var departement = parseInt(codepostal.substring(0, 2));

En apparence tout fonctionne bien… sauf pour les départements 08 et 09 pour lesquels on obtient 0 ! Diable…

C’est oublier un peu vite le second paramètre radix qui définit la base numérique à utiliser. Il est vital car en son absence, la base numérique dépend du format de la chaîne. Dans notre cas, les codes postaux commençant par 0 sont convertis en entiers de base octale (ou base 8). Notre but est d’obtenir un entier en base décimale (ou base 10), on précise donc la valeur 10 au second paramètre de la fonction parseInt() :

var departement = parseInt(codepostal.substring(0, 2), 10);

Ouf ! Pour information, radix supporte les valeurs 0 (valeur par défaut, sélection d’une base hexadécimale, octale ou décimale selon le format de la chaîne) et de 2 à 36. Par exemple, si on souhaite un entier hexadécimal, radix sera égal à 16.

On ne m’y reprendra plus !