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 :

champs Invalid dans formulaire


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut champs Invalid dans formulaire
    Bonjour,

    J'ai un souci avec la validation d'un formulaire dans symfony, il s'agit d'un formulaire dans un module que j'ai créé pour la gestion des livraisons de produits faisant parties de Packages:
    Voici une partie de mon schema.yml de la table concernée:

    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
     
    LivraisonPackageArticle
    connection: doctrine
      tableName: articlepackage
      columns:
        article_id:  
    	  type: integer
    	  notnull: true
    	  primary: true 
        package_id:  
    	  type: integer
    	  notnull: true
    	  primary: true 
    	quantite:
    	  type: integer
    	..................
      relations:	  
        Article: { onDelete: RESTRICT, local: article_id, foreign: id}
        Package:   { onDelete: RESTRICT, local: package_id, foreign: id}
    Afin d'éviter d'avoir dans le formulaire des Id pour les articles et les packages, j'ai rajouté une méthode __toString() dans les classes "Article" et "Package" afin de récupérer le nom à la place.
    et grâce à ça j'ai des listes déroulantes pour article et package dans le formulaire.
    mais quand je crée une nouvelle livraison et je fais save, j'ai l'erreur "Invalid" devant les champs de noms d'Article et package .

    A votre avis, ça vient de quoi ce problème: de la méthode __toString(), des validateurs...? je cherche mais je trouve pas encore

  2. #2
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Je pense pas que ça ne vient pas de la méthode __toString(), je viens de tester en la supprimant et j'ai toujours "Invalid"..
    voici la partie du code générée par symfony dans le controller qui est sensé traiter le formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $article_package = $form->save();
    ...
        }
      }

  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
    Je pencherais pour un problème lié au schéma (disons dans les 30% de probabilités).

    Essaye avec un schéma modifié ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    LivraisonPackageArticle
      connection: doctrine
        tableName: articlepackage
      columns:
        article_id:  integer
       package_id: integer
      quantite: integer
    	..................
      relations:	  
        Article: 
          foreignAlias: LivraisonPackageArticles
        Package:
          foreignAlias: LivraisonPackageArticles
    Dans tous les cas, et sauf en cas d'une table pivot, la clef primaire double n'est pas correctement gérée par symfony.
    Dans le cadre d'une table de liaison pour une liaison n-n, c'est ce que l'on fait généralement, mais avec des arguments sur la liaison, c'est beaucoup plus discutable, tout dépend e ce qui se cache derrière les ..... et dans le reste du schema.

    Il est possible de rajouter un index unique sur les deux clefs pour s'assurer de l'unicité de la relation, mais je pense qu'ici on doit pouvoir envisager plusieurs lignes avec des quantités différentes.

    Attention à ne pas avoir de relations réciproques que Package et Article.

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    Dans le cadre d'une table de liaison pour une liaison n-n, c'est ce que l'on fait généralement, mais avec des arguments sur la liaison, c'est beaucoup plus discutable, tout dépend e ce qui se cache derrière les ..... et dans le reste du schema.
    il s'agit d'une table de liaison n-n qui contient 2 clés étrangères (articleId) et (packageId) et qui contient en plus:
    - 'nbr_pieces'
    - 'quantite_par_piece'
    - 'unite'

    Attention à ne pas avoir de relations réciproques que Package et Article.
    j'ai pas du tout de relations réciproques dans Package et Article.

    Il est possible de rajouter un index unique sur les deux clefs pour s'assurer de l'unicité de la relation, mais je pense qu'ici on doit pouvoir envisager plusieurs lignes avec des quantités différentes.
    oui j'ai plusieurs lignes avec des quantités de produits différentes à chaque fois.

    Si je mets à jour le schema.yml, cela ne risque pas d'écraser toutes classes et mes fichiers Form...j'ai fait qq modifications et j'ai pas envie de les perdre.

  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
    oui j'ai plusieurs lignes avec des quantités de produits différentes à chaque fois.
    Avec le schéma que tu m'as montré, ce n'est pas possible. Donc le schéma n'est pas le bon et il faut l'optimiser.

    Tu as donc trois tables avec deux relations 1-n et non pas deux tables avec une relations n-n avec des arguments qui en génère une troisième (table) pour la liaison.

    Il faut que la table "LivraisonPackageArticle" bénéficie de son propre Id.

    Quant tu régénères, tu effaces tous ce qui se trouve dans lib/modeles/doctrine/base, lib/form/doctrine/base et lib/filter/doctrine/base. Si tu y a fait des modifications (ce qui est plus que fortement décommandé) il faudra les reporter sur les fichiers dans doctrine/ de chacun des trois.

    Attention, toutes les données de la base régénérée sont perdues. En principe elles proviennent d'un "fixature" donc pas de problème.

    Si tu as bien pris tes précautions il n'y a aucun inconvénient à régénérer. Pense à faire un cc après. Je régénère très souvent dans mes projets.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    334
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 334
    Par défaut
    oui j'ai plusieurs lignes avec des quantités de produits différentes à chaque fois.
    Avec le schéma que tu m'as montré, ce n'est pas possible. Donc le schéma n'est pas le bon et il faut l'optimiser.
    En fait je ne sais pas si on parle de la même chose:
    selon mon schema, j'obtiens une table "LivraisonPackageArticle" où chaque ligne se présente comme ça:
    packageId, articleId, nbr_pieces, quantite_par_piece, unite
    sachant que j'obtiens plusieurs lignes pour un même packageId, puisqu'il contient différentes quantités de 1,n articles.
    on l'a discuté aussi dans :
    http://www.developpez.net/forums/d10...alculer-somme/

    Tu as donc trois tables avec deux relations 1-n et non pas deux tables avec une relations n-n avec des arguments qui en génère une troisième (table) pour la liaison.
    oui j'ai bien 3 tables avec 2 relations 1,n et j'ai pas d'id spécifique à la table "LivraisonPackageArticle", ça serait quoi l'intérêt d'en avoir un?

    tu penses que cette conception n'est pas la bonne?

Discussions similaires

  1. Champs obligatoires dans formulaire
    Par obehin dans le forum Langage
    Réponses: 6
    Dernier message: 15/04/2012, 10h13
  2. [2.x] Formulaires et champs invalides dans la webdebugtoolbar
    Par jekif dans le forum Symfony
    Réponses: 0
    Dernier message: 30/03/2012, 10h26
  3. Réponses: 6
    Dernier message: 21/09/2007, 23h44
  4. Champ calculé dans formulaire avec conditions
    Par applefield dans le forum IHM
    Réponses: 4
    Dernier message: 30/08/2007, 16h59
  5. Réponses: 5
    Dernier message: 31/03/2007, 22h36

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