8791 sujets

Développement web côté serveur, CMS

Bonjour,

je dois réoudre un probleme sur une application que je dois coder sous zend framework, une application en apparence il s'agit essentiellement de faire de la saisie de données afin de générer des statistiques. Et donc pour cela on a différentes tables qui sont reliées en général à un formulaire qui va récolter les informations nécessaire pour les insérer dans cette table.

Le petit piège sur ce projet c'est que les utilisateurs finaux souhaitent pouvoir ajouter des champs dans les différents formulaires si ils ressentent le besoin de récolter nouveaux types d'informations. Exemple tout bete: on récolte les informations sur les employés de l'entreprise à travers un formulaire qui comporte un champ téléphone fixe et il s'avert qu'on veuille ajouter un champ téléphone mobile. Jusque là so far so good, cependant afin de sauvegarder cette nouvelle info en base de données, typiquement on va devoir ajouter une nouvelle colonne dans la table Employée de notre base...

L'application étant développée avec zend framework, c'ets donc là que se pose la tuile car on vient de modifier le modèle de données et donc il faut régénérer le modèle via doctrine ou propel ou la main sous zendDB. Il n'est évidemment pas question de livrer au client une appli sur laquelle il va devoir faire des lignes de commande pour générer des classes du modèle de données.

ma question: Comment structurer ma base de données pour que je puisse faire les modifications attendues par mon client sans passer passer par l'ajout d'une nouvelle colonne et donc une modification du modèle de données nécessitant une régénération des classes du model?

Exemple de tables: Produits (prix, description, nom), Magasins(adresse, type)
exemples formulaire: saisie info produits, saisie info magasin
Exemple modification: on veut pouvoir saisir et enregistrer en base le nom du fabriquant du produit, et l'on voudrai pouvoir saisir et enregistrer en base le nom du gérant du magasin. Comment pourrai t on structuré la base de donnée pour qu'elle puisse sous zend framework permettre ce type d'opération: ajout de champ formulaire et possibilité d'enregistrer les nouvelles saisies sans modifier la structure de la BDD?
Hello phifeshaheed et bienvenue.

Personnellement et vu ta contrainte je serais parti sur un modèle complètement dynamique de ces tables. Cela donnerait quelque chose comme :

table tables_dynamiques
* id_table
* nom
* description

table champs_tables
* id_champ
* id_table
* nom
* description
* type (alpha, numérique, email...)
* longueur
* decimales
* ordre (d'affichage)
* clef

table enregistrements
* id_enreg
* id_champ
* numero_enreg
* valeur


Ce qui pourrait donner :

tables_dynamiques

* id_table : 1
* nom : "Magasins"
* description : "mes Magasins que j'ai"


champs_tables

* id_champ : 1
* id_table : 1
* nom : "adresse"
* description : "adresse du magasin"
* type : "alpha"
* longueur : 40
* decimales : null
* ordre : 1
* clef : false

* id_champ : 2
* id_table : 1
* nom : "type"
* description : "type de magasin"
* type : "alpha"
* longueur : 25
* decimales : null
* ordre : 2
* clef : true

enregistrements

* id_enreg : 1
* id_champ : 1
* numero_enreg : 1
* valeur : "10 rue du stade"

* id_enreg : 2
* id_champ : 2
* numero_enreg : 1
* valeur : "épicerie"


* id_enreg : 3
* id_champ : 1
* numero_enreg : 2
* valeur : "20 av. du lapin"

* id_enreg : 4
* id_champ : 2
* numero_enreg : 2
* valeur : "armurerie"

Mais bon, c'est un peu chaud à gérer et je n'ai jamais essayé Zend donc il y a peut-être plus simple à faire. Smiley langue
Je pense aussi que la solution se trouve du côté de cette piste.
Ca rejoint le modèle des CMS comme MODx où l'on a une table référençant les types de variables (émulation des colonnes d'un table en base de donnée), et une autre table contenant la valeur des variables.

Si on reprend le modèle de MODx on a quelque chose comme :
- tpl_var : id_var, nom, description, type
- tpl_var_centent = id_content, id_var, value

Enfin ça rejoint largement ce que propose Heyoan. ^^
bonjour ,

pour une gestion "dyamique des champs", je verrais une table "profile" associée.

Exemple ppour une table "user" comportant un id_user , on l'associe avec une table user_profile, reprenant l'"id_user" et 2 champs : key et value.

ce qui donne "en gros"

#table users
 user_id         serial          not null,
 username        varchar(255)    not null,
  primary key (user_id),
  unique (username)

#table users_profile
 user_id         bigint unsigned not null,
    profile_key     varchar(255)    not null,
    profile_value   text            not null,

    primary key (user_id, profile_key),
    foreign key (user_id) references users (user_id)


ainsi tu peux ajouter autant de clé (mail, tél fixe, mobile, etc) à une valeur associé à un utilisateur. ( un genre de hashMap)
Voilà en bref l'idée de gestion de "champ dynamique"

Ton controlleur formulaire doit gérer les insert sur les 2 tables bien entendu .

j'espère que cela t'aidera Smiley lol
Modifié par kzone (27 Jul 2009 - 11:27)