Articles taggés avec ‘Modèle’

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

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

Afficher les erreurs de validation en entête de formulaire

Sur un formulaire comportant de nombreux champs, il peut être utile de regrouper l’ensemble des messages d’erreur en entête, l’utilisateur ayant ainsi accès d’un coup d’oeil à l’ensemble des erreurs. Cela peut également être utile lorsque certains champs sont trop petits pour y afficher un message d’erreur, l’utilisateur voyant alors que le champ est mal rempli mais ne sachant pas pourquoi. Voyons comment récupérer l’ensemble des messages d’erreur de validation d’un Modèle, et comment les afficher sur un formulaire.

Lire la suite

Mise en place du counterCache : un piège à éviter

Le counterCache est une fonctionnalité très intéressante pour économiser des requêtes dans une relation belongsTo entre deux modèles. Le principe est simple : il suffit d’ajouter une colonne dans la table parente pour enregistrer le nombre d’enfants. Dans le cadre d’un simple blog avec des Posts et des Commentaires, cela permet d’afficher le nombre de Commentaires d’un Post sans avoir à les compter, puisque le compte se fait automatiquement dans une colonne de la table parent, Post, à chaque ajout d’un enfant, un Commentaire. Lire la suite

Gestion automatique d’une colonne de tri avec un Comportement

Nous avons souvent besoin d’une colonne de tri numérique dans une table, lorsque les données de cette table ne peuvent être classées selon un ordre standard, comme l’ordre alphabétique ou la date de création. C’est pourquoi nous avons créé un Comportement (Behavior) pour gérer automatiquement les opérations de maintenance de l’index de tri en cas d’ajout, modification ou suppression de données. Le Comportement ajoute également trois méthodes au Modèle associé, moveUp et moveDown, pour monter ou descendre un enregistrement de la table, et moveTo pour mettre à jour l’indice d’un enregistrement. Lire la suite

belongsTo : génération de la liste déroulante des données du modèle associé

Imaginons un classement de documents par type de document : le formulaire de création / édition d’un document doit faire apparaître la liste déroulante des types de document disponibles. Pour ce faire, nous utilisions la méthode generateList, mais celle-ci est dépréciée dans la version 1.2.0.6311-beta. Voyons comment générer la liste déroulante avec la méthode find('list'). Lire la suite

Gestion des erreurs de base de données

Lors du développement d’un site, nous voyons toutes les erreurs et les avertissements grâce à un niveau de debug réglé sur 2 dans {app}/config/core.php. Lors de la mise en ligne du site, nous mettons ce niveau à 0, les erreurs deviennent donc invisibles à l’utilisateur. Mais si une erreur SQL survient, cela peut fortement affecter le fonctionnement du site, et nous voulons en être averti immédiatement.

La classe Model possède une méthode de callback, « onError », appelée automatiquement lorsqu’une opération sur la base de données produit une erreur. Nous allons se servir de cette fonction pour gérer efficacement une erreur SQL. Lire la suite

Une clé étrangère présente deux fois dans une table

Imaginons une application de gestion de résultats sportifs : nous avons une table « equipes » et une table « rencontres ». La table « recontres » va comporter deux fois la clé primaire de la table « equipes » : equipelocauxid pour l’équipe locale et equipevisiteursid pour l’équipe des visiteurs. Comment gérer cette association particulière dans CakePHP ? Lire la suite

Mise en place d’une double-configuration automatique

Lors du développement d’un site CakePHP sur notre machine, nous devons configurer certains réglages spécifiques à notre environnement de développement. Ces réglages seront la plupart du temps différents sur l’espace d’hébergement en ligne lorsque le site sera terminé. Voyons comment gérer simplement une double-configuration développement / production avec CakePHP. Lire la suite