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 :

Formulaire i18n: échec de la validation et de création de l'objet


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut Formulaire i18n: échec de la validation et de création de l'objet
    Bonjour, j'ai un formulaire internationalisé d'après ce tuto, notamment dans sa partie "Comment passer la Culture de l'Utilisateur à un Formulaire ?". L'objectif c'est de ne proposer que les champs dans la langue de l'utilisateur. Tout d'abord, une partie de mon schema:
    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
    entreprise:
      actAs:
        Timestampable: ~
        I18n:
          fields: [activite, description, is_validated]
      columns:
        nom:
          type:       string(255)
        activite:
          type:       string(255)
        description:
          type:       clob
        capital:
          type:       string(255)
        is_validated:
          type:       boolean
          default:    false
    J'ai mis les codes de validation des champs "i18nisés" dans entrepriseTranslationForm.class.php et ceux des autres champs dans entrepriseForm.class.php. Mais quand je soumets le formulaires, il retourne le message d'erreur "required" pour les champs mise en required => true même si ceux-ci ont été bien remplis, avec un warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in C:\wamp\www\entrepreneur\lib\vendor\symfony\lib\util\sfParameterHolder.class.php on line 53
    Et quand je passe ces champs à required => false, l'objet n'est pas créé pour autant et le warning persiste et signe. Un autre message d'erreur qui persiste et signe dans les deux cas est celui que je découvre en cliquant le lien View de la debug toobar de symfony et qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $form['_csrf_token'] (sfWidgetFormInputHidden)
    Required.
    Auriez quelques astuces pour réussir la validation de mon formulaire et la création de l'objet dans la langue de l'utilisateur ? Merci

  2. #2
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    J'ai trouvé la cause de l'erreur. J'avais omis de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->setNameFormat('entreprise[%s]');
    100 coups de baton dans les mains, je mérite bien.
    Par contre je suis aux prises avec une autre difficulté. En réalité le schéma que j'ai fourni ci-dessus n'était pas complet. Ma table entreprise est en relation n:n avec la table opération. Schéma complet:
    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
    entreprise:
      actAs:
        Timestampable: ~
        I18n:
          fields: [activite, description, is_validated]
      columns:
        nom:
          type:       string(255)
        activite:
          type:       string(255)
        image:
          type:       string(255)
        description:
          type:       clob
        capital:
          type:       string(255)
        is_validated:
          type:       boolean
          default:    false
      relations:
        operation:
          class: operation
          refClass: entrepriseoperation
          foreignAlias: entreprise
    entrepriseoperation:
      columns:
        entreprise_id:
          type: integer
          primary: true
        operation_id:
          type: integer
          primary: true
      relations:
        entreprise:
          foreignAlias: entrepriseoperation
          onDelete: cascade
        operation:
          foreignAlias: entrepriseoperation
          onDelete: cascade
     
    operation:
      actAs:
        I18n:
          fields:     [nom]
          actAs:
            Sluggable:
              fields:     [nom] 
              uniqueBy:   [lang, nom]
      columns:
        nom:
          type:       string(255)
    Dans mon entrepriseActions, j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function executeNew(sfWebRequest $request)
      {
        $this->culture = $this->getUser()->getCulture();
     
    	$this->op = Doctrine_Core::getTable('operation')->findBySlug($request->getParameter('slug'));
    	$this->forward404Unless($this->op);
     
    	$newEnt = new entreprise();
    	$newEnt->setOperation($this->op);
     
    	$this->form = new entrepriseForm($newEnt, array('culture' => $this->getUser()->getCulture()));
      }
    puis dans le configure de entrepriseForm, je passe le champ operation_list en hidden:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'operation_list'             => new sfWidgetFormInputHidden(),
    Ca marchait bien avant l'embed de la form i18n, mais depuis son intégration, ca ne marche plus. Mais quand je refais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'operation_list'             => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'operation')),
    , ca marche bien. Or moi je veux absolument passer le operation_list en hidden. Une astuce, svp ? Merci

  3. #3
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Pourrais-tu être plus précis dans ce qui ne fonctionne plus ?

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    Ca renvoi une erreur Invalid sur operation_list. Dans le code source de la page, l'attribut value du champ entreprise[operation_list] contient "Array" au lieu de la valeur des opérations choisies.

  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
    Tu as quoi dans ton html généré ?

    A priori, je dirais qu'il te retourne un array parce que tu lui envoies un array !

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    Welcome back toi, tu nous as manqué hein. Pour te répondre, voici le html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="entreprise[operation_list]" value="Array" id="entreprise_operation_list" />
    Quelqu'un sur un autre forum m'a conseillé de ne pas mettre operation_list en hidden et de faire un display:non dessus en css. Je me demande si cette méthode est propre et pro

  7. #7
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    [QUOTE]Quelqu'un sur un autre forum m'a conseillé de ne pas mettre operation_list en hidden et de faire un display:non dessus en css. Je me demande si cette méthode est propre et pro[QUOTE]

    Non pas du tout propre et pro.

    Çane viendrais pas de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Doctrine_Core::getTable('operation')->findBySlug($request->getParameter('slug'));
    Car par défaut ça retourne un tableau d'objet.

Discussions similaires

  1. Copier value input dans formulaire et l'afficher sans valider
    Par ponpon17430 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/12/2008, 14h03
  2. Formulaire en plusieurs parties, avec validation
    Par Flackou dans le forum Ruby on Rails
    Réponses: 15
    Dernier message: 20/05/2008, 16h32
  3. Vider les champs d'un formulaire une fois ce dernier validé
    Par Silveur dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/03/2007, 08h58
  4. Réponses: 8
    Dernier message: 20/07/2006, 12h30
  5. [FLASH MX2004] Formulaire et le bouton de validation
    Par liam81150 dans le forum Flash
    Réponses: 2
    Dernier message: 22/07/2005, 10h38

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