Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/09/2007, 17h05   #1
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Par défaut Modifier le comportement d'un module admin

Bonjour,
J'ai généré un module d'admin avec symfony, mais la je voudrais le modifier un peu pour mieu répondre au besoins :
Le module conserne une table de la bd qui possède une clé étrangère. Dans la partie 'edit' de mon module, au lieu de l'ID numérique stoqué dans la table, je voudrais afficher une description dans la table référencée par la clé étrangère. En gros je veux afficher des info d'une autre table dans une liste déroulante.
Voici mon schéma de bd pour être plus clair :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
propel:
  produit:
    id:             ~
    titre_produit:  varchar(200)
    sous_titre_produit: longvarchar
    prix:           float
    code_isbn:      varchar(10)
    code_barre:     varchar(13)
    created_at:     ~
    editeur_id:     ~
...
  editeur:
    id:             ~
    nom_editeur:    varchar(50)
    site_web:       varchar(50)
    created_at:     ~
 
...
Voila ! je créer un admin pour Produit, lorsque je veux ajouter ou modifier un produit, il faut que la liste de tous les éditeurs s'affiche et mette à jour le champs editeur_id.

J'ai réussi a avoir une liste des éditeurs avec comme id le code éditeur :
Code :
1
2
<?php use_helper('Object'); ?>
<?php echo select_tag('editeur',objects_for_select(EditeurPeer::getAll(), 'getId', 'getNomEditeur')); ?>
Mais biensur quand j'ajoute ce partial, le champ editeur_id n'est pas relié à ce select, donc pas de mise à jour.

quelqu'un connaitrait il un autre moyen ?
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2007, 19h41   #2
Membre éclairé
 
Avatar de nicocsgamer
 
Inscription : mars 2005
Messages : 324
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Luxembourg

Informations forums :
Inscription : mars 2005
Messages : 324
Points : 365
Points : 365
Envoyer un message via MSN à nicocsgamer
Dans ta création de ton produit tu utilise la fonction setEditeurId(). Pour la valeur tu récupére celle de ton select.
nicocsgamer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2007, 20h06   #3
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Oui, en temps normal j'aurais fait sa. Mais la c'est un module d'admin généré par propel, les actions et les templates sont dans le dossier cache. Donc a moins de surcharger la methode qui save le produit dans actions.class.php (ce que je ne veux pas faire pour ce petit cas), je n'ai pas d'autre moyen de modifier le comportement du module qu'avec les partials et les generators...

Donc je voudrais créer un partial qui update le champ editeur_id de la table produit. Et ce partial doit être la liste (id, nom) de tous les éditeurs. Pour la liste c'est bon, mais pour updater le champ je rame encore.
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2007, 20h18   #4
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
J'ai trouvé !!!
Il suffit d'appeler le select nomdeclasse[nomdechamp], ou nom de classe est le nom de la classe de l'objet à créer ou modifier, et nom de champ et le nom de champ à modifier. Mon select deviens :
Code :
1
2
<?php use_helper('Object'); ?>
<?php echo select_tag('produit[editeur_id]',objects_for_select(EditeurPeer::getAll(), 'getId', 'getNomEditeur', $produit -> getEditeurId())); ?>
Merci Nico pour ton aide, elle est très précieuse pour ce forum !
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 15h58   #5
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Petit ajout assez bizarre je trouve :
Il faut que le nom du partial soit le même que celui du champ à modifier. Exemple : je veu modifier le champ produit_id, mon partial DOIT se nommer _produit_id.php. Est ce que quelqu'un a entendu parler de ça ?
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2007, 01h55   #6
Invité de passage
 
Inscription : septembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 2
Points : 2
Points : 2
salut
Dans ton cas, pas besoin définir un partial. Le mieux c'est de gérer ça dans le generator.yml.
Pour cela, il est très important que ton schema soit bien défini.
(tu vas devoir regénérer le modèle à mon avis)
moi j'écrirai ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
propel:
  produit:
    id:             ~
    titre_produit:  varchar(200)
    sous_titre_produit: longvarchar
    prix:           float
    code_isbn:      varchar(10)
    code_barre:     varchar(13)
    created_at:     ~
    editeur_id:      { type: integer, foreignTable: editeur, foreignReference: id, onDelete: cascade }
...
  editeur:
    id:             ~
    nom_editeur:    varchar(50)
    site_web:       varchar(50)
    created_at:     ~
...
Ensuite, pas besoin de regénerer le module Produit avec admin generator.
Tu vas dans racine_de_ton_projet/lib/model/Editeur.php(pas EditeurPeer.php)
et tu ajoutes ceci :
Code :
1
2
3
4
5
 
public function __toString()
		{
			return $this-> getNomEditeur();
		}
Next, Dans ton generator.yml, tu peux ajouter ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      Produit
    theme:            default
 
    fields:                                                    
      nom_editeur:  { name: Nom de l éditeur  }
    list: 
      display: [nom_editeur]  # ajouter les autres champs que tu souhaites administrer
    edit:
      display: [nom_editeur]  # ajouter les autres champs que tu souhaites administrer
Donc voilà, Comme ça, tout est géré par l'admin generator de symfony(l'écriture en base, la mis à jour dans la table editeur, etc..). En tout t'auras pas écris une ligne de php.(bon y a le __toString(avec 2 underscores))..

Il faut biensur enlever ce que t'as mis dans ton templates..et vider le cache (symfony cc en ligne de commande)

Un dernier truc, tu peux enlever le deleteOnCascade dans le schema.yml.. si t'as pas besoin d'effacer en cascade.
aphextwin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/10/2007, 17h35   #7
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Merci beaucoup !
très propre comme solution, ça me dérangeait un peu de devoir ecrire un partial pour chaque join...
Peux tu me dire ou je peux trouver la documentation pour voir les options des fichiers yaml pour la spécification de schéma de BD ?
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2007, 13h28   #8
Invité de passage
 
Inscription : septembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 2
Points : 2
Points : 2
Oui en fait le partial va modifier le comportement de base de l'admin symfony.. Normalement tu peux presque tout faire avec les fichiers de configuration.. Il reste toujours à trouver la méthode..avec symfony rien n'est simple au début. Mais une fois tu commences à maîtriser bien le framework, ça va super vite.

Sinon pour les options diverses des fichiers yml, il y a le chapitre consacré dans le livre de sumfony(tu l'a déjà regarder surement).. Sinon la cheat sheet de l'admin generator est vraiment pas mal foutu, ça synthétise pas mal de choses...

à part ça tu peux apprendre énormément dans les snippets sur le site de symfony (c'est des bouts de code expliqués, tu trouve souvent des gens qui ont exposé un prolème que tu rencontres).. tu peux aussi parcourir les snippets par tag, ce qui est très utile(pour regarder tout les snippets en rapport avec l'admin par exemple).

En fait, le succès de symfony est entrain de se réaliser en partie grâce à la communauté qui est derrière.. il y a de plus en plus de doc tous les jours.

allez bonne chance,
aphextwin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2007, 20h34   #9
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Oui merci !
J'ai vu sur le livre les possibilité (et limitations) de yml pour la description des bases de données. Mais trouvez vous cela normal que TOUS les type de données MySql ne soient pas disponibles dans les attributs d'un fichier YML... Je pense particulièrement au type ENUM ou BLOB.
Est ce volontaire pour assurer l'abstraction (un genre de plus petit dénominateur commun) ?
Sinon, comment pourrais je représenter ce type de données ?

Merci pour votre aide les gars, j'ai vraiment avancé grace a vous !
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h38.


 
 
 
 
Partenaires

Hébergement Web