Bonjour,

Voila je rencontre un petit problème avec mon code depuis 2 jours, je suis nouveau en Symfony.
J'explique mon problème: j'affiche des annonces sur une page, aujourd'hui je les affiche seulement mais j'aimerai faire un système un peu à la airbnb en ajoutant une carte et faire en sorte que mes annonces s'affichent avec des markers sur la carte. J'aimerai convertir toutes les adresses de mes annonces en longetitude & l'attitude pour pouvoir les intégrer à la carte google sauf que dans mon controller je n'arrive pas à récupérer l'adresse de l'annonce.

Je pense très sérieusement que c'est un problème tout bête j'ai pourtant fais des recherches malheureusement je n'arrive pas à trouver la solution.

Ce que je fais

Voici une partie de mon controller pour afficher mes annonces.

public function listAction(Request $request, $companies)
    {
        $listCompanies = $this->getDoctrine()->getRepository(Advert::class)->getCompaniesHavingAdverts();

        $listName = array();
        foreach($listCompanies as $company){
            array_push($listName, $company["nameCompany"]);
        }

        if($companies){
            $adverts = $this->getDoctrine()->getRepository(Advert::class)->filterAdvertsByCompanyName($companies);
        }else{
            $adverts = $this
                ->getDoctrine()
                ->getRepository(Advert::class)
                ->createQueryBuilder('a')
                ->getQuery()
                ->getResult();
        }

        $paginator  = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $adverts,
            $request->query->getInt('page', 1)/*page number*/,
            12 // LIMITE D'ANNONCE PAR PAGE
        );

        $form = $this->createFormBuilder(null)

            ->setMethod('GET')
            ->add('jobcategory', JobCategoryType::class,
                ['required' => false,
                    'placeholder' => "Catégorie ",
                    'attr'     => ['class' => 'form-control']])
            ->add('city', TextType::class, [
                'label' => 'Code Postal : *',
                'required' => false,
                'attr' => ['class' => 'form-control', 'placeholder' => "Ex : 75013 Paris, France"],
            ])
            ->add('company', ChoiceType::class,[
                'label' => 'Nom entreprise :',
                'placeholder' => "Nom entreprise ",
                'choices' => $listName,
                'choice_label' => function($company){
                    return $company;
                },
                'required' => false,
                'attr' => ['class' => 'form-control', 'placeholder' => "Equipier ..."],
            ])
            ->add('Filtrer', SubmitType::class,
                ['attr'     => ['class' => 'btn btn-primary btn-block', 'style' => "width: 120px;"]])
            ->getForm();

        $form->handleRequest($request);

        if($form->isSubmitted()){
            $filter = $form->getdata();
            $ville = explode(",",$filter['city'])[0];
            $num = array_search($filter["company"],$listName);

            if($filter['company'] == null){
                $listCompanies[$num]["id"] = false;
            }

            $adverts = $this
                ->getDoctrine()
                ->getRepository(Advert::class)
                ->filterAdverts($ville, $filter['jobcategory'],$listCompanies[$num]["id"]);

            $paginator  = $this->get('knp_paginator');
            $pagination = $paginator->paginate(
                $adverts,
                $request->query->getInt('page', 1)/*page number*/,
                12// LIMITE D'ANNONCE PAR PAGE
            );
        }

        $adresseAdvert = $adverts->getPostalCode();
        $formattedAddrFrom = str_replace(',','+',$adresseAdvert);
        $formattedAddrFrom = urlencode($formattedAddrFrom);
        $geocodeFrom = file_get_contents('https://maps.google.com/maps/api/geocode/json?address='.$formattedAddrFrom.'&sensor=false&key=');
        $outputFrom = json_decode($geocodeFrom);
        $latitudeFrom = $outputFrom->results[0]->geometry->location->lat;
        $longitudeFrom = $outputFrom->results[0]->geometry->location->lng;

         return $this->render('App/Student/adverts.html.twig', [
            'adverts' => $pagination,
            'form' => $form->createView(),
            'pagination' => $pagination,
             'lat' => $latitudeFrom,
             'lng' => $longitudeFrom
        ]);
    }

Ce que je veux

Là ou ça plante, c'est lors de la récupération l'adresse de l'annonce " $adresseAdvert = $adverts->getPostalCode(); " ça me met qu'on ne peut pas récupérer un tableau (ce que je comprends totalement car il ne sait pas récuperer quelle adresse de quelle annonce).

Du coups je ne sais pas comment faire.
Dans la vue pour afficher les annonces j'ai un {% for advert in adverts %} et ensuite j'affiche les annonces avec des cartes ..

Merci beaucoup !

3 réponses


Personne pour me sauver de ma triste galère?

Merci

Bonjour.
Grafikart vient juste de faire une formation sur Symfony 4 et qui a justement comme exemple la création d'un site pour une agence immobilière et qui intègre justement un système de localisation des bien pour pourvoir les afficher avec des markers sur une map.
Formation PHP » Symfony 4 par l'exemple.

Dans cette série je vous propose de découvrir ensemble la nouvelle version du framework Symfony à travers un exemple concret, la création d'un site pour une agence immobilière virtuelle.

Et plus précisément pour ce que tu demandes : Symfony 4 par l'exemple » Gestion de la géolocalisation.

Dans cette partie nous allons mettre en place le système qui va permettre de localiser les biens sur une carte. L'objectif est de permettre à l'utilisateur de mieux situer le bien mais aussi d'être capable de filtrer les biens en fonction de sa localisation (afin de pouvoir sélectionner les biens situés dans un rayon de 10 ou 1000 km par exemple).

Par contre cette partie ne sera normalement disponible que dans environ 16 jours, sauf pour ceux qui sont Premium et qui y ont déja accès.

Bonjour,
Avant toute chose, je te conseille une formation à Symfony (ou aux principes du framework). Le but de celui-ci est de bien découper son code, et là tu as tout mis dans le controller. Ce n'est pas une bonne pratique.
Du coup, tu perds tout l'intérêt du framework, c'est dommage...
Pour ce qui est de récupérer la longitude/latitude à partir d'un adresse, ça peut se faire en interrogeant un map provider (google maps ou autre). Will Durand a créé un très bon bundle symfony à partir de geocoder, si ça peut t'aider (https://github.com/geocoder-php/Geocoder).