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 :

Ajout d'un mergePostValidator sur des forms imbriqué pour eviter les enregistrements vides


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut Ajout d'un mergePostValidator sur des forms imbriqué pour eviter les enregistrements vides
    Bonjour, j'ai deux forms imbriqués de type inputfile, je crée des forms pour l'enregistrement de nouveaux fichier via embedForm.
    Dans le configure de monEmbed1Form.class.php j'ajoute le mergePostValidator ainsi que dans le deuxième.

    Ensuite j'ai créé dans frontend/lib/validator monEmbed1ValidatorSchema.class.php et monEmbed2ValidatorSchema.class.php

    à l'intérieur je suis le tuto de symfony en ajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          if (!$value['nomenclatures'] || empty($value['nomenclatures'])) {
                unset($values[$key]);
          }
    nomenclatures est le nom de mon validatorFile et mon inputFile

    mais j'ai toujours l'erreur suivante en essayant d'enregistrer un form d'edition en ignorant mes embedForms
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nomenclatures' cannot be null
    merci pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    bonjour,
    personne n'a jamais fait ce tuto en utilisant des mergePostValidator ?
    car je n'ai toujours pas résolu mon probléme

  3. #3
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Je sais qui va le faire.... regarde dans ton miroir.

    Aucune idée j'ai pas trop joué avec cette partie du framework, mais je suis tombé sur le plugin : sfWidgetFormInputSWFUploadPlugin

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    j'essaie j'essaie, mais bon,
    j'ai essayé de surchargé saveEmbeddedForms

    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
    public function saveEmbeddedForms($con = null, $forms = null)
    {
      if (null === $forms)
      {
        $liens = $this->getValue('nomenclature');
        $forms = $this->embeddedForms;
        foreach ($this->embeddedForms['nomenclature'] as $key => $form)
        {
          if (!isset($liens[$key]))
          {
            unset($forms['nomenclature'][$key]);
          }
        }
      }
     
      return parent::saveEmbeddedForms($con, $forms);
    }
    mais ça ne marche toujours pas

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Salut,

    Est-ce que tu pourrais poster le code des classes dont tu parles pour regarder de plus prêt ?

    Relis bien le tutoriel dont tu parles, normalement il fonctionne, du moins pour moi il a marché.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    voila
    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
    class BillsofmaterialValidatorSchema extends sfValidatorSchema
    {
      protected function configure($options = array(), $messages = array())
      {
        $this->addMessage('nomenclature', 'The Bom is required.');
      }
     
      protected function doClean($values)
      {
        $errorSchema = new sfValidatorErrorSchema($this);
     
        foreach($values as $key => $value)
        {
          $errorSchemaLocal = new sfValidatorErrorSchema($this);
     
          if (!$value['nomenclature'] || empty($value['nomenclature'])) {
                unset($values[$key]);
          }
     
          // some error for this embedded-form
          if (count($errorSchemaLocal))
          {
            $errorSchema->addError($errorSchemaLocal, (string) $key);
          }
        }
     
        // throws the error for the main form
        if (count($errorSchema))
        {
          throw new sfValidatorErrorSchema($this, $errorSchema);
        }
     
        return $values;
      }
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    si je met une valeur dans mon inputFile j'ai cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Cannot use object of type sfValidatedFile as array in E:\wamp\www\SmartioSI\apps\frontend\lib\validator\BillsofmaterialValidatorSchema.class.php  on line 21
    si je le laisse vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nomenclatures' cannot be null

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    en faite ça bloque sur le !$value['nomenclature'] dans le postvalidator
    ça me provoque l'erreur Cannot use object of type sfValidatedFile as array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if (!$value['nomenclature'])
          {
            unset($values[$key]);
          }
    pourquoi??? sur le tuto de symfony ils utilisent aussi un inputFile

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    J'ai du mal à saisir ce que tu fais. Dans ton saveEmbeddedForms tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->getValue('nomenclature');
    Sachant que nomenclature devrait correspondre à ton formulaire imbriqué, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedForm('nomenclature', $form);
    Dans ton BillsofmaterialValidatorSchema tu cherches à vérifier les champs nomemclature, qui n'existent pas je pense. Ca ne peut pas fonctionner. Relis bien le tutoriel, tu as du te mélanger un peu, tu devrais trouver la solution je pense

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    dans mon form general productForm.class.php je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->embedForm('newNomenclature', $form);
    pour ajouter une nouvelle nomenclature en formulaire imbriqué,
    ensuite dans nomenclatureForm.class.php je fait
    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
    unset($this->validatorSchema['products_list']);
        unset($this->widgetSchema['products_list']);
     
        $this->setWidgets(array(
          'id'                   => new sfWidgetFormInputHidden(),
          'nomenclature' => new sfWidgetFormInputFile(),
        ));
        $this->widgetSchema->setLabels(array(
          'nomenclature' => 'File',
        ));
     
        $this->setValidators(array(
          'id'                   => new sfValidatorDoctrineChoice(array('model' => $this->getModelName(), 'column' => 'id', 'required' => false)),
          'nomenclature' => new sfValidatorFile(array(
                                    'path' => sfConfig::get('sf_upload_dir').'/manufacturing_files',
                                    'required' => false
                              ))
                                ));
    et j'appelle ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->mergePostValidator(new NomenclatureValidatorSchema());
    et dans mon NomenclatureValidatorSchema.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
    protected function doClean($values)
      {
        $errorSchema = new sfValidatorErrorSchema($this);
     
        foreach($values as $key => $value)
        {
          $errorSchemaLocal = new sfValidatorErrorSchema($this);
     
          if (!$value['nomenclature'] ) {
                unset($values[$key]);
          }
     
          // some error for this embedded-form
          if (count($errorSchemaLocal))
          {
            $errorSchema->addError($errorSchemaLocal, (string) $key);
          }
        }
     
        // throws the error for the main form
        if (count($errorSchema))
        {
          throw new sfValidatorErrorSchema($this, $errorSchema);
        }
     
        return $values;
      }

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Et cette méthode devrait être de ce type alors :

    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
    public function saveEmbeddedForms($con = null, $forms = null)
    {
         if (null === $forms)
        {
            $liens = $this->getValue('newNomenclature');
            $forms = $this->embeddedForms;
            foreach ($this->embeddedForms['newNomenclature'] as $key => $form)
            {
                if (!isset($liens[$key]))
              {
                  unset($forms['newNomenclature'][$key]);
              }
          }
      }
     
         return parent::saveEmbeddedForms($con, $forms);
    }
    Et juste aussi un détail, dans un de tes messages d'erreurs tu avais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nomenclatures' cannot be null
    Il est écrit nomenclatures alors que partout ailleurs il n'y a pas de s.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    oui pour le 's' j'avais changé le nom pour tester,

    sinon pour ta methode ça ne change rien non plus,
    mais je ne sais pas si il faut vraiment utiliser saveEmbeddedForms,
    ou juste le mergePostValidator?

    sinon qui à une solution pour exporter le formulaire d'ajout de nouveau fichier?
    par exemple je rajoute un bouton et je fait appelle a un nouveau formulaire avec juste les input d'ajout et non d'édition ?

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    J'ai aussi suivi le toto de symfony pour ignorer les champs vides des forms imbriqués et ça me génère aucune erreur, par contre ça ne marche pas car j'ai toujours mes champs vides stockés dans la base de données, est ce que vous avez une idée pourquoi ??

    merci à tous

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    tu as ajouté un PostValidator et un saveEmbeddedForms?
    tu utilise un inputFile?

    moi je n'ai pas d'erreur si je n'utilise pas le PostValidator car sinon ça me dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Cannot use object of type sfValidatedFile as array in E:\wamp\www\SmartioSI\apps\frontend\lib\validator\BillsofmaterialValidatorSchema.class.php  on line 21
    mais j'ai toujours les enregistrements vide en bdd

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    C’est bon pour moi ça marche, en fait je n’avais pas bien surchargé ma méthode saveEmbeddedForms(). Et j’utilise aussi un PostValidator, par contre je n’utilise pas des inputfiles, pour moi ce n’est que des inputext, je suis navré de ne pas pouvoir t’aider !!

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    tu as mit quoi dans ton saveEmbeddedForms?

    tu as un ou plusieur embedForm de nouvelle enregistrement?

  17. #17
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    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 === $forms)
        {
          $macs = $this->getValue('newMacs');
          $macs = $this->embeddedForms;
          foreach ($this->embeddedForms['newMacs'] as $name => $form)
          {
            if (!isset($macs[$name]))
            {
              unset($forms['newMacs'][$name]);
            }
          }
        }
     
        return parent::saveEmbeddedForms($con, $forms);
      }

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    j'ai pratiquement le même, il faut obligatoirement mettre un postvalidator?
    tu a quoi dans ton ValidatorSchema.php?

    et tu apelle ou le mergePostValidator?

    merci

  19. #19
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    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
     
    class NetifValidatorSchema extends sfValidatorSchema
    {
      protected function configure($options = array(), $messages = array())
      {
        $this->addMessage('mac', 'it is required.');
      }
     
      protected function doClean($values)
      {
        $errorSchema = new sfValidatorErrorSchema($this);
     
        foreach($values as $key => $value)
        {
          $errorSchemaLocal = new sfValidatorErrorSchema($this);
     
     
          if (!$value['mac'])
          {
            unset($values[$key]);
          }
     
          if (count($errorSchemaLocal))
          {
            $errorSchema->addError($errorSchemaLocal, (string) $key);
          }
        }
     
        if (count($errorSchema))
        {
          throw new sfValidatorErrorSchema($this, $errorSchema);
        }
     
        return $values;
      }
    }
    J'ai suivi exactement ce tuto.
    j'ai appelé le mergePostValidator dans mon sous formulaire

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Points : 101
    Points
    101
    Par défaut
    je l'ai suivi egalement,
    a part cette partie
    car je n'ai qu'un seul embedForm,
    tu pense que ça peut venir de la?

Discussions similaires

  1. Réponses: 23
    Dernier message: 04/05/2015, 17h48
  2. Ajout dynamique de label sur un form
    Par katoyi dans le forum VB.NET
    Réponses: 3
    Dernier message: 29/05/2008, 15h58
  3. ajouter l icone reduire sur le forms
    Par tomy7 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/03/2008, 17h10
  4. ajout d'un pagecontrol sur une form existante
    Par Mihalis dans le forum Delphi
    Réponses: 5
    Dernier message: 06/06/2007, 10h43
  5. [MySQL] Php / Html Mettres des Variables PHP en Values sur des form
    Par Jimmy_S dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/03/2006, 12h18

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