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 18/01/2011, 23h37   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 12
Points : 6
Points : 6
Par défaut EmbedForm many to many

Bonjour,

Encore un problème avec les embedform !!!

Je m'explique :
J'ai 2 tables, TypeCarte et Niveau qui sont reliées par une "relation n:n" contenant un champs prix. En français, pour chaque type de carte, on peut attribuer un prix par niveau.

Le problème est qu'il m'est impossible d'enregistrer les prix à partir des embedForm contenus dans le formulaire de TypeCarte.
Bon je vous affiche le code ça vous parlera plus bande de geeks

schema.yml
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
TypeCarte:
  actAs: [Timestampable]
  columns:
    id:
      type: integer(11)
      primary: true
      autoincrement: true
    name:
      type: string(100)
      notnull: true
      unique: true
 
NiveauTypeCarte:
  columns:
    niveau_id:
      type: integer(11)
      primary: true
    typecarte_id:
      type: integer(11)
      primary: true
    prix:
      type: float
      unsigned: true
      notnull: true
  relations:
    Niveau:
      local: niveau_id
      foreign: id
      foreignAlias: NiveauTypeCartes
    TypeCarte:
      local: typecarte_id
      foreign: id
      foreignAlias: NiveauTypeCartes
 
Niveau:
  columns:
    id:
      type: integer(11)
      primary: true
      autoincrement: true
    name:
      type: string(100)
      notnull: true
      unique: true
  relations:
    TypeCartes:
      class: TypeCarte
      local: niveau_id
      foreign: typecarte_id
      foreignAlias: Niveaus
      refClass: NiveauTypeCarte
TypeCarteForm.class.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
class TypeCarteForm extends BaseTypeCarteForm
{
 
  protected $scheduledForDeletionPrix = array();
 
  public function configure()
  {
    $newNiveaus = new sfForm();
    $niveaus = Doctrine::getTable('Niveau')->createQuery('n')->execute();
    $count = 0;
    foreach ($niveaus as $niveau) {
      $niveauId = $niveau->getId();
      $niveauName = $niveau->getName();
      $niveau_form = new NiveauTypeCarteForm();
      if($this->getObject()->getNiveaus($niveauId)) {
	$newNiveaus->embedForm($niveauName, $niveau_form);
	$newNiveaus->widgetSchema[$niveauName]->setLabel($niveauName);
      }
      $count ++;
    }
    $this->embedForm('newNiveaus', $newNiveaus);
  }
 
  protected function doBind(array $values)
  {
    if (isset($values['NiveauTypeCartes']))
    {
      foreach ($values['NiveauTypeCartes'] as $i => $prixValues)
      {
        if (isset($telValues['delete']) && $prixValues['id'])
        {
          $this->scheduledForDeletionPrix[$i] = $telValues['id'];
 
        }
      }
    }    
    parent::doBind($values);
  }
 
  protected function doUpdateObject($values)
  {
    if (count($this->scheduledForDeletionPrix))
    {
      foreach ($this->scheduledForDeletionPrix as $index => $id)
      {
        unset($values['NiveauTypeCartes'][$index]);
        unset($this->object['NiveauTypeCartes'][$index]);
        Doctrine::getTable('NiveauTypeCarte')->findOneById($id)->delete();
      }
    }
    $this->getObject()->fromArray($values);
  }
 
