Scaffolding et structure de table

18 views
Skip to first unread message

Bidibule

unread,
Jul 24, 2008, 9:31:56 AM7/24/08
to Cakephp-fr
RE à tous.

Promis après j'arrête! :)

Je désire me faire une petite application de gestion de devis avec
CakeHPP afin de me faire la main.

J'ai donc fait 4 tables :

- une table clients
- une table devis avec une clé étrangère vers le client (client_id).
Un devis appartient à un seul client
- une table produits (qui renseigne les différents types de
prestation)
- une tables lignes_devis afin de stocker les lignes à afficher dans
le devis avec 2 clés étrangères : produit_id et devis_id

Donc en gros, j'encode un devis en sélectionnant un compte, ensuite,
j'ajoute des lignes au devis en sélectionnant les produits (via des
combobox)

Je me suis essayé au Scaffolding sur le tutoriel d'IBM mais leur
exemple est plus "simple".

Donc question :

- Comment modèliser le tout sous CakePHP (1 modèle/controlleur par
table?) ?
- Les seules tables à modifier telles quelles sont les tables
'Produits' et 'Clients' (en mode ajout/edit/delete)
Le reste étant une méthode 'add' pour le modèle devis permettant d'

J'aurai voulu savoir comment vous auriez fait pour modéliser le tout

Bidibule

unread,
Jul 24, 2008, 9:36:36 AM7/24/08
to Cakephp-fr
GRRR, mon nouveau clavier me joue des tours!

Donc en gros, comment auriez-vous modéliser le tout ?
Les actions possibles seront donc

- ajouter/edition/suppression de clients
- ajouter/éditer/supprimer des produits
- ajouter un devis pour un client en y ajoutant des lignes, chaque
lignes provenant de la table produit.

Est-ce que le Scaffolding va m'aider dans ce cas-ci (et comment vous
voyez la chose) ou est-ce que je n'irais pas plus vite en faisant le
tout à part ?

Merci!

avairet

unread,
Jul 24, 2008, 9:56:15 AM7/24/08
to Cakephp-fr
Je ferais comme çà :

- une table devis
- une table clients
- une table produits
- une table de liaison devis_produits (devi_id, produit_id) Attention
aux S !
Mais là j'hésite car tu n'es pas clair : tu parles une fois de lignes,
une fois de comptes, une fois de produits, une fois de clients pour
cette table de laison

Et après je ferais un petit Bake qui me créera tout seul les
associations entre modèles, les actions CRUD (Ajouter/Editer/
Supprimer) dans les contrôleurs et dans les vues ! Et tu verras que
Cake ne créera pas de modèle ni de contrôleur pour la table de
liaison, mais une association HABTM dans les deux modèles concernés
par la liaison.

Le scaffolding c'est bien pour créer une petite maquette rapide, mais
cela reste très sommaire et si tu ne respectes pas les conventions
Cake (noms des tables, des champs, des contrôleurs, etc.), c'est
plantage assuré... ce qui finalement te permet de savoir rapidement si
ta modélisation est mauvaise ;o)

Bidibule

unread,
Jul 24, 2008, 10:06:07 AM7/24/08
to Cakephp-fr
Oki quand je dis comptes, cela veut dire client et les lignes, en gros
ce sont les lignes associées à un devis.

Un devis peut avoir x lignes, chaque lignes du devis se rapportant à
un produit!

Quand j'ajoute un devis, je remplis donc les infos de la table
devis(description,remarques, etc) et ensuite j'ajoute des lignes de
'produits' existants au devis (donc ma table lignedevis se remplit)
Le tout sous forme de combobox.

Je doute que Cake me fasse une vue 'add' pour le devis en ajoutant une
liste déroulante avec les clients potentiels et une liste déroulante
avec la liste des produits si ?
Quid si le prix par défaut des produits à rajouter peut changer ?

Si Cake me fait ça YOUHOU je vous raconte pas!

- Encore une question : j'ai testé le scaffolgind sur les produits et
sur les clients. Nickle c'est génial mais comment personnaliser ces
vues automatique

Merci
l

Bidibule

unread,
Jul 24, 2008, 10:19:18 AM7/24/08
to Cakephp-fr
En gros j'ai ceci si j'ai bien compris au niveau nomenclature.
Si c'est pas bon tapez moi sur les doigts.

J'ai mes 4 tables prêtes pour faire de la cuisine ^^

Il y aurait apparemment un problème avec mon champ 'qte' dans la table
de liaison d'après d'autres posts..

Merci à vous


