Le nouvel Agenda Trad en ligne.

Après 2 ans d’activité dans sa version 1, il était temps de refaire Agenda Trad, en prenant en compte les retours de ces deux années.

Le projet est, sur le fond, le même qu’à son lancement, mais sur la forme, beaucoup de choses ont changés.

D’abord le design. Réalisé par Rouge-Pixel, il apporte une vrai identité au site et une ergonomie simplifiée.

Ensuite, beaucoup de choses ont été revus pour simplifier l’expérience utilisateur et pour encore augmenter la qualité du contenu en évitant les doublons ou en déplaçant les ateliers réguliers dans une section à part.
Les mini-sites organisateur et groupe ont maintenant leur propre fiche de contact et là encore la présentation a été revue pour tenter d’être plus claire.

Pour cette nouvelle version il fallait mettre un gros coup de frais sur le partage. Plus il y a de visiteurs, plus les organisateurs ont intérêt à publier leurs évènements, plus les visiteurs ont intérêts à venir sur le site. Cercle vertueux.
Les partages pour Twitter, Google Plus et Facebook sont intégrés sur chaque page évènement, organisateur et groupe.
Les organisateurs et groupes ont accès en plus à deux fonctions leur permettant d’intégrer leurs évènements sur leur site ou de faire un partage personnalisé vers leur page Agenda Trad.
Un Flyer a même été édité en PDF pour ceux qui veulent diffuser localement 🙂

Infotrad, le mailing d’Agenda Trad, a aussi prit un coup de jeune grâce au nouveau design et une simplification du contenu.

Agenda-trad

Agenda Trad nouvelle version

D’un point de vue technique, fini le code « à la main ». Après un premier essai sur Symfony 1.4, assez intéressant au début, ce fût abandonné pour se tourner vers CakePHP 2.0.x

Après un premier test de ce framework en 2010, je n’étais pas forcément convaincu, mais la lourdeur de Symfony 1.4 m’a convaincu qu’il fallait tester autre chose. La version 2.x de CakePHP n’a rien à voir et le framework semble maintenant vraiment abouti. Tant du côté du code que de la normalisation et de la vélocité. Bref, ce framework vaut le coup et j’encourage les développeurs à y jeter un oeil.

Ce projet personnel m’a pris pas mal de temps libre et temps de travail mais le résultat est vraiment intéressant. En espérant qu’il y ai une bonne accroche côté visiteurs et organisateurs.

 

 

Détecter un robot avec CakePHP 2.x

Il peut être parfois intéressant de changer le comportement d’une page si c’est un robot qui est en train de la visiter. On peut ainsi éviter la génération de panier dans une boutique ou des Tokens sur un formulaire de contact. Surtout si votre site contient plein de formulaires de contacts 🙂

CakePhp dans sa version 2 intègre un nouvel RequestHandler.  De base, cet Objet Request intègre différentes détections classiques comme l’utilisation d’un mobile, d’une connexion SSL, requêtes POST ou GET, … Mais on peut aussi lui ajouter nos propres règles.

Tout d’abord on va utiliser un modèle Bot dont la table contiendra les robots et user_agent.

Le fichier SQL pour la table bots : Table des user_agent des principaux robots

Dans votre AppController::beforeFilter(), insérez le code suivant, où vous voulez

  /*
   * table bot
   */
   $this->loadModel('Bot');
   $bots = $this->Bot->find('all', array('fields' => 'agent', 'conditions' => 'is_active = 1'));
   $bots = Set::extract($bots, '{n}.Bot');
   $patternBot = array();
   foreach ($bots as $data) {
     $patternBot[] = str_replace('\*', '.*?', preg_quote($data['agent'], '#'));
   }
   $this->request->addDetector('bot', array('env' => 'HTTP_USER_AGENT', 'pattern' => '`' . implode('|', $patternBot) . '`'));

Point par point :

  • On charge le model ‘Bot’ pour pouvoir accéder à celui-ci
  • On récupère tous les user_agents des robots actifs
  • Un passage dans Set::extract pour nettoyer le résultat
  • On quote les agent pour que ça puisse passer dans le preg_match()
  • et on fabrique une énorme expression régulière que l’on transmet au RequestHandler

Nous avons donc maintenant un nouveau detecteur dans le RequestHandler et on peut utiliser dans n’importe quel controller :

$this->request->is('bot');

Et voilà 🙂

Pour plus de rapidité, il est conseillé d’utiliser le Cache pour les résultats.

    /*
     * table bot
     */
    $patternBot = Cache::read('pattern_bot');
    if (!$patternBot) {
      $this->loadModel('Bot');
      $bots = $this->Bot->find('all', array('fields' => 'agent', 'conditions' => 'is_active = 1'));
      $bots = Set::extract($bots, '{n}.Bot');
      $patternBot = array();
      foreach ($bots as $data) {
        $patternBot[] = str_replace('\*', '.*?', preg_quote($data['agent'], '#'));
      }
      Cache::write('pattern_bot', $patternBot);
    }
    $this->request->addDetector('bot', array('env' => 'HTTP_USER_AGENT', 'pattern' => '`' . implode('|', $patternBot) . '`'));

Prochaine étape, détecter si le user agent contient « Bot, Spider, Crawler, Slurp, … » et qu’il n’est pas détecté comme un robot pour l’ajouter à la table automatiquement avec un statut 0. Restera à passer changer les statuts si c’est vraiment des robots et votre table s’auto-alimente, mais ce sera pour plus tard.

 

Des icones Ajax personnalisés

Une chose que les gens ont du mal à comprendre avec Ajax, c’est que la page ne se rafraichi pas vraiment, seulement une partie du contenu change.

J’ai longtemps cherché une icône sympa pour afficher la progression de chargement de la page, jusqu’à trouver ce site qui vous permet de concevoir votre propre image animé à partir d’un modèle et d’une couleur.

C’est assez simple mais permet d’avoir quelque chose d’un peu personnalisé et adapté au site.

http://www.ajaxload.info/