Capitales – mini-projet

Toujours afin de tester de nouvelles technologies et de m’exercer avec le framework Symfony2 et les librairies javascript pour mobile, j’ai décidé de faire un mini-projet qui liste les pays du monde et leurs capitales. Le résultat final se trouve ici.

Après avoir chercher une base de données qui comprend les pays et leurs capitales, j’ai finalement décider d’utiliser Wikipedia et parser le html. Je voulais pouvoir refaire l’import si nécessaire. Donc il me fallait le faire programmatiquement, en utilisant PHP.

Notes

  • Même si la table HTML de Wikipedia semble uniforme, il m’a fallu traiter les différences de DOM
  • Utilisation de SplFileObject au lieu de fread: Utiliser les classes de la Standard PHP Librairy, c’est louable. Mais comment lire le fichier d' »une shot », l’équivalent de:
    contents = fread($handle, filesize($filename));
  • J’ai essayé d’utiliser la classe Crawler de Symfony2, normelement utilisée pour les tests fonctionnelles: cette classes n’est pas fait pour parser du XML, même si j’ai bien aimé la classe qui convertit un selecteur css en selecteur XPath.
  • En utilisant DOMDocument: mmm, trop « verbose », pas facile de parcourir le document je trouve, les attributs nodeValue et textContent retourne le contenu « strippé », donc il faut utiliser la méthode saveXML() uniquement utilisable depuis DOMDocument, donc si on a un DOMNode, il faut faire un
    $myDOMNode->ownerDocumnent->saveXML($myDOMNode);

    Pas très élégant, non?

  • Donc retour à SimpleXML, mais la méthode XPath de SimpleXML semble très limité (peut-être à cause des namespace ou du fait que ce soit du html?). Donc l’essentiel est en SimpleXML, mais j’ai du utilisé la méthode DocDocument::getElementById() et convertir en SimpleXMLElement en utilisant la fonction simplexml_import_dom.
  • Plus d’info sur les limitations que j’ai rencontré avec la méthode SimpleXMLElement::xpath() (mais c’est peut-être juste moi):
    • incapable de loader le html… Peut-être est-ce à cause des namespaces?
    • incapable d’utiliser les selector XPath de type attribut:
      root/node[@id='my-id']
  • Quelques problème d’encoding avec DomDocument: il a fallu qu’en loadant le string XML, j’ajoute le « tag » xml  
    $domDoc->loadHTML('<?xml encoding="UTF-8">' . $content);

Aussi, j’ai toujours une des problèmes de performance avec jQuery, lorsque le DOM est trop important…

jQuery mobile, Symfony2, Doctrine 2 et autres tests…

Bonne année!!

Et oui, après de longs mois de silence, les bonnes résolutions de 2011: comme je suis curieux, j’ai voulu faire quelques tests avec Symfony2 et jQuery mobile.

Et comme ma blonde a une « passion » pour les départements français (donner un numéro de département, et deviner le nom du département – difficile à comprendre quand on n’est pas de France j’imagine), j’ai fait un mini-site qui liste les départements français (liste de tous les départements ou par région).

Testez-le ici.

Mise à jour (2011-01-09)

J’ai aussi réaliser quelque chose de similaire pour les capitales des pays. Voir ici. Cela m’a permis de jouer avec les classes php SimpleXMLElement, DOMDocument et la famille PHP DOM, mais aucune ne m’a complètement convaincue. Voir ici pour des commentaires additionnels.

J’ai utilisé…

  • le framework Symfony2 PR4: j’ai utilisé le fichier tarball pour être rapidement « efficace ». Simple à installer, mais je pense qu’il manque quelques commandes Symfony pour générer des Bundles par exemple (j’ai pas trop chercher, peut-être que ça existe)
  • jQuery mobile 1.0 ALPHA 2:
    • les listView: encore quelques améliorations sont nécessaire (notamment pour les count bubbles des nested list), mais ça promet,
    • les liens (remplacés en call ajax) et le back automatique: cool, mais parfois pas très fluide et très lent, et je pense que c’est encore lent si le lien est dans une liste de 100+ items (DOM trop complexe)
    • parfois lorsque la page se loade sur le iphone, le css ne semble pas appliqué. Le problème se résout lorsqu’on raffraichit la page: problème de latence réseau, problème de webKit, problème de DOM trop long, ou de performance iPhone? Je ne sais pas, mais problème il y a… Pour répliquer à tout coup le problème, allez sur votre iphone à http://departements.fruitsoftware.com/index2.html. Dans la dernière version (http://departements.fruitsoftware.com), j’ai séparé les listes imbriquées en 2 pages: chaque nested list est dans une page séparée.
    • d’une manière générale, il reste encore (un peu (?), beaucoup (?)) de travail à faire. Mais très prometteur et utilisable si on accepte les limitations actuels.
  • une base de donnée mySQL et l’ORM Doctrine 2 avec les docBlock annotations (Doctrine 2: excellent!!). Sauf que je n’ai pas trouvé de façon d’initialiser la connexion à UTF8 via la configuration de Symfony2. Pour m’en sortir, j’ai créé une petite méthode dans l’unique controleur de l’application (probablement une meilleure manière de faire, notamment via les postConnect events de la DBAL de Doctine):
        public function fixUtf8() {
            $conn = $this->get('database_connection');
            $statement = $conn->prepare('SET NAMES \'utf8\';');
            $statement->execute();
        }
    
  • Twig pour les views de Symfony2: je n’ai pas trouvé de limitations pour l’instant, il faut s’habituer je pense à la syntaxe (et à l’IDE qui ne « highlight » pas et ne formate pas correctement – tabs…)

Reste à tester…

  • le HTTP cache de Symfony2: je trouve le principe excellent, je me garde juste ça pour plus tard…
  • comment jQuery mobile se comporte avec Google Analytics, notamment avec le remplacement automatique des liens par des calls Ajax [EDIT] J’ai trouvé ce lien qui semble répondre à cette question: http://www.jongales.com/blog/2011/01/10/google-analytics-and-jquery-mobile/
  • les formulaire jQuery mobile et leur intégration avec Symfony2
  • les formulaires Symfony2 en général
  • PhoneGap (lire cet article)

Quelques remarques

  • s’il vous plait, pas de commentaires sur les régions qui ne sont pas des régions, …. J’ai pris mes données de wikipédia, alors, bon, hein…
  • Le framework Symfony2 semble avoir gagner en robustesse par rapport à la version 1, mais aussi plus exigeant: code plus long à taper. Rien de bien grave là, surtout si on gagne en clarté, performance, fonctionalité, beauté (oui oui, Symfony2, c’est beau!!), règles de l’art…
  • Pour tester: Chrome et firefox l’affaire (en redimensionnant la fenêtre), mais j’ai aussi utilisé le iPhone Simulator qui vient avec xcode (sur Mac uniquement)
  • j’ai utilisé Apache et mySQL installé via macPorts: fini pour moi MAMP, j’ai plus de contrôle avec MacPorts, notamment pour installer des extensions php.