CREATE TABLE `clients` (
`id` int(11) NOT NULL auto_increment,
`numero` varchar(20) collate utf8_unicode_ci NOT NULL,
`societe` varchar(150) collate utf8_unicode_ci NOT NULL,
`nom` varchar(100) collate utf8_unicode_ci NOT NULL,
`prenom` varchar(100) collate utf8_unicode_ci NOT NULL,
`adresse` varchar(150) collate utf8_unicode_ci NOT NULL,
`cp` varchar(20) collate utf8_unicode_ci NOT NULL,
`ville` varchar(100) collate utf8_unicode_ci NOT NULL,
`pays` varchar(100) collate utf8_unicode_ci NOT NULL,
`tel` varchar(100) collate utf8_unicode_ci NOT NULL,
`fax` varchar(100) collate utf8_unicode_ci NOT NULL,
`gsm` varchar(100) collate utf8_unicode_ci NOT NULL,
`email` varchar(100) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=6 ;


CREATE TABLE `devis` (
`id` int(11) NOT NULL auto_increment,
`numero` varchar(50) collate utf8_unicode_ci NOT NULL,
`date_creation` int(11) NOT NULL,
`description` blob NOT NULL,
`remarques` blob NOT NULL,
`client_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=1 ;

CREATE TABLE `produits` (
`id` int(11) NOT NULL auto_increment,
`reference` varchar(100) collate utf8_unicode_ci NOT NULL,
`description` blob NOT NULL,
`prix_htva` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=2 ;


CREATE TABLE `produits_devis` (
`id` int(11) NOT NULL auto_increment,
`qte` float NOT NULL,
`prix_htva` float NOT NULL,
`produit_id` int(11) NOT NULL,
`devi_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
AUTO_INCREMENT=1 ;

avairet

unread,
Jul 24, 2008, 10:34:27 AM7/24/08
to Cakephp-fr
Je commence par ton dernier message :

Les trois premières tables sont OK, même si je ne les aurais pas
faites en InnoDB...

Par contre la dernière est selon moi mal foutue !
1) son nom devrait être "devis_produits" (Cake veut les noms des
modèles dans l'ordre alphabétique).
2) Dans la mesure où elle est censée représenter une liaison N:M entre
des produits et des devis, elle ne dervait contenir que "devi_id" et
"produit_id"...

Ce qui me fait donc dire que ta modélisation et ta logique sont
alambiquées... et là Cake ne pourra rien pour toi.

>>>>> Je doute que Cake me fasse une vue 'add' pour le devis en ajoutant une
>>>>> liste déroulante avec les clients potentiels et une liste déroulante
>>>>> avec la liste des produits si ?

Et bien si, Cake te générera tout seul les "combobox" ! C'est bien
pour cela qu'on l'aime le Gâteau !
Mais attention, il te fera la vue add() avec le formulaire qui va bien
si et seulement si tu as bien écrit tes tables, pour qu'il puisse
détecter tout seul les associations et donc générer les modèles et
contrôleurs correctement.


>>>> j'ai testé le scaffolgind sur les produits et
>>>> sur les clients. Nickle c'est génial mais comment personnaliser ces
>>>> vues automatique

Tu ne peux pas personnaliser les vues de Scaffolding parce qu'elles
n'existent pas ! Le scaffold utilise des "vues virtuelles" à partir de
squelettes par défaut.
Donc si tu veux personnaliser tes vues, pas de scaffold mais bien un
"baking" automatique via la ligne de commande ou au pire un codage
entièrement à la main.

Bidibule

unread,
Jul 24, 2008, 10:46:50 AM7/24/08
to Cakephp-fr
Ok compris.

Par contre pour la quantite, cela me semble logique dans la mesure où
on peut "vendre" 4 x le même produit d'un coup.
D'ailleurs ça me fait penser que je dois aussi y rajouter un champ
'remarque', nécessaire.

genre

Nom du devis : D0001
Client [COMBOBOX]

Description :
Remarques

ID Ref Qte Prix HTVA Remarques
1 DNS 4 60
monsite.com,mysite.fr,etc
1 DEV 8 50


Mais je doute que Cake prenne ça par déafut.
Je rejoins une ancienne discussion qui y fait mention (avec le
paramètre with)
http://groups.google.com/group/cakephp-fr/msg/610346ac5c16a382

Perso j'ai pas trouvé de bonne doc sur l'array que tu dois passer pour
les associations de modèle.

Merci

ayoub hidri

unread,
Jul 24, 2008, 11:26:50 AM7/24/08
to cakep...@googlegroups.com
voilà j'attendais un exemple pareil pour relancer l'histoire de la table d'association avec des données comment peut on faire autrement ,avairet, si par exemple un client a commandé 5 boite du produit x ou va on mettre la quantité,??
Moi je pense que les tables sont ok mis à part l'ordre des noms sur la table produits_devis qui devrait etre devis_produits

2008/7/24 Bidibule <bbla...@tagexpert.be>:

Guillaume

unread,
Jul 24, 2008, 12:10:36 PM7/24/08
to Cakephp-fr
JE n'ai pas eu le temps de m'y replonger depuis mon retour de
vacances, mais avant, dans un moment d'illumination sans doute,
j'avais réussi sans trop de souci à enregistrer/updater des valeurs
dans des "extra fields" de ma table de liaison, avec un id en clef
primaire.

Sinon deux autres trucs :
- Cake reconnait automatiquement un certain nombre de champs pour
l'affichage dans les combo box. de mémoire, "name", "title"... ça ne
marche pas avec les noms de champs en français ! il faut alors
renseigner la variable $displayField de ton modèle. Autre problème
classique, cette variable est une string, pas un tableau. Donc si tu
veux afficher le prénom et le nom du client, c'est (un peu) plus
compliqué.
- les conventions de nommage de cake sont anglocentriques, forcément,
mais on peut lui donner les règles de passage singulier->pluriel dont
on a besoin assez simplement. Plutôt que d'écrire devis avec une
faute, je suis plutôt d'avis soit de gérer son pluriel correctement,
soit de tout passer en anglais. Mais bon, chacun son avis sur la
question, ce n'est pas très grave.

On 24 juil, 17:26, "ayoub hidri" <hidri.ay...@gmail.com> wrote:
> voilà j'attendais un exemple pareil pour relancer l'histoire de la table
> d'association avec des données comment peut on faire autrement ,avairet, si
> par exemple un client a commandé 5 boite du produit x ou va on mettre la
> quantité,??
> Moi je pense que les tables sont ok mis à part l'ordre des noms sur la table
> produits_devis qui devrait etre devis_produits
>
> 2008/7/24 Bidibule <bblamp...@tagexpert.be>:
> ...
>
> plus de détails »

Pierre MARTIN

unread,
Jul 24, 2008, 12:18:05 PM7/24/08
to Cakephp-fr
Cela ne fonctionnerait pas si on remplacait la tables HABTM par une
table "commandes" contanant id, devi_id, produit_id, qtte etc ...
Du coup on aurait devis hasMany commandes et commande hasOne devis.

Qu'est-ce qui poserait probleme ici ?

On 24 juil, 11:26, "ayoub hidri" <hidri.ay...@gmail.com> wrote:
> voilà j'attendais un exemple pareil pour relancer l'histoire de la table
> d'association avec des données comment peut on faire autrement ,avairet, si
> par exemple un client a commandé 5 boite du produit x ou va on mettre la
> quantité,??
> Moi je pense que les tables sont ok mis à part l'ordre des noms sur la table
> produits_devis qui devrait etre devis_produits
>
> 2008/7/24 Bidibule <bblamp...@tagexpert.be>:
> ...
>
> plus de détails »

Bidibule

unread,
Jul 28, 2008, 12:24:45 PM7/28/08
to Cakephp-fr
Ici j'ai fait une relation HBTM dans le modèle Devis et une relation
HM dans le modèle produits ce qui me semble logique.
1 produit peut se retrouver dans plusieurs devis et un devis comporte
1 ou plusieurs produits.

OK ça marche c'est génial çois qu'on doit adapter son mode de
raisonnement au framework aussi. Ou alors ne pas profiter du baking

Car si je veux rajoiuter des extrafields, là ça coince.

Je voulais rajouter un champ 'remarque' et un champ 'quantité' pour
chaque ligne.

Ex.

Le produit est "DNS" soit un enregistrement de nom de domaine
Généralement je mets x noms de domaine avec en remarque les noms de
domaine à réserver. Logique.
Donc dans ma table devi_produit j'ai x lignes qui corresponde à un
produit d'un devis, avec la quantité et les remarques.

Avec ma relation HBTM (Devis) et HM (produit), je peux choisir un ou
plusieurs produits différents masi pas question de sélectionner 5 fois
DNS.
En effet, après un p'tit coup de Bake, il me propose une combobox
multiliste avec tous les produits mais ensuite lors de l'édition, je
peux enlever/ajouter des produits mais pas dire "rajoute moi un 2eme
DNS".

En gros lorsque je fais un devis, j'entre les infos du devis
(sélection client, remarques, etc) et ensuite j'ajoute au fur et à
mesure les produits, qui se réaffiche avec mes infos devis.

Je crois que je vais devoir revoir àa ou faire à la main non? Si oui
je dois construire la/les requêtes moi même non?


Merci à vous

Pierre MARTIN

unread,
Jul 28, 2008, 3:08:55 PM7/28/08
to Cakephp-fr
N'empeche ... j'attends toujours l'avis de quelqu'un sur ma solution
qui me semble convenir a ton cas !
Un hasMany/belongsTo entre "devis" et "commandes". Commandes
contenant : id, devi_id, produit_id, qtte (ou toute info
complementaire)

^^
> ...
>
> plus de détails »

Bidibule

unread,
Jul 29, 2008, 4:05:03 AM7/29/08
to Cakephp-fr
C'est un peu un clone de la table de liaison actuelle non?
J'ai une table devis_produits qui renseigne ces champs.

Encore un truc, en faisant mon baking, il me mets bien la liste pour
les produits mais pas pour les clients.
En gros, un devis est relié par un client via son client_id mais pas
de combobox générée...

J'ai mis un BT dans le modèle Devis vers client en plus du HBTM vers
produits) et un HM dans le modèle Client mais je me suis p-e
trompé ??
J'ai l'impression qu'il prend juste la relation HBTM vers produit
> ...
>
> read more »
Reply all
Reply to author
Forward
0 new messages