  public function saveEmbeddedForms($con = null, $forms = null)
  {
    if (null === $con)
    {
      $con = $this->getConnection();
    }
 
    if (null === $forms)
    {
      $forms = $this->embeddedForms;
    }
    foreach ($forms as $form)
    {
      if ($form instanceof sfFormObject)
      {
        if ($form->getModelName()=='NiveauTypeCarte' && !in_array($form->getObject()->getId(), $this->scheduledForDeletionPrix)
	){
          $form->saveEmbeddedForms($con);
          $form->getObject()->save($con);
        }
      }
      else
      {
        $this->saveEmbeddedForms($con, $form->getEmbeddedForms());
      }
    }
  }	 
 
}
NiveauTypeCarteForm.class.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class NiveauTypeCarteForm extends BaseNiveauTypeCarteForm
{
  public function configure()
  {
 
    unset($this['typecarte_id']);
 
    if(!$this->isNew()){
	$this->widgetSchema['delete'] = new sfWidgetFormInputCheckbox(array(
		'label' => 'Supprimer'
	));
	$this->validatorSchema['delete'] = new sfValidatorPass();
    }
 
  }
J'ai aussi essayé de mettre directement un embedRelation (qui fonctionne très bien sur les relations 1:n), l'affichage est parfait mais toujours impossible d'enregistrer, tout comme le plugin ahDoctrineEasyEmbeddedRelationsPlugin ...

J'espère qu'une âme charitable sera me démêler de cette situation, j'ai vu sur pas mal de forum ce problème mais malgré sa récurrence aucune solution ou info n'est donnée.

Merci d'avance
FloYo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 23h39   #2
Invité régulier
 
Inscription : janvier 2011
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 12
Points : 6
Points : 6
Petite précision, je suis sous Symfony 1.4.8 avec Doctrine 1.2
FloYo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 00h09   #3
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
A ma connaissance, les embedForm sont conçu pour gérer, en automatique, uniquement des relations de type 1-n.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 00h28   #4
Invité régulier
 
Inscription : janvier 2011
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 12
Points : 6
Points : 6
Merci pour ta réponse.

Mais notre problème est que l'on doit forcer l'utilisateur à saisir un prix pour chaque niveau lors de la création d'un type de carte et la solution la plus évidente nous paraissait le embedForm et/ou embedRelation ... jusqu'à aujourd'hui

On avait pensé, dans le formulaire TypeCarte, boucler sur Niveau pour afficher le champs prix de la table NiveauTypeCarte dans des embedForm quand la relation n'existe pas ou dans avec embedRelation quand elle existe.

Est ce que tu aurai une piste sur ça ou carrément autre chose ?
FloYo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 08h12   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
En relisant tous le poste, j'ai l'impression que tu es un peu à côté dans l'implémentation de ce que tu veux faire. Du coup, ce n'est plus des embedForm basés sur un relation n-n mais sur une relation 1-n, ce qui est réalisable. En effet, la donnée que tu souhaites modifier est sur la relation et pas dans la table niveau. Et, entre TypeCarte et NiveauTypeCarte nous avons une liaison 1-n...

Si j'ai bien compris, pour un TypeCarte il convient de remplir la valeur de prix pour tous les couple NiveauTypeCarte possibles. Si j'ai faux là, ce qui précède est probablement faux aussi...

L'idée est de créer tous les couples possible dans la table NiveauTypeCarte avant d'afficher le formulaire. Il suffit alors de baser le embed sur NiveauTypeCarte qui est en 1-n.

Ce que tu essayes de faire actuellement est d'embed des enregistrements qui n'existent pas, d'où le problème.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 02h25   #6
Invité régulier
 
Inscription : janvier 2011
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 12
Points : 6
Points : 6
Pour la modification d'un type de carte ça passerai mais on ne peut pas créer tous les couples dans NiveauTypeCarte avant d'avoir ajouté le type de carte.

Là on essai de tout recoder pour ce faire une sorte de embedRelationForEach mais c'est pas gagné
Sinon tant pis, on ajoutera un nouveau module.

Mais je suis toujours preneur d'une meilleure méthode !
FloYo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 10h43   #7
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Effectivement, il faut que le type de carte soit créé avant. Je pense que le passage par un form intermédiaire pour la création est nécessaire.

Si non, il doit être possible de passer en grande partie par du JS. Mais niveau récupération, pour un formulaire qui va changer, ça va être coton pour générer le form qui fera la validation.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 11h38   #8
Invité régulier
 
Inscription : janvier 2011
Messages : 12
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 12
Points : 6
Points : 6
Bon, après de multiples tentatives, on a créé un autre module. Pas très logique sur l'appli mais apparemment on ne peut pas faire autrement ^^

Merci pour ta participation
FloYo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h09.


 
 
 
 
Partenaires

Hébergement Web