Projet: SaadTaziOEmbedBundle

J’ai rendu disponible sur github le bundle SaadTaziOEmbedBundle pour Symfony2 qui permet de récupérer des données oembed, pour aller chercher des informations sur des images, vidéos… lorsque celles-ci sont diffusées par un fournisseur (provider) qui met à disposition les données oembed, comme youtube.com, vimeo.com, flickr.com (la longue liste des fournisseurs est disponible ici)…

Une utilisation possible: aller chercher le thumbnail de vidéos youtube ou vimeo (sans avoir à utiliser les différentes apis des différents fournisseurs…)

Pour en savoir plus sur oembed, lisez la spécification ici.

J’ai en fait créé une librairie simple-oembed qui est indépendante de Symfony2 (php 5.3+ et curl nécessaires). Le bundle ne fait qu’exposer le service oembed grâce au DIC de Symfony2. Vous pouvez bien entendu utiliser cette librairie sans utiliser le bundle.

La documentation est dans le README github. Si vous avez des questions/bugs/commentaires, n’hésitez pas (via ce blog ou github).

En espérant que cela serve à quelqu’un…

Projet: Geoquity

Je viens de lancer un nouveau projet personnel, geoquity, qui utilise différentes méthodes de géolocalisation, et les compare (bientôt).
Ce projet est dans la lignée d’un autre projet que j’avais lancé il y a 2 ans et demi http://geo.fruitsoftware.com/. Mais chaque utilisateur est invité à soumettre les données récupérées par les différentes méthodes de géolocalisations, afin de pouvoir comparer les résultats (js geolocation api est super performant pour moi, et pour vous?…).
Toutes les statistiques collectées restent anonymes bien sûr!

Ça a été pour moi l’occasion d’essayer Symfony 2 et de tester plus en détail backbone. Voici un résumé de mon expérience:

Symfony

J’ai beaucoup aimé l’expérience. Le framework nous force à être organisé, et de plus facilement faire des bundles réutilisables.

Assetic a été très facile d’utilisation: j’ai mis en place les filtres lesscss et yui compressors très rapidement, mais j’ai perdu un peu de temps sur le serveur de production, car j’avais oublié d’exécuter:

php  app/console assetic:dump --env=prod

Au niveau de Doctrine (ORM), là aussi, assez simple et facile à mettre en place.

Par contre, du côté des formulaires, j’ai eu un peu plus de difficulté pour sauvegarder des entités avec une relation one-to-many… Mais une fois fini, on se rend compte que c’était « évident », et que ‘ »il suffisait de le savoir »…

Une note par rapport aux namespaces et à l’autoloading: Attention au nom des fichiers et des classes PHP: ils doivent être identiques, et la casse doit être la même. Disons que si j’avais été plus vigilant, j’aurais sauvé une couple de minutes… J’aime mon Mac Book Pro, mais disons que si le filesystem était « case-sensitive », la vie serait plus simple…

Backbone

Là encore, assez simple d’utilisation, et ce framework nous force à séparer les choses. Mais je crois que je verrai la puissance si j’utilisais un api RESTful et les collections.

Aussi, je trouve que la séparation Model et View est moins évidente en Javscript (pour moi en tout cas). Je suis pas mal certain que je ferai les choses différemment maintenant que j’en sais un peu plus sur backbone…

Autres affaires

html5 boilerplate

(vraiment rien à dire, dans le bon sens du terme…)

the semantic grid

The semantic grid est un beau projet, qui permet d’utiliser la puissance de lesscss pour réaliser des grids très flexibles sans avoir à utiliser des classes css obscures. Ça rend le html très propre.

Ce qu’il me reste à faire (un jour…)

GChart Bundle – un bundle Symfony pour utiliser Google Chart

Je viens de rendre disponible sur github.com GChartBundle, un bundle Symfony (Symfony2 donc…) qui « wrappe » le Google Chart Tool et quelques charts (mais surtout le QrCode) de Google Image Chart API.

Ce que j’ai appris en faisant ce bundle:

La puissance du DIC

La puissance du Dependency Injection Container… ou comment permettre à l’utilisateur de redéfinir des paramètres du Bundle, passer des services aux services que l’on créée…

La puissance des Twig Extensions

… ou comment définir ses propres fonctions Twig, qui elles-même peuvent appeler « render » sur un template.

J’ai passé un peu de temps à trouver comment faire, mais l’idée est d’utiliser la méthode initRunTime() pour garder une référence d’un Twig_Environment:

    //in Twig/TwigExtension.php
    public function initRuntime(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

J’aurais pu aussi de la même manière utiliser un template php (en passant 2 resources dans le DIC par exemple…), mais un manque de motivation m’a gagné (je n’utilise pas les templates php de toute façon).

Cette partie (=le « rendering » d’un template dans l’extension Twig) pourrait être plus « propre aussi… Dans une version ultérieure peut-être?

Malheureusement, je n’ai pas de démo live. Mais voici tout de même un démo statique (copier coller du code html généré localement) de ce que génère l’action Demo.

En espérant que ça aide quelqu’un…

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.

Symfony 2.0 – Notes

Some thoughts about Symfony 2. I didn’t play with the sandbox yet, I just read the doc and browse the code (a little bit). So more to come…

routing « inheritence »

One main routing file that can include to other routing files

# hello/config/routing.yml
homepage:
  pattern:  /
  defaults: { _bundle: WebBundle, _controller: Default, _action: index }

hello:
  resource: HelloBundle/Resources/config/routing.yml

Components are actions, yeah!!

Everything is an action, and you can include an action into a template. That’s great, no need to define an action that just include a component (when you need some ajax but the first load is not ajax)

Generating Links

The generate() method takes the route name and an array of values as arguments.

Mmm, I hope there is another way to generate a route, using the controller name and action name (like the old « url_for »…). I think it’s part of the « kill the magic » cleanup…

Assets and links to images, css, js…

<img src="<?php echo $view->assets->getUrl('images/logo.png') ?>" />

You will be able to change the URL root path of your web app without breaking any links. I love it, but HTML integrators will complain… But I like it… and they will (have to?) live with that.

« imports » directive in Configuration file: cleaner configuration files!

#in config_prod.yml
imports:
  - { resource: config.yml }