Partage
  • Partager sur Facebook
  • Partager sur Twitter

formulaire avec l'insertion sql dans 1 controleur

Sujet résolu
    27 novembre 2020 à 21:42:14

    Dans le profiler, j'ai plein de fichier genref0, f1, f2 et un fichier index.csv dont il y a l'acheminement de notre contrôleur qui pose problème.

    cc4134,::1,GET,http://localhost:8000/enr,1606313302,6c84bd,500
    6c84bd,::1,GET,http://localhost:8000/enr,1606313303,,500
    ea8072,::1,GET,http://localhost:8000/enr,1606313319,786737,500
    786737,::1,GET,http://localhost:8000/enr,1606313319,,500
    009de1,::1,GET,http://localhost:8000/enr,1606313331,3b8e0f,500
    3b8e0f,::1,GET,http://localhost:8000/enr,1606313331,,500
    5d9ea5,::1,GET,http://localhost:8000/enr,1606313545,7d6205,500
    7d6205,::1,GET,http://localhost:8000/enr,1606313545,,500
    44c009,::1,GET,http://localhost:8000/enr,1606313688,00fb22,500
    00fb22,::1,GET,http://localhost:8000/enr,1606313688,,500
    fe4f21,::1,GET,http://localhost:8000/enr,1606314831,dee46d,500
    dee46d,::1,GET,http://localhost:8000/enr,1606314831,,500
    329dd9,::1,GET,http://localhost:8000/enr,1606315424,88ae99,500
    88ae99,::1,GET,http://localhost:8000/enr,1606315424,,500

    La je doit avouer que je n'y comprend rien!

    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2020 à 21:52:19

      Ton projet est sur github ou un truc du genre que je puisse voir ou tester ?
      • Partager sur Facebook
      • Partager sur Twitter
      $2b||!$2b
        28 novembre 2020 à 13:21:17

        Je vient de créer un compte Github, j’espère que le lien du téléchargement fonctionne.

        https://github.com/Fredouze/mon-projet/blob/main/projet.zip

        ou

        https://github.com/Fredouze/projet-1/blob/main/projet.zip

        -
        Edité par Frédouze 28 novembre 2020 à 15:48:15

        • Partager sur Facebook
        • Partager sur Twitter
          28 novembre 2020 à 19:28:10

          Alors le premier lien ne fonctionne pas mais le deuxième c'est ok.

          Par contre tu es sur que c'est un projet symfony ?

          Car la il manque toute la partie pour faire fonctionne symfony la quand meme.

          EDIT: Néanmoins, après avoir regarder ton code et tes fichiers, je me rends compte que le fichier Dto.php est mal nommé car il est très important que le fichier soit nommer à l'identique de ta classe contenue dans ce dit fichier.

          Donc comme ta classe s'appelle ArticlesDto, ton fichier doit absolument s'appeler ArticlesDto.php.

          Une fois corriger, refait un composer dump pour générer l'autoload et test

          -
          Edité par skuti 28 novembre 2020 à 19:39:11

          • Partager sur Facebook
          • Partager sur Twitter
          $2b||!$2b
            28 novembre 2020 à 22:13:40

            Oui, j'ai j'ai voulu télécharger tout le dossier Symfony, mais le dossier était trop gros ont est l'imiter à 25MO! Du coup j'ai sélectionner les dossiers que j'ai modifier, comme la vue, les contrôleur. J'arive donc juste à la limite. Donc j'ai renommer mon fichier Dto par ArticlesDto, et j'ai fait un composer dump-autoload le terminal à répondu

            Generating optimized autoload files
            composer/package-versions-deprecated: Generating version class...
            composer/package-versions-deprecated: ...done generating version class
            Generated optimized autoload files containing 4628 classes


            Mais malheureusement j'ai toujours cette page blanche! Idem pour le code source de la page! J'ai peut-être une fonction qui fait conflit dans mais autre contrôleur?  Mais j’aurai un réponse comme quoi la fonction existe déjà! J'utilise Windows 8 avec visual studio code et Wamp pour la base de donné et le php 7 et je fait php -S localhost:8000 -t public pour activer mon serveur. Voila mon environnement. 

            -
            Edité par Frédouze 28 novembre 2020 à 22:34:28

            • Partager sur Facebook
            • Partager sur Twitter
              28 novembre 2020 à 22:48:53

              Pour pouvoir t'aider j'ai besoin de pouvoir lancer chez moi pour tester.

              Il faut pas que tu commit le dossier vendors/ ni le dossier var/.

              Sans cela ca devrait etre leger

              • Partager sur Facebook
              • Partager sur Twitter
              $2b||!$2b
                29 novembre 2020 à 13:35:56

                Donc voila le lien pour télécharger le projet en entier!

                • Partager sur Facebook
                • Partager sur Twitter
                  29 novembre 2020 à 20:02:06

                  Hello,

                  J'ai corriger le problème. Tu peux télécharger le projet corriger ici.

                  Tu t'étais tromper dans les formulaires. Tu avais remplacer le contenu de ton formulaire au lieux d'en créer un nouveau et de mettre le code que je t'avais donner. Il y a deux formulaires: ArticleType et ArticlesType.

                  Par contre pour faire fonctionner chez moi j'ai modifier le .env et ajouter un htaccess dans le dossier public/ que tu peux supprimer si tu n'en a pas besoin. (test comme ca quand meme au cas où)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  $2b||!$2b
                    29 novembre 2020 à 22:24:56

                    Merci pour ton aide, mon formulaire est apparue.  Il reste plus qu'a mettre mes enregistrements dans une boucles ainsi que champs.

                     Faut que je modifie les twigs car la ligne ci dessous n'apparait pas.

                    <li>
                      {{ form_row(article.title) }}
                      {{ form_row(article.content) }}
                      {{ form_row(article.author) }}
                     </li>

                    Je voudrait essayer de remplacer cette partie par

                    <form action="/enr" method="POST">
                    
                     {% for i in 0..10 %}
                           <div class="form-example">
                        <label for="name">Enter your name: </label>
                        <input type="text" name="name{{ i }}" id="name" >
                      </div>
                    {% endfor %}
                    
                      <div class="form-example">
                        <input type="submit" value="Subscribe!">
                      </div>
                    </form>
                    
                    

                    Afin de faire un enregistrement de chaque dans boucle du Twigs avec le contrôleur.  Ce seras utile pour générer un sondage par exemple.

                    -
                    Edité par Frédouze 29 novembre 2020 à 22:25:35

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 novembre 2020 à 7:34:50

                      Alors il faut que tu laisses le front comme il est.

                      Si rien n'est affiché, c'est que ton objet ArticlesDto ne contient rien.

                      Si tu modifies ArticlesDto pour ajouter ceci:

                      ...
                          public function addArticle(Article $article): self
                          {
                              if (!$this->articles->exists($article)) {
                                  $this->articles->add($article);
                              }
                      
                              return $this;
                          }

                      Et ensuite dans ton Contrôleur tu le modifies comme suit :

                          public function index(Request $request)
                          {
                              $articlesDto = new ArticlesDto();
                              for ($i = 0; $i < 10; $i++) {
                                  $articlesDto->addArticle(new Article());
                              }
                      
                              // Reste du code
                          }

                      Tu devrais voir apparaitre des ligne :)


                      • Partager sur Facebook
                      • Partager sur Twitter
                      $2b||!$2b
                        30 novembre 2020 à 13:23:36

                        Merci encore pour ton aide. J'ai modifier mon contrôleur comme ci dessous 

                        <?php
                         
                        namespace App\Controller;
                         
                        use App\Entity\Article;
                        use Doctrine\Common\Collections\ArrayCollection;
                        use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                        use Symfony\Component\HttpFoundation\Request;
                        use Symfony\Component\Routing\Annotation\Route;
                        use App\Form\Dto\ArticlesDto;
                        use App\Form\ArticlesType;
                        
                        class EnrController extends AbstractController
                        {
                            /**
                             * @Route("/enr", name="enr")
                             */
                            public function index(Request $request)
                            {
                                $articlesDto = new ArticlesDto();
                                for ($i = 0; $i < 10; $i++) {
                                    $articlesDto->addArticle(new Article());
                                }
                                $form->handleRequest($request);
                         
                                if ($form->isSubmitted()) {
                                    if ($form->isValid()) {
                                        $em = $this->getDoctrine()->getManager();
                                        foreach ($articlesDto->getArticles() as $article) {
                                            $em->persist($article);
                                        }
                                        $em->flush();
                                    } else {
                                        $this->addFlash('errors', $form->getErrors(true));
                                    }
                                }
                         
                                return $this->render('enr/enr.html.twig', [
                                    'controller_name' => 'EnrController',
                                    'form' => $form->createView(),
                                ]);
                            }
                        }

                        et mon ArticleDto

                        <?php
                         
                        namespace App\Form\Dto;
                         
                        use Doctrine\Common\Collections\ArrayCollection;
                        use App\Entity\Article;
                         
                        class ArticlesDto
                        {
                            /**
                             * @var ArrayCollection|Article[]
                             */
                            protected $articles;
                        
                        
                            public function addArticle(Article $article): self
                            {
                                if (!$this->articles->exists($article)) {
                                    $this->articles->add($article);
                                }
                         
                                return $this;
                            }
                        
                        
                         
                            public function __construct()
                            {
                                $this->articles = new ArrayCollection();
                            }
                         
                            public function getArticles(): ArrayCollection
                            {
                                return $this->articles;
                            }
                         
                            public function setArticles(ArrayCollection $articles): self
                            {
                                $this->articles = $articles;
                         
                                return $this;
                            }
                        }

                        mais j'ai l'erreurci dessous.

                        Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::exists() must be an instance of Closure, instance of App\Entity\Article given, called in C:\Users\INSPIRON\mon-super-projet\src\Form\Dto\ArticlesDto.php on line 18




                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 novembre 2020 à 15:34:06

                          Pardon je me suis tromper des méthode :

                          <?php
                            
                          namespace App\Form\Dto;
                            
                          use Doctrine\Common\Collections\ArrayCollection;
                          use App\Entity\Article;
                            
                          class ArticlesDto
                          {
                              /**
                               * @var ArrayCollection|Article[]
                               */
                              protected $articles;
                           
                              public function __construct()
                              {
                                  $this->articles = new ArrayCollection();
                              }
                            
                              public function getArticles(): ArrayCollection
                              {
                                  return $this->articles;
                              }
                            
                              public function setArticles(ArrayCollection $articles): self
                              {
                                  $this->articles = $articles;
                            
                                  return $this;
                              }
                          
                              public function addArticle(Article $article): self
                              {
                                  if (!$this->articles->contains($article)) {
                                      $this->articles->add($article);
                                  }
                            
                                  return $this;
                              }
                          }

                          Par contre aucune fonction au dessus du constructeur (par convention)

                          • Partager sur Facebook
                          • Partager sur Twitter
                          $2b||!$2b
                            30 novembre 2020 à 15:49:01

                            Je vient de modifier le ArticlesDto, mais ça fait une erreur au niveau du contrôleur.

                            Notice: Undefined variable: form

                             $form->handleRequest($request);


                            La déclaration du form est souvent capricieuse!

                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 novembre 2020 à 20:19:10

                              C'est pas capricieux. PHP fait ce que tu lui demande. Donc tu as du toucher quelque chose forcément.

                              Remontre moi ton contrôleur et tes deux formulaires et ton ArticleDto stp

                              • Partager sur Facebook
                              • Partager sur Twitter
                              $2b||!$2b
                                1 décembre 2020 à 2:11:31

                                Je disait cela car j'ai eu souvent des problèmes avec la déclaration du form!

                                Voila le contrôleur

                                <?php
                                 
                                namespace App\Controller;
                                 
                                use App\Entity\Article;
                                use Doctrine\Common\Collections\ArrayCollection;
                                use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                                use Symfony\Component\HttpFoundation\Request;
                                use Symfony\Component\Routing\Annotation\Route;
                                use App\Form\Dto\ArticlesDto;
                                use App\Form\ArticlesType;
                                
                                class EnrController extends AbstractController
                                {
                                    /**
                                     * @Route("/enr", name="enr")
                                     */
                                    public function index(Request $request)
                                    {
                                        $articlesDto = new ArticlesDto();
                                        for ($i = 0; $i < 10; $i++) {
                                            $articlesDto->addArticle(new Article());
                                        }
                                        $form->handleRequest($request);
                                 
                                        if ($form->isSubmitted()) {
                                            if ($form->isValid()) {
                                                $em = $this->getDoctrine()->getManager();
                                                foreach ($articlesDto->getArticles() as $article) {
                                                    $em->persist($article);
                                                }
                                                $em->flush();
                                            } else {
                                                $this->addFlash('errors', $form->getErrors(true));
                                            }
                                        }
                                 
                                        return $this->render('enr/enr.html.twig', [
                                            'controller_name' => 'EnrController',
                                            'form' => $form->createView(),
                                        ]);
                                    }
                                }

                                Voila l'AticlesType

                                <?php
                                // src/Form/ArticleType.php
                                namespace App\Form;
                                  
                                use Symfony\Component\Form\AbstractType;
                                use Symfony\Component\Form\Extension\Core\Type\CollectionType;
                                use Symfony\Component\Form\FormBuilderInterface;
                                  
                                class ArticlesType extends AbstractType
                                {
                                    public function buildForm(FormBuilderInterface $builder, array $options)
                                    {
                                        $builder->add('articles', CollectionType::class, [
                                            'entry_type' => ArticleType::class,
                                            'entry_options' => ['label' => false],
                                            'allow_add' => true,
                                        ]);
                                    }   
                                }

                                le deuxième AticleType

                                <?php
                                
                                namespace App\Form;
                                
                                use App\Entity\Article;
                                use Symfony\Component\Form\AbstractType;
                                use Symfony\Component\Form\Extension\Core\Type\HiddenType;
                                use Symfony\Component\Form\Extension\Core\Type\TextareaType;
                                use Symfony\Component\Form\Extension\Core\Type\TextType;
                                use Symfony\Component\Form\FormBuilderInterface;
                                use Symfony\Component\OptionsResolver\OptionsResolver;
                                
                                class ArticleType extends AbstractType
                                {
                                    public function buildForm(FormBuilderInterface $builder, array $options)
                                    {
                                        $builder
                                            ->add('id', HiddenType::class)
                                            ->add('title', TextType::class)
                                            ->add('content', TextareaType::class)
                                            ->add('author', TextType::class)
                                        ;
                                    }
                                
                                    public function configureOptions(OptionsResolver $resolver)
                                    {
                                        $resolver->setDefaults([
                                            'data_class' => Article::class,
                                        ]);
                                    }
                                }
                                

                                Voila l'AtticleDto

                                <?php
                                   
                                namespace App\Form\Dto;
                                   
                                use Doctrine\Common\Collections\ArrayCollection;
                                use App\Entity\Article;
                                   
                                class ArticlesDto
                                {
                                    /**
                                     * @var ArrayCollection|Article[]
                                     */
                                    protected $articles;
                                  
                                    public function __construct()
                                    {
                                        $this->articles = new ArrayCollection();
                                    }
                                   
                                    public function getArticles(): ArrayCollection
                                    {
                                        return $this->articles;
                                    }
                                   
                                    public function setArticles(ArrayCollection $articles): self
                                    {
                                        $this->articles = $articles;
                                   
                                        return $this;
                                    }
                                 
                                    public function addArticle(Article $article): self
                                    {
                                        if (!$this->articles->contains($article)) {
                                            $this->articles->add($article);
                                        }
                                   
                                        return $this;
                                    }
                                }



                                et pour finir la vue

                                {% extends 'base.html.twig' %}
                                  
                                {% block title %}Hello EnrController!{% endblock %}
                                  
                                {% block body %}
                                    <style>
                                        .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; }
                                        .example-wrapper code { background: #F5F5F5; padding: 2px 6px; }
                                    </style>
                                
                                    <div class="example-wrapper">
                                        <h1>Hello {{ controller_name }}! ✅</h1>
                                
                                        {{ form_start(form) }}
                                            <div class="form-example">
                                                <ul class="articles" data-prototype="{{ form_widget(form.articles.vars.prototype)|e('html_attr') }}">
                                                    {% for article in form.articles %}
                                                        <li>
                                                            {{ form_row(article.title) }}
                                                            {{ form_row(article.content) }}
                                                            {{ form_row(article.author) }}
                                                        </li>
                                                    {% endfor %}
                                                </ul>
                                                <button type="button" class="add_item_link" data-collection-holder-class="articles">Add an article</button>
                                            </div>
                                            <div class="form-example">
                                                <input type="submit" value="Subscribe!">
                                            </div>
                                        {{ form_end(form) }}
                                    </div>
                                {% endblock %}
                                
                                {% block javascripts %}
                                    <script type="text/javascript">
                                        $(document).ready(function() {
                                            // Get the ul that holds the collection of tags
                                            var $articlesCollectionHolder = $('ul.articles');
                                            // count the current form inputs we have (e.g. 2), use that as the new
                                            // index when inserting a new item (e.g. 2)
                                            $articlesCollectionHolder.data('index', $articlesCollectionHolder.find('input').length);
                                            $('body').on('click', '.add_item_link', function(e) {
                                                var $collectionHolderClass = $(e.currentTarget).data('collectionHolderClass');
                                                addFormToCollection($collectionHolderClass);
                                            })
                                        });
                                
                                        function addFormToCollection($collectionHolderClass) {
                                            // Get the ul that holds the collection of tags
                                            var $collectionHolder = $('.' + $collectionHolderClass);
                                
                                            // Get the data-prototype explained earlier
                                            var prototype = $collectionHolder.data('prototype');
                                
                                            // get the new index
                                            var index = $collectionHolder.data('index');
                                
                                            var newForm = prototype;
                                            // You need this only if you didn't set 'label' => false in your tags field in TaskType
                                            // Replace '__name__label__' in the prototype's HTML to
                                            // instead be a number based on how many items we have
                                            // newForm = newForm.replace(/__name__label__/g, index);
                                
                                            // Replace '__name__' in the prototype's HTML to
                                            // instead be a number based on how many items we have
                                            newForm = newForm.replace(/__name__/g, index);
                                
                                            // increase the index with one for the next item
                                            $collectionHolder.data('index', index + 1);
                                
                                            // Display the form in the page in an li, before the "Add a tag" link li
                                            var $newFormLi = $('<li></li>').append(newForm);
                                            // Add the new form at the end of the list
                                            $collectionHolder.append($newFormLi)
                                        }
                                    </script>
                                {% endblock %}






                                -
                                Edité par Frédouze 1 décembre 2020 à 2:15:40

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 décembre 2020 à 7:54:05

                                  Non mais quand même xD

                                  Tu as supprimer la ligne qui crée le form!

                                  $form = $this->createForm(ArticleType::class, $articlesDto);

                                  Forcément il ne le connait plus après xD

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  $2b||!$2b
                                    1 décembre 2020 à 12:59:56

                                    J'ai glisser chef! J'ai enlever effectivement la ligne de création du formulaire. Il est apparue mais je n'ai toujours pas mes champs.

                                    public function index(Request $request)
                                        {
                                            $articlesDto = new ArticlesDto();
                                            $form = $this->createForm(ArticlesType::class, $articlesDto);
                                            for ($i = 0; $i < 10; $i++) {
                                                $articlesDto->addArticle(new Article());
                                            }
                                     //suite du code
                                        }

                                    J'ai modifier la fonction ArticleType par ArticlesType car il y avait une erreur car la fonction était introuvable.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 décembre 2020 à 13:12:17

                                      Le createForm tu dois le mettre après la boucle FOR. Car il a besoin de ArticleDto déjà modifier pour créer les champs:

                                      <?php
                                        
                                      namespace App\Controller;
                                        
                                      use App\Entity\Article;
                                      use Doctrine\Common\Collections\ArrayCollection;
                                      use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                                      use Symfony\Component\HttpFoundation\Request;
                                      use Symfony\Component\Routing\Annotation\Route;
                                      use App\Form\Dto\ArticlesDto;
                                      use App\Form\ArticlesType;
                                       
                                      class EnrController extends AbstractController
                                      {
                                          /**
                                           * @Route("/enr", name="enr")
                                           */
                                          public function index(Request $request)
                                          {
                                              $articlesDto = new ArticlesDto();
                                              for ($i = 0; $i < 10; $i++) {
                                                  $articlesDto->addArticle(new Article());
                                              }
                                              $form = $this->createForm(ArticleType::class, $articlesDto);
                                              $form->handleRequest($request);
                                        
                                              if ($form->isSubmitted()) {
                                                  if ($form->isValid()) {
                                                      $em = $this->getDoctrine()->getManager();
                                                      foreach ($articlesDto->getArticles() as $article) {
                                                          $em->persist($article);
                                                      }
                                                      $em->flush();
                                                  } else {
                                                      $this->addFlash('errors', $form->getErrors(true));
                                                  }
                                              }
                                        
                                              return $this->render('enr/enr.html.twig', [
                                                  'controller_name' => 'EnrController',
                                                  'form' => $form->createView(),
                                              ]);
                                          }
                                      }



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      $2b||!$2b
                                        1 décembre 2020 à 15:14:45

                                        Merci de l'aide! j'ai obtenue le formulaire. Mais j'ai  un souci avec l'enregistrement. C'est pour ça qu'au début, je voulait faire l'enregistrement directement avec une Commande SQL dans le for du contrôleur. Avec incrémentation de variable get récupérer avec le request. Exemple 

                                        $name="articles[articles][$i][author]" et je fait la recette sql dans la boucle.

                                        En attendant j'ai cette erreur suite à l'enregistrement

                                        Serialization of 'Closure' is not allowed



                                        la ligne qui pose probléme

                                        mon-super-projet\vendor\symfony\http-foundation\Session\Storage\NativeSessionStorage.php (line 268) 



                                        et la fonction souligner

                                        session_write_close();

                                        Voici la capture d’écran du formulaire qui s'affiche correctement.

                                        -
                                        Edité par Frédouze 1 décembre 2020 à 15:15:10

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          1 décembre 2020 à 19:59:41

                                          Alors oublie les requêtes native SQL dans Symfony.

                                          Il est très bien fait et sauf cas exceptionnel, tu ne t'en serviras plus.

                                          Normalement tu as un toolbar en bas de ton site qui quand tu l'ouvres dans un nouvelle onglet, te donnes plein d'indication sur ce qui c'est passé.

                                          La l'erreur que tu me sors n'a rien à voir (à première vue) avec ce que tu as fait.

                                          De plus, j'avais tester l'enregistrement chez moi et tout à fonctionner sans problème.

                                          Donc l'erreur doit venir d'ailleurs.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          $2b||!$2b
                                            1 décembre 2020 à 23:25:44

                                            Eureka ça fonctionne ! J'ai réduit la boucle à 5 enregistrements et ça prend en compte l'enregistrement! Aucune erreur cette fois ci! Merci beaucoup de ton aide!

                                            -
                                            Edité par Frédouze 1 décembre 2020 à 23:48:00

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              2 décembre 2020 à 8:27:27

                                              Cool !

                                              Mets ton sujet en résolu du coup :)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              $2b||!$2b

                                              formulaire avec l'insertion sql dans 1 controleur

                                              × 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