Go to content Go to sidebar

Scaffold késako ?!

euh, chépa !
Plus sérieusement, c’est quoi ce terme barbare !
Bon, ça se trouve, que ce terme a une définition , Mais aucune relation avec le développement web. Enfin, presque. En français on préférera le terme Prototypage . Ben oui, ça me semble logique de commencer avec un prototype avant d’attaquer une grosse bête ( application ). ça permet de voir les défauts de modélisation, et ça peut éviter des imprévus souvent coûteux. Cependant ce prototypage ne doit pas prendre un temps fou. Hélas c’est ce qui arrive. Mais avec la venu de agile, web 2.0, etc. avec toutes les joies ( et peines ) qu’ils apportent, et surtout ces nouveaux frameworks. Le premier soucis à résoudre c’est augmenter la productivité, c’est pour ça qu’on les appel RAD ( Rapide application developement ). Faut pas se tromper, les concepts du RAD existent depuis longtemps ( comme pour presque toutes les nouvelles technologies d’ailleurs, on ne fait que les ressusciter ). Mais maintenant on a fait un petit lifting.
Bon on s‘égare, c’est quoi alors scaffold ? J’aime l’appeler prototypage rapide. Bien entendu ça marche pas pour n’importe quel type d’applications. Mais souvent on est amené à faire des tâches répétitives. je parle plus exactement des cas où on a des tables de base de données. et on veut bien sûr pouvoir lister les enregistrements, consulter ajouter, modifier ou supprimer un.
Quoi CRUD ? oui c’est ça. Create Read, Update Delete.

Votre mission si vous l’accepter( vous n’avez pas le choix ), faire un CRUD d’une centaine de tables liées. Vous avez une journée pour le faire. ça sera ça ou la fin du monde. votre partenaire ( designer ) va faire la maquette. Kuwaa! mais c’est mission impossible !! ( Bon, désolé, j’ai pas trouvé une meilleure blague ).
Bon c’est vrai que votre partenaire va rire de votre gueule parce que lui il va finir son travail en deux heures maximum. Mais vous, pauvre vous.

Non, superman ne peut rien faire pour vous, ni le père Noël d’ailleurs. Par contre scaffold .. ouais. Hallelujah !
Je peux même vous garantir que vous allez finir votre travail avant votre sadique partenaire.

Scaffold dans Cake

Tous les frameworks qui se respectent ont un système de prototypage rapide. Cela dit, il me semble que ce site ne parle que de Cake ;)
On va voir comment ça marche avec un exemple concret.
Ne vous souciez pas des détails du code mais plutôt de sa_ taille_ .

L’exemple

Les tables

Pour cet exemple on va rester très simple, le but étant d’illustrer le concept et non pas faire la mission !
On a deux tables, produits, et categories.
voilà le SQL


CREATE TABLE `categories` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 50 ) NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL
);


CREATE TABLE `produits` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`designation` VARCHAR( 100 ) NOT NULL ,
`description` TEXT NOT NULL ,
`tarif` DECIMAL NOT NULL ,
`category_id` INT UNSIGNED NOT NULL ,
`created` DATETIME NOT NULL ,
`modified` DATETIME NOT NULL
);

Bien, enregistrez ces deux tables dans votre base de données et, nommez cette base, par exemple, cake_scaffold .

Models

Pour dialoguer avec ces tables on a besoin de créer leurs modèles associés.

créez les deux fichiers suivants dans votre répertoire app/models
nommez les category.php et produit.php respectivement.

category.php:


<?php
class Category extends AppModel {
var $name = 'Category';
var $hasMany = array('Produit');
}
?>

produit.php:


<?php
class Produit extends AppModel {
var $name = 'Produit';
var $belongsTo = array('Category');
}
?>

Donc on a défini les modèles associés aux tables de la base de données. On a aussi spécifié l’association entre catégorie et produit: un produit appartient à ( belongsTo ) une catégorie et, une catégorie a plusieurs ( hasMany ) produits.

Maintenant on va créer les contrôleurs.

Controllers

Normalement comme on a défini dans l’article de présentation quand on a parlé de MVC, les contrôleurs encapsulent business logic, la logic de l’application. font le pont entre les vues et les modèles etc. Cependant là, on ne fait qu’un prototype ( rapide ), alors qu’est ce qu’ils doivent contenir nos contrôleurs.
Rien. quoi rien ? Ben rien.. Enfin une seule instruction. je vous laisse deviner.

categories_controller.php:


<?php
class CategoriesController extends AppController {
var $name = 'Categories';
var $scaffold;
}
?>

produits_controller.php:


<?php
class ProduitsController extends AppController {
var $name = 'Produits';
var $scaffold;
}
?>

Bon a part var $name qui n’est nécessaire que si vous utilisez PHP4. il n’y a que var $scaffold, c’est comme ça qu’on dit à cake on veut un joli prototype.

Tester

Hmm maintenant on doit tester tout ça, je suppose que vous avez cette application accessible par votre serveur web. pour ma part, j’ai un sous répertoire scaffold_cake qui contient l’install de cake et les fichiers qu’on vient d‘écrire.
N’oubliez pas de modifier app/config/database.php et de mettre les informations de la base de données pour que cake puisse se connecter.
Ouvrez http://localhost/scaffold_cake/categories/ et http://localhost/scaffold_cake/categories/ dans votre browser ( Firefox ! )
Yay! Sur la vie de mon stroumpf, ça marche ( ... )!
Mais non, ne soyez pas impressionner, voyons, c’est juste un modeste geste.
Comment a fait cake pour deviner les relations, lier les tables aux modèles, les modèles aux contrôleurs etc..comment ?! conventions. vous l’avez peut être pas remarquer, mais j’ai suivi une logique dans le nommage: Les tables au pluriel, la clé étrangère category_id, les modèles au singulier, les contrôleurs au pluriel, _controller dans le nom de fichier et Controller dans le nom de la classe, etc.

