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 :

Save multiple level Embed form [1.x]


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Save multiple level Embed form
    Bonjour à tous,

    Voila, j'y suis, j'ai souvent utilisé votre forum pour me réconforter dans me choix de développement ... mais la je bloque sur l'enregistrement d'un formulaire à 3 niveaux: le form principal avec un embed qui lui-même possède un embed.
    Petite mise en situation:
    J'édite une fiche produit dans mon backend, mon produit possède un article (premier form embed) qui lui même possède un ou plusieurs tarifs.
    J'ai suivi l'exemple des formulaires avancés pour concentrer mes tarifs dans une collection (http://symfony.com/legacy/doc/more-w...advanced-forms).
    j'affiche par défaut 3 formulaires tarifs dans mon formulaire principal mais lors de l'enregistrement, celui-ci ne supprime pas les tarifs vide et les insères dans la base de données.
    Je surcharge alors la méthode du formulaire principal saveEmbeddedForms pour supprimer avant l'enregistrement les tarifs vides mais j'ai l'erreur suivante :
    Cannot remove form fields (read-only).

    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
    public function saveEmbeddedForms($con = null, $forms = null)
      {
        if (null === $con)
          $con = $this->getConnection();
     
        if (null === $forms)
          $forms = $this->getEmbeddedForms();
     
        $massificationArticle = $this->getValue('NewMassificationArticle');
        $tarifs = $massificationArticle['newTarifsFournisseur'];
        foreach ($forms['NewMassificationArticle']['newTarifsFournisseur'] as $name => $form)
        {
          if (!isset($tarifs[$name]))
            unset($forms['NewMassificationArticle']['newTarifsFournisseur'][$name]); //read-only : unset impossible
        }
     
        return parent::saveEmbeddedForms($con, $forms);
      }
    j'ai alors déplacé cette fonction dans le formulaire de l'article (ce qui semble d'ailleurs plus logique) mais les tarifs sont toujours inexistant malgré la présence de valeur à l'édition et les formulaires sont tous supprimés. De ce fait c'est l'inverse qui se produit, à savoir qu'aucun tarifs n'est enregistré.

    j'espère avoir bien expliqué ce problème qui me semble pourtant simple mais que je n'arrive pas à résoudre.
    Si vous avez une piste je suis preneur. Merci par avance pour votre temps donné.

    je communique une partie du schéma (au cas ou une erreur se serait glissée sans que je l'aperçoive).
    PS : j'ai supprimé volontairement quelques colonnes car les tables sont volumineuse.

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    AdherentProduit:
      connection: doctrine
      tableName: adherent_produit
      actAs:
        Indexable:
          fields: [designation]
        Sluggable:
          unique: true
          fields: [designation]
          canUpdate: false
        Timestampable:
      columns:
        id: { type: integer(4), primary: true, autoincrement: true }
        id_gestcom: { type: integer(11), notnull: true }
        designation: { type: string(255), notnull: true }
        description: { type: string(4000) }
        visuel_produit: { type: string(255) }
        nomenclature_id: { type: integer(4), notnull: true }
        site_id: { type: integer(4), notnull: true }
        adherent_fournisseur_id: { type: integer(4), notnull: true }
        is_published: { type: boolean, notnull: true, default: 1 }
      relations:
        Nomenclature:
          local: nomenclature_id
          foreign: id
          foreignAlias: AdherentProduits
        AdherentFournisseur:
          local: adherent_fournisseur_id
          foreign: id
          foreignAlias: AdherentProduits
        Site:
          local: site_id
          foreign: id
          foreignAlias: AdherentProduits
      indexes:
        id_gestcom_index:
          fields:
            id_gestcom:
              sorting: ASC
            site_id: []
          type: unique
        id_slug_site_index:
          fields:
            slug: []
            site_id: []
          type: unique
     
    MassificationArticle:
      connection: doctrine
      tableName: massification_article
      actAs:
        Timestampable:
      columns:
        id: { type: integer(4), primary: true, autoincrement: true }
        adherent_produit_id: { type: integer(4), notnull:true }
        statut_article_massification_id: { type:integer(4), notnull: true }
        uls_id: { type: integer(4) }
        uvc : { type: varchar(100) }
        quantite_uvc: { type: integer(8) }
        franco: { type: decimal(10), scale: 2, notnull:true }
        type_franco_id: { type:integer(4), notnull:true }
        prix_constate: { type: decimal(10), scale: 2, notnull:true, comment: "Prix unitaire généralement constaté" }
        gencode: { type: varchar(255), notnull: true }
        reference: { type: varchar(255), notnull: true }
        code_catalogue: { type: varchar(255), notnull: true }
        tva: { type: decimal(10), scale: 2 }
      relations:
        AdherentProduit:
          local: adherent_produit_id
          foreign: id
          foreignAlias: MassificationArticle
        StatutArticleMassification:
          local: statut_article_massification_id
          foreign: id
          foreignAlias: MassificationArticle
        Uls:
          local: uls_id
          foreign: id
          foreignAlias: MassificationArticle
        TypeFranco:
          local: type_franco_id
          foreign: id
          foreignAlias: MassificationArticle
     
    TarifFournisseur:
      connection: doctrine
      tableName: tarif_fournisseur
      columns: 
        id: {type:integer(4), primary:true, autoincrement:true}
        massification_article_id: {type:integer(4), notnull:true}
        tarif: { type: decimal(10), scale: 2, notnull:true }
        quantite: { type: integer(8), notnull:true }
        tarif_promo: { type: decimal(10), scale: 2 }
      relations:
        MassificationArticle:
          local: massification_article_id
          foreign: id
          foreignAlias: TarifFournisseur

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Solution !!!
    J'ai fini par trouver.
    Lorsqu'on a un enchaînement de cascade de formulaire, et que l'on surcharge la fonction saveEmbeddedForms, il faut (re)binder les données.
    ce qui nous donne ceci dans le formulaire principal (dans mon cas : formulaire produit):

    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
      public function saveEmbeddedForms($con = null, $forms = null)
      {
        if (null === $con)
          $con = $this->getConnection();
     
        if (null === $forms)
          $forms = $this->getEmbeddedForms();
     
        $massificationArticle = $this->getValue('NewMassificationArticle');
        //on force l'insertion des valeurs pour les formulaires embed
        if(isset($forms['NewMassificationArticle']))
          $forms['NewMassificationArticle']->bind($massificationArticle);
     
        return parent::saveEmbeddedForms($con, $forms);
      }
    on peut alors effectuer un unset des formulaires vide (parmi la collection de formulaire) dans le formulaire embed (dans mon cas : formulaire article)
    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
    public function saveEmbeddedForms($con = null, $forms = null)
      {
        if (null === $con)
          $con = $this->getConnection();
     
        if(is_null($forms))
          $forms = $this->embeddedForms;
     
        //a ce stade l'enregistrement des semaines de livraisons de l'article sera effective
        unset($forms['newMassificationArticleLivraison']);
     
        $massificationArticle = $this->getValues();
        $tarifs = $massificationArticle['newTarifsFournisseur'];
     
        if(isset($forms['newTarifsFournisseur']))
        {
          foreach ($forms['newTarifsFournisseur'] as $index => $form)
          {
            if (!isset($tarifs[$index]))
              unset($forms['newTarifsFournisseur'][$index]);
          }
        }
     
        //a ce stade l'enregistrement des tarifs directs fournisseur sera effective
        unset($forms['newTarifsFournisseur']);
        return parent::saveEmbeddedForms($con, $forms);
      }
    J'espère que cela pourra aider quelqu'un d'autre

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

Discussions similaires

  1. [1.x] Problème de sauvegarde des données avec embed form
    Par Vicrabb dans le forum Symfony
    Réponses: 2
    Dernier message: 24/11/2010, 12h11
  2. [1.x] Valeur par défaut d'un embed form
    Par clamo dans le forum Symfony
    Réponses: 2
    Dernier message: 16/12/2009, 18h11
  3. [1.x] Embed Form Foreign key
    Par saturn1 dans le forum Symfony
    Réponses: 1
    Dernier message: 26/03/2009, 00h05
  4. Hibernate: pb save multiple
    Par breizhde dans le forum Hibernate
    Réponses: 3
    Dernier message: 06/03/2006, 14h49
  5. [Excel] Problème d'impression multiple et de form
    Par Istrella dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 05/01/2006, 15h28

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