Partage
  • Partager sur Facebook
  • Partager sur Twitter

SYMFONY probleme de validation d'un FileType ?

Souci de validation d'un FileType en édition.

Sujet résolu
    19 septembre 2019 à 10:39:16

    Bonjour à tous,

    J'ai réalisé un formulaire de création, tout se passe nickel, mais au sujet du formulaire d'édition, j'ai un champ FileType qui me pose souci avec une erreur de validation au moment de la soumission.

    Problème N° 1, le champs picture est vide au moment de édition alors que les autres sont renseignés.

    Problème n°2, Je souhaite modifier avant qu'elle ne soit soumise mais je ne trouve pas la procédure.

    Il y a peut-être d'autres solution pour résoudre le souci.

    Voici l'erreur au moment de la validation :

    Expected argument of type "string", "NULL" given at property path "picture".

    Et le code php est ci-dessous.

    Merci d'avance pour vos retours.

    >> articleEditForm

    classArticleEditTypeextendsAbstractType
    {
    publicfunctionbuildForm(FormBuilderInterface$builder, array$options)
    {
    $builder
    ->add('title')
    ->add('published')
    ->add('content', FroalaEditorType::class)
    ->add('picture', FileType::class, ['data_class' => null, 'required' => false])
    ->add('slug')
    ->add('category', EntityType::class, [
    'class' => Category::class,
    'choice_label' => function ($category) {
    return$category->getTitle();
    }
    ])
    ->add('save', SubmitType::class, ['label' => 'Valider']);
    }
    
    publicfunctionconfigureOptions(OptionsResolver$resolver)
    {
    $resolver->setDefaults([
    'data_class' => Article::class,
    ]);
    }
    }

    >> fonction edit :

    /**
    * Edit article
    *
    * @Route("admin/{id}/editarticle", name="admin_edit_article")
    *
    * @paramArticle $article
    * @paramRequest $request
    * @returnResponse
    */
    publicfunctionedit(Article$article, Request$request, ObjectManager$manager, FileUploader$fileUploader)
    {
    $article->setModificationDate(new\DateTime());
    $form = $this->createForm(ArticleEditType::class, $article);
    $form->handleRequest($request);
    $holdPathPicture = ($article->getPicture());
    if ($form->isSubmitted() && $form->isValid()) {
    
    $picture = $form['picture']->getData();
    
    if ($picture === null) {
    $article->setPicture($holdPathPicture);
    } else {
    $pictureFileName = $fileUploader->upload($picture);
    $article->setPicture($pictureFileName);
    }
    $manager->flush();
    
    $this->addFlash(
    'success',
    "Les informations sur la catégories ont été modifiées"
    );
    
    return$this->redirectToRoute('show_all_articles');
    }
    
    return$this->render('admin/article/edit.html.twig', [
    'body_class' => "user-edit content-center",
    'user' => $article,
    'form' => $form->createView()
    ]);
    }

    -
    Edité par LaurentLeplat 19 septembre 2019 à 10:41:28

    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2019 à 12:15:09

      Salut,

      pas de ligne ni de nom de fichier dans le message d'erreur => bonne chance ;)

      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2019 à 12:41:36

        Merci à vous,

        L'erreur se passe au moment de la validation du formulaire, il reçoit une valeur "null" pour la picture, je dois donc trouver un moyen pour que si la requête renvoie un 'null' car le champ est vide par la valeur actuel du champs renseigné lors de la création de l'article au départ.

        Le problème ne se pose pas si on change l'image.

        • Partager sur Facebook
        • Partager sur Twitter
          19 septembre 2019 à 13:00:17

          Salut

          Essaye d'enlever ton getData() sur ton champ $form['picture'] lorsque tu créées ta variable $picture. En théorie tu n'auras plus de message d'erreur car tu essayes de récuperer des datas sur quelque chose de null à la base. 

          et tu peux faire 

          if(is_null($picture)){
              //ton code
          }

          ^^

          -
          Edité par Ryukotsei 19 septembre 2019 à 13:03:29

          • Partager sur Facebook
          • Partager sur Twitter
            19 septembre 2019 à 15:08:25

            Merci pour ta réponse, mais l'erreur est toujours présente, le problème se passe au moment de la soumission, donc, ce qui est dans la condition  $form->isSubmitted() && $form->isValid() n'est pas appliqué
            • Partager sur Facebook
            • Partager sur Twitter
              19 septembre 2019 à 15:20:43

              Pourquoi fais tu ceci:

              <?php
              $holdPathPicture = ($article->getPicture());

              avant le test du form pour ensuite le réinjecter dans l'enité même s'il est null ??

              <?php
              if ($picture === null) {
              $article->setPicture($holdPathPicture);
              } else {
              $pictureFileName = $fileUploader->upload($picture);
              $article->setPicture($pictureFileName);
              }


              Essaie de commenter la ligne pour voir car de tête l'action $form->handleRequest($request) sert justement à renseigner l'entité avec les champs du formulaire

              • Partager sur Facebook
              • Partager sur Twitter
                19 septembre 2019 à 15:21:28

                Bonjour,
                regarde dans ton entité si picture n'a pas comme annotation nullable=false et si ton setPicture accepte bien la valeur null.

                -
                Edité par coolswing 19 septembre 2019 à 15:22:20

                • Partager sur Facebook
                • Partager sur Twitter
                  19 septembre 2019 à 15:46:06

                  Merci à vous,

                  J'ai essayé vos conseils mais cela ne donne rien, je ne souhaite pas que la valeur entrée soit null, je souhaite juste que si la valeur du nom de 'picture' n'est pas modifié, celle-ci reste la même. 

                  Cela fonctionne parfaitement avec les autres champs, mais pas avec le FileType !

                  Mon idée était d'injecter le contenu du champs dans la 'request' en cas ou picture est null.

                  Je ne sais pas si cela est possible et si cela est correct.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 septembre 2019 à 16:54:03

                    Bonjour,

                    Il y a d'autres manière de faire comme le 'empty_data' https://symfony.com/doc/current/reference/forms/types/text.html#empty-data

                    Ou mieux : https://openclassrooms.com/fr/courses/3619856-developpez-votre-site-web-avec-le-framework-symfony/3623841-creer-des-formulaires-avec-symfony#/id/r-3777443

                    Une vidéo explicative : https://www.youtube.com/watch?v=vt1f9fGYcpM

                    Sinon essaye de mettre cette ligne avant la validation du formulaire (il faudra faire des vérifications ensuite) : 

                    $article->setPicture($holdPathPicture);



                    -
                    Edité par Jean_40 19 septembre 2019 à 17:00:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 septembre 2019 à 10:14:12

                      Merci à vous,

                      Je vais étudier cela, et je reviens vers vous si nécessaire .

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 septembre 2019 à 14:24:26

                        Merci à vous,

                        En utilisant le modèle ci-dessous, j'ai réussi à résoudre une partie du problème.

                        $builder->add('name', null, [
                            'required'   => false,
                            'empty_data' => 'John Doe',
                        ]);
                        
                        • Partager sur Facebook
                        • Partager sur Twitter

                        SYMFONY probleme de validation d'un FileType ?

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown