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 :

Développement d'un moteur de recherche avec le QueryBuilder de Symfony 4 [4.x]


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 32
    Points : 32
    Points
    32
    Par défaut Développement d'un moteur de recherche avec le QueryBuilder de Symfony 4
    Bonjour à tous,

    je suis novice en programmation, et j'essaye de créer mon blog. Le problème ? je galère avec la barre de recherche... Je voulais essayer de faire un truc simple, sans passer par elastic search, mais juste avec le query builder de symfony.

    Du coup j'ai créer une fonction dans le repository des articles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function search($title) {
           return $this->createQueryBuilder('Article')
               ->andWhere('Article.title LIKE :title')
               ->setParameter('title', '%'.$title.'%')
               ->getQuery()
               ->execute();
       }
    Et dans le controller je fait appel à cette méthode :
    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
    /**
         * @Route("/", name="home")
         */
        public function home(ArticleRepository $repo, PaginatorInterface $paginator, Request $request, AuthenticationUtils $authenticationUtils)
         { 
     
            $searchForm = $this->createForm(SearchType::class);
            $searchForm->handleRequest($request);
     
     
            if ($searchForm->isSubmitted() && $searchForm->isValid()) {
     
                $title = $searchForm->getData()->getTitle();
                $donnees = $repo->search($title);
     
                return $this->redirectToRoute('search');
     
        }
     
            $donnees = $this->getDoctrine()->getRepository(Article::class)->findBy([],['id' => 'desc']);
     
            // Paginate the results of the query
            $articles = $paginator->paginate(
                // Doctrine Query, not results
                $donnees,
                // Define the page parameter
                $request->query->getInt('page', 1),
                // Items per page
                4
            );
     
     
            // get the login error if there is one
            $error = $authenticationUtils->getLastAuthenticationError();
            // last username entered by the user
            $lastUsername = $authenticationUtils->getLastUsername();
     
            return $this->render('biblio/home.html.twig', [
                'articles' => $articles,
                'last_username' => $lastUsername,
                'error' => $error,
                'searchForm' => $searchForm->createView()
            ]);
        }
    Pour ensuite rediriger vers une page avec les articles correspondants. Il ne se passe rien dans la vue pour l'instant ( search.html.twig ) car je n'ai pas travaillé cette partie la.

    A ce niveau je me demande, avec cette méthode, est ce que si un utilisateur recherche un mot, mais pas un titre d'article complet, il y aura un retour ou pas ? ( si il faut taper un titre d'article à la lettre près sa manque d'interet ) si oui comment gérer sa avec le query builder ? ( la fonction doit pas être complète )

    Deuxio, comment faire pour envoyer les articles ainsi récupérés sur search.html.twig depuis home.html.twig ? Il faut créer une classe carrément ? ou il y a plus simple ?
    J'espère que j'ai été clair dans ma demande, et vous remercie d'avance pour vos réponses.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2019
    Messages : 67
    Points : 72
    Points
    72
    Par défaut
    Salut,

    Je crois que tu te poses ces questions un peu trop "tôt", dans le sens ou tu n'as pas vu quels résultats étaient renvoyés... Teste au moins ta requête (tu peux le faire même si tu n'as pas créé ta vue).
    Ton utilisateur n'aura pas besoin de taper le titre exact de l'article, puis que tu as écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ->andWhere('Article.title LIKE :title')
    ->setParameter('title', '%'.$title.'%')
    Là tu vas bien récupérer tous les articles dont le titre contient le mot $title (enfin le mot présent dans ta variable $title).


    Pour ta deuxième question ça dépend... Vu le code de ta méthode, à priori tu vas effectivement rediriger vers une autre action lorsque ton formulaire est envoyé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->redirectToRoute('search');
    Mais tu aurais aussi pu te contenter d'un render directement, sans redirection.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Ok PhiMau merci, je vais déjà tester la requête. Et lieu de rediriger je vais tout garder sur une même page sa sera plus simple.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 32
    Points : 32
    Points
    32
    Par défaut Victoire
    Merci pour tes conseils, j'ai finalement réussit à créer une barre de recherche toute simple, qui recherche un ou des mots clés dans le titre des articles. J'ai juste lié le formulaire à l'entité, et fait appel à la méthode du repository dans le controller pour enfin passer le résultat à knp_paginator.
    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
     /**
         * @Route("/recherche", name="search")
         */
        public function recherche(AuthenticationUtils $authenticationUtils, Request $request, ArticleRepository $repo, PaginatorInterface $paginator) {
     
            $error = $authenticationUtils->getLastAuthenticationError();
     
            $lastUsername = $authenticationUtils->getLastUsername();
     
            $searchForm = $this->createForm(SearchType::class);
            $searchForm->handleRequest($request);
     
            $donnees = $repo->findAll();
     
            if ($searchForm->isSubmitted() && $searchForm->isValid()) {
     
                $title = $searchForm->getData()->getTitle();
     
                $donnees = $repo->search($title);
     
                if ($donnees == null) {
                    $this->addFlash('erreur', 'Aucun article contenant ce mot clé dans le titre n\'a été trouvé, essayez en un autre.');
                }
     
        }
     
         // Paginate the results of the query
         $articles = $paginator->paginate(
            // Doctrine Query, not results
            $donnees,
            // Define the page parameter
            $request->query->getInt('page', 1),
            // Items per page
            4
        );
     
            return $this->render('biblio/search.html.twig',[
                'last_username' => $lastUsername,
                'error' => $error,
                'articles' => $articles,
                'searchForm' => $searchForm->createView()
            ]);
        }
    Merci encore pour tes conseils, sujet résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Moteur de recherche avec Excel dans des onglets ?
    Par jufabref dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2008, 13h51
  2. Réponses: 4
    Dernier message: 21/11/2007, 22h27
  3. [MySQL] Moteur de recherche avec accents
    Par NiX31 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/01/2007, 12h27
  4. moteur de recherche avec requete sql
    Par hottnikks_79 dans le forum ASP
    Réponses: 4
    Dernier message: 03/08/2006, 03h58
  5. Réponses: 6
    Dernier message: 04/11/2005, 17h09

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