IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

EmbedForm many to many [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    Petite précision, je suis sous Symfony 1.4.8 avec Doctrine 1.2

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    A ma connaissance, les embedForm sont conçu pour gérer, en automatique, uniquement des relations de type 1-n.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    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 ?

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] EmbedForm et many to many
    Par jeronimo83 dans le forum Symfony
    Réponses: 8
    Dernier message: 14/06/2010, 15h50
  2. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  3. [hibernate 3] mapping many-to-many
    Par darkyspirit dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/12/2006, 19h37
  4. [EJB2.1 Entity] [XDoclet][JBoss] CMR - Many to Many Relation
    Par dauggui dans le forum Java EE
    Réponses: 4
    Dernier message: 24/04/2006, 11h45
  5. [hibernate]relation many-to-many
    Par quilo dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/12/2005, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo