This document is for a version of CakePHP that is no longer supported. Please upgrade to a newer release!
Obsolète depuis la version 2.5: Le scaffolding dynamique sera retiré et remplacé dans 3.0
Une application scaffolding (échafaudage en Français) est une technique permettant au développeur de définir et créer une application qui peut construire, afficher, modifier et détruire facilement des objets. Le Scaffolding dans CakePHP permet également aux développeurs de définir comment les objets sont liés entre eux, et de créer ou casser ces liens.
Pour créer un scaffold, vous n’avez besoin que d’un model et de son controller. Déclarez la variable $scaffold dans le controller, et l’application est déjà prête à tourner !
Le scaffolding par CakePHP est vraiment bien imaginé. Il vous permet de mettre en place une application basique CRUD (Création, Vue, Edition et Destruction) en quelques minutes. Il est si bien fait que vous aurez envie de l’utiliser dans toutes vos applications. Attention ! Nous pensons aussi que le scaffolding est utile, mais veuillez réaliser que ce n’est… qu’un échafaudage ! C’est une structure très simple à mettre en oeuvre, et il vaut mieux ne l’utiliser qu’au début d’un projet. Il n’a pas été conçu pour être flexible, mais uniquement pour être un moyen temporaire de mettre en place votre application. A partir du moment où vous voudrez adapter les fonctions et les vues associées, il vous faudra désactiver le scaffolding et écrire votre propre code. bake console de CakePHP, que vous pourrez apprendre à connaître dans la prochaine section, est une bonne alternative : il va générer tout le code équivalent à ce que ferait le scaffolding.
Le Scaffolding est à utiliser au tout début du développement d’une application Internet. Le schéma de votre base de données est encore susceptible de changer, ce qui est tout à faire normal à ce stade du processus de création. Ceci a un inconvénient : un développeur déteste créer des formulaires dont il ne verra jamais l’utilisation réelle. C’est pour réduire le stress du développeur que le Scaffolding a été introduit dans CakePHP. Il analyse les tables de votre base et crée de façon simple une liste des enregistrements, avec les boutons d’ajout, de suppression et de modification, des formulaires pour l’édition et une vue pour afficher un enregistrement en particulier.
Pour ajouter le Scaffolding dans votre application, ajoutez la variable
$scaffold
dans votre controller:
class CategoriesController extends AppController {
public $scaffold;
}
En supposant que vous avez bien crée un model Category dans le bon
dossier (app/Model/Category.php
), vous pouvez aller sur
http://exemple.com/categories pour voir votre nouveau scaffold.
Note
Créer des méthodes dans un controller contenant la variable
$scaffold peut donner des résultats inattendus. Par exemple,
si vous créez une méthode index()
dans ce controller, votre
méthode remplacera celle rendue normalement par la fonctionnalité
de scaffold
Le Scaffolding prend bien en compte les relations contenues dans votre
model. Ainsi, si votre model Category a une relation belongsTo
avec
le model User, vous verrez les identifiants des users dans
l’affichage de vos catégories. Puisque scaffolding connaît les associations
entre models, vous ne verrez pas d’enregistrements liés dans les vues via
scaffold jusqu’à ce que vous ajoutiez manuellement un code d’association
au model. Par exemple, si le model Group hasMany
User et que
User belongsTo
Group, vous devrez ajouter manuellement le code suivant
dans vos models User et Group. Avant de faire cela, la vue affiche un select
vide pour le Group dans le Nouveau formulaire User; after – populated avec les
IDs ou noms à partir de la table du Group dans le Nouveau formulaire User:
// Dans Group.php
public $hasMany = 'User';
// Dans User.php
public $belongsTo = 'Group';
Si vous préférez voir autre chose en plus des identifiants
(par exemple les prénoms des users), vous pouvez
affecter la variable $displayField
dans le model.
Voyons comment définir la variable $displayField
dans la classe des users,
afin que le prénom soit montré en lieu et place de l’unique identifiant.
Cette astuce permet de rendre le scaffolding plus lisible dans de nombreux cas:
class User extends AppModel {
public $displayField = 'first_name';
}
Si vous avez activé le routage admin dans votre app/Config/core.php
,
avec Configure::write('Routing.prefixes', array('admin'));
, vous pouvez
utiliser le scaffolding (échafaudage) pour générer une interface
d’administration.
Une fois que vous avez activé le routage admin, assignez votre préfixe d’administration à la variable de scaffolding:
public $scaffold = 'admin';
Vous serez maintenant capable d’accéder aux actions scaffoldées:
http://example.com/admin/controller/index
http://example.com/admin/controller/view
http://example.com/admin/controller/edit
http://example.com/admin/controller/add
http://example.com/admin/controller/delete
C’est une méthode facile pour créer rapidement une interface d’administration simple. Gardez à l’esprit que vous ne pouvez pas avoir de méthodes de scaffolding à la fois dans la partie admin et dans la partie non-admin en même temps. Comme avec le scaffolding normal, vous pouvez surcharger les méthodes individuelles et les remplacer par vos propres méthodes:
public function admin_view($id = null) {
// du code ici
}
Une fois que vous avez remplacé une action de scaffolding, vous devrez créer une vue pour cette action.
Si vous désirez un rendu un peu différent de vos vues obtenues par le Scaffolding, vous pouvez créer des mises en pages personnalisées. Nous continuons de vous recommander de ne pas utiliser cette technique pour produire vos sites, mais pouvoir modifier les vues peut être utile pour leur développement.
La personnalisation des vues scaffoldées pour un controller spécifique (PostsController dans notre exemple) doit être placée comme ceci:
app/View/Posts/scaffold.index.ctp
app/View/Posts/scaffold.form.ctp
app/View/Posts/scaffold.view.ctp
Les vues scaffoldées personnalisées pour tous les controllers doivent être placées comme ceci:
app/View/Scaffolds/index.ctp
app/View/Scaffolds/form.ctp
app/View/Scaffolds/view.ctp