Cake Scaffold premier écran

Cake Scaffold deuxième écran

Bon je vous offre les deux répertoires, models et controllers ainsi que le dump SQL dans un seul archive. Euh mais pourquoi vous n’avez pas fait ça dès le départ? Ha! Ne me dites pas que ctrl(pomme)+c ctrl(pomme)+v vous a fatigué les doigts quand même ! ;)

Ze End

Si vous avez des questions ou si vous avez toujours des problèmes à faire marcher l’exemple, laissez un commentaire ( vous pouvez laisser un commentaire pour autre chose aussi sauf spam hein. Le site est nouveau mais j’en reçois pas mal ! )

Mission accomplie. Bravo Baker.

cake_scaffold.zip

Comments:

  1. Encore un excellent et riche tuto. J’apreecie surtout tes intros qui sont un plus en culture générale informatique.
    Avec ça si on ne comprends pas: “à l‘échafaud”! ;-)

  2. C’est bien. C’est même l’article sur le scaffolding le plus facile à comprendre en français.

    Mais lorsqu’on crée ou modifie un produit, on a une liste déroulante nous montrant les numéros de catégories… Comment fait-on pour qu’il nous affiche les noms? Est-ce que ma question vient de passer outre les limites du scaffolding?

  3. Salut Benoît,
    Oui scaffold assume un champ name ou title, sinon il va afficher l’id .
    il faut ajouter: var $displayField = ‘nom_du_champ’; dans le model

    c’est ce qu’il va être affiché dans la liste déroulante.

  4. Bsr, je découvre un peu plus “profondément” CakePhp. Tout d’abord félicitations pour vos articles qui sont très bien écrit et clairs.

    Dans une première install classique, tout va bien.

    Dans un type d’installation apps comme indiqué foo/apps/bar_app, j’ai bien paramétré le www/bar/index.php
    1/ je me connect mais j’ai perdu mes styles
    2/ A quel endroit doit on copier les controllers/models et quelle est l’url a appellée? :)

  5. Salut Toffi,

    1) mod_rewrite probablement.

    2) tout est écrit en haut.
    ... http://localhost/scaffold_cake/categories/
    avant chaque bout de code je dis où il faut le placer sinon tu télécharges l’archive, tout est dedans.

  6. Re,

    J’ai bien activé le mod_rewrite dans le httpd.conf. J’utilise easyphp. J’ai installé cake dans www/dev/cake/
    avec http://localhost/dev/cake/ out va bien (connexion et styles)

    Mais j’ai voulu déporter le core dans c:/_Serveurweb/foo/
    avec foo/cake et foo/apps/app_bar/controller.. etc

    dans c:/_Serveurweb/www/bar j’ai copié le contenu de webroot. http://localhost/dev/bar/ se connecte bien mais je n’ai pas de style.

    J’ai copié les models et controllers dans c:/_Serveurweb/foo/apps/app_bar/
    ? j’ai bon?
    Ou faut il tout copier dans c:/_Serveurweb/www/bar/app?

    Il ne doit pas me manquer grand chose, j’espère que tu comprends mieux ma question :)

  7. Bon, j’espère que t’as modifié c:/_Serveurweb/www/bar/index.php pour lui dire où se trouve le core, l’app etc si tu dis qu’il se connecte, donc normalement c’est bon.

    Il suffit pas d’activer mod_rewrite, il faut redémarrer le apache. des fois il est nécessaire d’ajouter une directive RewriteBase /bar/ dans le fichier .htaccess comme indiqué dans un commentaire dans l’article sur l’installation.
    regarde la source html générée, ( ctrl + u dans firefox ), regarde si le chemin vers le fichier css est correcte. ça doit être /bar/css/cake.generic.css

  8. Oui j’ai bien modifié l’index.php dans www/bar et bien entendu redemarré apache apres modif du .conf :)

    Mon css pointe au mauvais endroit.
    /dev/bar/app_bar/bar/css/cake.generic.css
    En local la racine c’est le /www/ (je suis sous windows)
    voici ma conf
    define(‘ROOT’, ‘c:/_Serveurweb/foo/apps’);
    define(‘APP_DIR’, ‘app_bar’);
    define (‘CAKE_CORE_INCLUDE_PATH’, ‘c:/_Serveurweb/foo’);

    Peut etre qu’en répondant à ma question: Ou copier les models et controllers de mon appli ça clôturerait mon questionnement. Il faut peut etre sous windows laisser le core dans /www?

  9. Comme j’ai dis, les modèles et contrôleurs font partie de ton application donc tu les copie dans c:/_Serveurweb/foo/apps/app_bar
    les contrôleurs dans le répertoire controllers et les modèles dans le répertoire models.

    /dev/bar/app_bar/bar/css/cake.generic.css ?
    /dev/bar ? est ce que t’as modifié le .htaccess ? tu ne dois pas avoir /dev/bar ça c‘était un exemple dans l’article.

    windows n’a rien à voir avec tout ça, quoi que je te conseil xampp plutôt que easyphp mais ça aussi ça n’a rien à voir.

  10. Bon je ne vais pas faire des commentaires, un forum.

    non je n’ai pas modifié le .htaccess, je ne sais pas pkoi le chemin relatif est erronné. Pkoi app_bar apparait dans le lien pour les css alors que app_bar ne se trouve pas dans /www/bar … peut etre un include_path . Je continu mes recherches, merci pour ton aide.

  11. Merci pour tes bons conseils. Je débute et je voulais te souligner l’interêt porté à tes écris et j’aime aussi la manière que cela s’imprime.
    Merci encore

Aide Textile