Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4] Placer barre de recherche dans la nav

Sujet résolu
    17 septembre 2019 à 0:14:19

    Bonsoir, j'ai récemment réussi à faire un moteur de recherche sur symfony avec l'aide d'une personne très patiente ici même, et j'aimerai intégrer cette barre de recherche dans la nav du site afin que les utilisateurs puissent effectuer une recherche depuis n'importe quelle page du site (je sais pas si c'est clair^^) en gros depuis n'importe quelle page, je souhaite que lorsqu'on clique sur l'icône de la loupe de la navbar, qu'une barre de recherche descende du menu, pour que l'itilisateur puisse entrer sa recherche, et après validation, le site redirige automatiquement vers la page des résultats(chose déjà fonctionnelle).

    Voici mon controller :

    <?php
    
    namespace App\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\Routing\Annotation\Route;
    use App\Entity\Vehicule;
    // use App\Model\Search;
    // use Symfony\Component\BrowserKit\Request;
    // use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use App\Repository\VehiculeRepository;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Form\Extension\Core\Type\SearchType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Doctrine\ORM\EntityManager;
    
    // use Doctrine\Common\Persistence\ObjectManager;
    
    
    class HomeController extends AbstractController 
    {
        /**
         * @Route ("/", name="home")
         */
    
    
        public function index () {
            return $this->render('pages/home.html.twig');
        }
    
       
    
    /**
         * @Route ("/Search", name="Search", methods={"GET","POST"})
         */
          
        public function search(Request $request)
        {
            $form = $this->createFormBuilder()->add('recherche', SearchType::class)->getForm();
                 
            $form->handleRequest($request);
            if ($form->isSubmitted() && $form->isValid()) {
                $data = $form->getData();
                $em = $this->container->get('doctrine')->getManager();
                $vehicules = $em->getRepository('App\Entity\Vehicule')->search($data['recherche']);
                return $this->render('pages/Searchresult.html.twig', [
                    'vehicules' => $vehicules
                ]);
            }
              
            return $this->render('pages/Search.html.twig', [
                'form' => $form->createView()
            ]);
      
             
        }
       
    }


    Voici mon base.html.twig :

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js"></script>
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %} <link rel="stylesheet" href="style.css"> {% endblock %}
        
    </head>
    
    <body>
            <nav>
                <div class="un">
                    <li> <a href="{{ path('home')}}">ACCUEIL</a> </li>
        
                    <ul>
                        <li> <a href="#">NOS VEHICULES
                                <ul>
                                    <li> <a href="{{ path('AlfaRomeo')}}"> ALFA ROMEO </a> </li>
                                    <li> <a href="{{ path('Abarth')}}">FIAT ABARTH </a> </li>
                                    <li> <a href="{{ path('Porsche')}}">PORSCHE </a> </li>
                                    <li> <a href="{{ path('Fiat')}}">FIAT </a> </li>
                                </ul>
        
                            </a>
                        </li>
                    </ul>
        
        
                    <li> <a href="{{ path('service')}}">NOS SERVICES</a> </li>
                </div>
                <div class="logo">
        
                    <a href="{{ path('home')}}"><img src="img/logo.png"></a>
                </div>
                <div class="un">
                    <li> <a href="{{ path('garantie')}}">NOS GARANTIES</a> </li>
                    <li> <a href="{{ path('contact')}}">CONTACT</a> </li>
                    <li> <a href="{{ path('Search')}}"><i class="fas fa-search"></i></a> </li>
                </div>
            </nav>
    
    <!-- Menu burger -->
    ...
    
        
    
        {% block body %}
        
        {% endblock %}
    
        {% block javascripts %}
    
            <script type="text/javascript" src="js/effet1.js"></script>
            
            <script>
         ...
        </script>
    
        {% endblock %}
    
    
    </body>
    
    </html>

    Le formulaire qui récupère le controller se trouve sur une page nommée :

    Search.html.twig

    Et les résultats s'affichent sur la page :

    Searchresult.html.twig



    -
    Edité par EvilSpartans 17 septembre 2019 à 0:15:27

    • Partager sur Facebook
    • Partager sur Twitter
      17 septembre 2019 à 7:52:32

      Bonjour,

      Il me semble que la solution n'est pas (ou peu) côté php mais html, css voire javascript.

      Utilises-tu bootstrap et Font Awesome ?

      Je reformule :

      Dans la <nav> du site, tu intègres une icone ou image de loupe qui se déplie et contient la zone de recherche.

      C'est comme pour un menu déroulant : clic sur item (là l'icone) déplie le menu qui contient la zone de recherche avec un bouton qui va valider le lancement de la recherche via un lien sur l'action de recherche.

      Quelques idées :

      - peut-être que la zone plus le bouton cela va faire lourd en terme de présentation après dropdown. Tu pourrais :

      * soit intégrer directement la zone de recherche dans le menu. Exemple avec Bootstrap https://getbootstrap.com/docs/4.3/components/navbar/ paragraphe Forms qui a justement une zone de recherche dans la barre.

      * soit ouvrir une modale en milieu d'écran ce qui permet de fournir plus d'infos voire de critères de recherche.

      A+ 

      -
      Edité par monkey3d 17 septembre 2019 à 7:58:48

      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2019 à 8:11:51

        J’ai essayé de faire en js, cacher le formulaire et le faire apparaître au clique, mais du coup je mets le {{form(form)}} directement dans le base.twig qui contient le menu, mais j’ai une erreur « form » n’existe pa, même en modifiant bien la route du controller 🤔🤔
        • Partager sur Facebook
        • Partager sur Twitter
          17 septembre 2019 à 8:17:06

          Tu peux répondre à ma courte question et à ma proposition ?

          Utilises-tu bootstrap et Font Awesome ? As tu regardé le lien que je t'ai indiqué ?

          Ce que tu as fait ne peux fonctionner en l'état puisque le form doit être lancé par une action côté serveur et non directement en js.

          A+

          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2019 à 8:24:52

            Oui j’utilise font awesome pour la loupe, oui j’ai regardé je connais bien mais ça ne va pas du tout dans mon cas je trouve, la fenêtre modale est une très bonne idée ! Mais une fois faite j’aurai toujours le même problème, comment insérer le formulaire dans cette fenêtre ?
            • Partager sur Facebook
            • Partager sur Twitter
              17 septembre 2019 à 8:43:55

              Le click sur la loupe déclenche l'ouverture de la modale de recherche. C'est donc juste une affaire html, css et js.

              Ta modale peut-être déclarée dans le base mais c'est le js qui la rend visible.

              C'est le bouton de validation de recherche dans la modale qui lance l'action de recherche. Et là tu te retrouves avec ce que tu as déjà fait. ... avec ce que nous avons déjà fait devrais-je dire ;) :D

              A+

              -
              Edité par monkey3d 17 septembre 2019 à 8:45:01

              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2019 à 9:33:33

                Oui mais faut bien que je déclare le {{form(form)}} dans le base.html.twig non ? Parce que quand je le fais j’ai une erreur à chaque fois ça me marque invalide. Je remplace bien la page search.html.twig par la modale sur le base ?

                -
                Edité par EvilSpartans 17 septembre 2019 à 9:34:36

                • Partager sur Facebook
                • Partager sur Twitter
                  17 septembre 2019 à 9:48:15

                  il faut que tu fasse un include de search.html.twig

                  euh.. je crois que j'ai dit une bétise

                  -
                  Edité par AaFredericHusson 17 septembre 2019 à 9:55:10

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                    17 septembre 2019 à 9:52:12

                    D'accord merci, je fais des tests de ce pas :)

                    Edit : Bon j'ai encore le même problème :

                    base :

                                    <li> <a class="modale" href="#"><i class="fas fa-search"></i></a> </li>
                    <div class="search">
                        {{ include('pages/Search.html.twig') }}
                    </div>
                    
                        {% block body %}
                        
                        {% endblock %}

                    Jquery :

                    <script>
                            $(document).ready(function () {
                                $('.search').hide();
                                $('a.modale').click(function () {
                                    $('.search').toggle(400);
                                    return false;
                                });
                            });
                        </script>

                    erreur :

                    "Variable form does not exist." 

                    Je précise que si je retire le {{form(form)}} la modale fonctionne x)

                    -
                    Edité par EvilSpartans 17 septembre 2019 à 10:34:36

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 septembre 2019 à 10:20:34

                      Qui peut m’aider 😬 ? Je comprends pas pourquoi lorsque je mets même le contenu directement sur le base.html.twig ça me dit que la variable form n’existe pas alors que sur sa page dédiée y’a aucun souci, c’est sûrement parce que je dois faire un truc sur les autres pages 🤔 il m’en fait voir de toutes les couleurs ce symfony 😂 mais c’est tellement pratique 🤷🏻‍♂️
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 septembre 2019 à 13:13:10

                        moi je ferais plutôt un formulaire de recherche à la main dans ton base.html.twig

                        à la validation du formulaire tu apelle ta route /Search

                        mais commente les lignes qui te cré le formulaire

                        -
                        Edité par AaFredericHusson 18 septembre 2019 à 13:13:32

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                          18 septembre 2019 à 14:57:26

                          Oui je vais essayer comme ça :) pas d’autres solutions sinon ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 septembre 2019 à 15:29:12

                            pour un simple form de recherche ou un form de connexion vaut autant le faire en manuel

                            sinon de mon coté non pas d'autres idées car le probleme c'est que tu souhaite y accéder de partout

                            -
                            Edité par AaFredericHusson 18 septembre 2019 à 15:56:43

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                              18 septembre 2019 à 18:24:48

                              Je reviens ...

                              Donc ta modale est mise visible (show) quand l'utilisateur click sur la loupe dans la barre de navigation via un javascript.

                              Dans ta modale il y a un champ de recherche mais qui est totalement indépendant du form de Symfony puisque c'est côté navigateur.

                              Quand l'utilisateur click sur submit de la modale, tu déclenches un javascript qui récupère le champ recherche de ta modale et va lancer l'action de recherche par un appel ajax.

                              Voilà comment je pratique et cela fonctionne très bien. Il y a sans doute d'autres solutions.

                              Ce n'est pas strictement la même solution que la recherche faite dans un précédent fil de discussion ... mais le besoin n'est pas le même non plus.

                              A+

                              -
                              Edité par monkey3d 18 septembre 2019 à 18:26:40

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 septembre 2019 à 19:29:49

                                pour récupérer ses résultats de la recherche il n'as pas besoin d'ajax

                                il peut juste faire un redirectToRoute à la place de l'afichage il me semble non?

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                                  18 septembre 2019 à 20:37:35

                                  Je ne parlais pas encore de  l'affichage ... juste de lancer la requête de recherche via la modale avec la donnée saisie dans la modale... comme d'bab tu ne comprends pas tout @AaFredericHusson

                                  Mais je ne doute pas qu'une autre solution soit possible ... encore faut-il l'exprimer clairement et l'avoir mise en oeuvre.

                                  A+

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 septembre 2019 à 21:04:47

                                    donc du coup la page search.html.twig devient inutile ? Je ne me sers que de la modale, avec un formulaire indépendant, que je relie à l'action de recherche et à la redirection pour afficher les résultats ?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 septembre 2019 à 21:37:40

                                      oui effectivement ton search.twig.html ne sert à rien

                                      @moonkey3d c'est pas croyable avec toi ont peut rien dire tu as toujours le dernier mot...

                                      la solution étais là sans ajax et d'ailleur en remontant voir la navbar de OC on as la solution mais bon pas grave

                                      si moonkey3d sais tout

                                      amusez vous bien et bon courrage...

                                      -
                                      Edité par AaFredericHusson 18 septembre 2019 à 21:38:16

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                                        18 septembre 2019 à 22:07:35

                                        Ne vous disputez pas on est là pour trouver des solutions en s'entraidant ^^Donc là j'ai fait ça.

                                        Controller :

                                        /**
                                             * @Route ("/Search", name="Search", methods={"GET","POST"})
                                             */
                                              
                                            public function search(Request $request)
                                            {
                                                $form = $this;
                                                     
                                                $form->handleRequest($request);
                                                if ($form->isSubmitted() && $form->isValid()) {
                                                    $data = $form->getData();
                                                    $em = $this->container->get('doctrine')->getManager();
                                                    $vehicules = $em->getRepository('App\Entity\Vehicule')->search($data['recherche']);
                                                    return $this->render('pages/Searchresult.html.twig', [
                                                        'vehicules' => $vehicules
                                                    ]);
                                                }
                                                  
                                                return $this->render('base.html.twig', [
                                                    'form' => $form->createView()
                                                ]);
                                          
                                                 
                                            }
                                           
                                        }

                                        Base :

                                        ect...
                                        <!-- Modale -->
                                                        <li> <a class="trigger" href="#"><i class="fas fa-search"></i></a></li>
                                                        <div class="modal">
                                                            <div class="modal-content">
                                                                <span class="close-button">&times;</span>
                                                                <form action="{{ path('Search') }}" method="POST">
                                                                    <input type="search"> <input type="submit" value="Rechercher">
                                                                </form>
                                                            </div>
                                                        </div>
                                        
                                        ect...

                                        J'ai aussi changé mon code pour avoir une belle modale, là j'ai une erreur mais je pense que c'est une "grosse" connerie que j'ai faite dans le controller en essayant d'enlever la création du form car ça me renvoyait une page blanche ^^

                                        erreur :

                                        Attempted to call an undefined method named "handleRequest" of class "App\Controller\HomeController".

                                        Je sais pas trop comment modifier le controller là pour juste être redirigé vers les résultats du formulaires

                                        -
                                        Edité par EvilSpartans 18 septembre 2019 à 22:59:15

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 septembre 2019 à 9:41:34

                                          Cool and keep quiet ! Je suis là pour partager ce que je sais et ce que j'ai fait qui fonctionne.

                                          Je ne prétends pas tout savoir ... loin s'en faut.

                                          La solution avec la modale show, ... la requête ajax fonctionne sur plusieurs de mes modules ... et comme je l'écrivais :

                                          Mais je ne doute pas qu'une autre solution soit possible ... encore faut-il l'exprimer clairement et l'avoir mise en oeuvre.

                                          La manière dont tu procèdes est sans doute possible mais je ne l'ai pas mise en oeuvre donc je ne préfère pas spéculer.

                                          Bye

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 septembre 2019 à 9:50:17

                                            Ça doit fonctionner comm j’essaye de faire je pense, mais je bloque sur les modifications du contrôleur vu que je n’ai pu besoin du form crée qui peut m’aider à le corriger pour le lier simplement au form fait à la main sur le base ?😬

                                            Edit :J'ai réussi avec le formulaire fait à la main, placé dans une modale, et avec un input relié au controller voilà 

                                            -
                                            Edité par EvilSpartans 19 septembre 2019 à 15:49:31

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 septembre 2019 à 15:49:10

                                              si tu crée ton form en dur comme je te l'avais proposé tu peut supprimer ces lignes:

                                              return $this->render('base.html.twig', [
                                                          'form' => $form->createView()
                                                      ]);


                                              et à la place de ces lignes:

                                              return $this->render('pages/Searchresult.html.twig', [
                                                              'vehicules' => $vehicules
                                                          ]);

                                              fait plutot un redirectToRoute en incluant tes données de recherche

                                              @moonkey3d c'est pas parce que ça fonctionne sur un projet qu'il faut obligatoirement l'utiliser sur tous les projets...

                                              chaque projet est différent...


                                              pour revenir au sujet tu as encore divers  problèmes

                                              $form n'existe pas vu que tu crée un formulaire en dur

                                              -
                                              Edité par AaFredericHusson 19 septembre 2019 à 15:51:36

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

                                              [Symfony 4] Placer barre de recherche dans la nav

                                              × 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