Offre d’emploi/stage

Petit apparté sur notre site avec un message de notre partenaire, l’agence parisienne MRJ. Lire la suite

Un plugin de formulaire de contact

Ce plugin fournit un formulaire de contact basique qui vous envoie les informations du contact par email, et les stocke dans la base de données au cas où un problème survienne lors de l’envoi de l’email. Il reprend le principe d’un précédent article de Formation CakePHP. Lire la suite

Le piège du counterCache : créons un behavior !

Dans le tutoriel précédent : Mise en place du counterCache : un piège à éviter, nous avions vu comment mettre en place le counterCache entre deux modèles associés en belongsTo et comment mettre à jour le compteur d’origine, lorsqu’un enregistrement change de parent.

L’astuce consistait à placer notre logique dans les callbacks beforeSave et afterSave du modèle Post, dans lequel est déclarée l’association belongsTo avec le modèle Category. Tout cela fonctionne bien pour un seul modèle, mais si l’application a plusieurs counterCache actifs, il faut dupliquer l’astuce dans tous les modèles, ce qui est peu productif et ne permet pas de réutiliser l’astuce dans d’autres projets.

Nous allons donc créer un Behavior, nommé tout simplement Counter, pour exécuter automatiquement la mise à jour du counterCache lorsque des enregistrements change de parent. Lire la suite

Article dans PHPSolutions n°33

Nous avons le plaisir d’annoncer la publication d’un dossier sur les bases de CakePHP, co-écrit avec Pierre Martin, dans le n°33 du magazine PHPSolutions. Cet article de 8 pages présente le framework en général et récapitule les points forts de CakePHP. Lire la suite

Plugin de moteur de recherche multi-modèles

Nous vous proposons un plugin pour intégrer un moteur de recherche interne multi-modèles à une application CakePHP. Ses caractéristiques sont les suivantes :

  • Utilise les index Full-Text de MySQL.
  • Facile à installer : il suffit de télécharger les fichiers et de créer une seule table, quel que soit le nombre de Modèles à indexer.
  • Non-intrusif : inutile de créer d’index Full-Text sur les tables existantes.
  • Plusieurs mode de recherche : langage naturel, langage naturel avec extension de requête, et recherche booléenne.

Lire la suite

Plugin de tags multi-modèles

Nous vous proposons un plugin permettant d’associer des tags à un ou plusieurs Modèles d’une application CakePHP. Nous avons souhaité que ce plugin ait les caractéristiques suivantes :

  • Facile à installer : il suffit de télécharger le dossier et le placer dans le répertoire {app}/plugins, puis de créer deux tables quel que soit le nombre de Modèles à tagger.
  • Pour pouvoir tagger un Modèle, il suffit d’ajouter un champ de type ‘text’ dans le formulaire d’ajout/édition d’un enregistrement. C’est tout. Nous proposons le choix entre un champ simple ou un champ qui propose des tags existants au fur et à mesure de la saisie.
  • Le plugin inclut un Comportement (Behavior) qui ajoute des méthodes aux Modèles concernés : trouver les tags d’un enregistrement, trouver des enregistrements qui partagent le plus grand nombre de tags, etc.
  • Construire et afficher un nuage de tags, avec un contrôle total de son contenu et de son apparence.

Lire la suite

Quelques astuces pour la génération des requêtes SQL

Nous allons voir comment contrôler finement les requêtes SQL préparées par CakePHP sans nous écarter des méthodes habituelles, c’est à dire le passage d’un tableau d’options à la méthode Model::find();. Lire la suite

Le piège du counterCache avec un modèle en arbre : le CounterBehavior

Dans le tutoriel précédent : Mise en place du counterCache : un piège à éviter, nous avions vu comment mettre en place le counterCache entre deux modèles associés en belongsTo et comment mettre à jour le compteur d’origine, lorsqu’un enregistrement change de parent.

L’astuce consistait à placer notre logique dans les callbacks beforeSave et afterSave du modèle Post, dans lequel est déclarée l’association belongsTo avec le modèle Category. Tout cela fonctionne bien pour un modèle dont les enregistrements n’ont aucune relation entre eux.

Mais si le modèle Category est construit comme un arbre hiérarchique, avec des sous-catégories sur plusieurs niveaux, l’astuce ne met à jour que le compteur de la branche finale à laquelle est attaché le post. Si nous avions besoin d’afficher le nombre total d’enregistrements de tous les enfants d’une branche parente, il faudrait faire une requête ou un traitement PHP spécifique pour le calculer et le passer à la vue. Lire la suite

Intégrer le lecteur de vidéos FlowPlayer

FlowPlayer est un lecteur Flash gratuit de fichiers vidéos (flv, mp4 et mv4), audio (mp3) et d’images. Il est entièrement configurable, extensible par des plugins et propose de nombreuses fonctionnalités comme les playlists ou les callbacks javascript. Nous proposons au lecteur un Helper permettant d’insérer facilement une instance de ce lecteur dans une Vue. Lire la suite

Pagination des données dans une relation HABTM

Il est possible depuis peu d’ajouter un nouveau paramètre dans le tableau d’options des méthodes Model::find() et Controller::paginate(). Cette nouvelle clé, 'joins', permet de définir facilement des restrictions sur une jointure HABTM et de paginer les données tout aussi facilement. Imaginons une petite application de recettes classées par catégories, une recette pouvant appartenir à plusieurs catégories et une catégorie pouvant être associée à plusieurs recettes. Lire la suite