src/Controller/AnnuairesExpertsController.php line 222

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * @author Mehrez Labidi
  5.  */
  6. namespace App\Controller;
  7. use App\Services\MetaTag;
  8. use App\Form\Models\ContactezDirectementExperts;
  9. use App\Form\Type\{
  10.     ContactezDirectementExpertsType,
  11.     ContactezDirectementMembreExpertsType
  12. };
  13. use App\Helper\Utils;
  14. use App\Services\ManagerEntity\{
  15.     ActualitesManagers,
  16.     AnnuairesManagers,
  17.     ContactPrestataireManagers,
  18.     LocalisationsManagers,
  19.     SecteursActiviteManagers,
  20.     ServicesPrestataireManagers
  21. };
  22. use App\Services\{
  23.     PaysAnnuaireExperts,
  24.     TelephoneInternational
  25. };
  26. use Knp\Component\Pager\PaginatorInterface;
  27. use Symfony\Component\Form\Extension\Core\Type\TextType;
  28. use Symfony\Component\Form\Forms;
  29. use Symfony\Component\HttpFoundation\{
  30.     Request,
  31.     Response
  32. };
  33. use App\Twig\TranslationExtension;
  34. use App\Entity\Villes;
  35. use Doctrine\ORM\EntityManagerInterface;
  36. use App\Entity\StatistiquesMensuellesPrestataire;
  37. use App\Helper\FiltresValidatorTrait// validation des filtres
  38. class AnnuairesExpertsController extends EntityUsingController {
  39.     use FiltresValidatorTrait;
  40.     public const SEARCH_WORD "searchWord";
  41.     public const ID_PAYS "id_pays";
  42.     public const ID_REGION "id_region";
  43.     public const MOTS_CLES "mots_cles";
  44.     public const TRI "tri";
  45.     public const TYPE_SOCIETE "type_societe";
  46.     public const TYPE_OPERATION "type_operation";
  47.     public const MESSAGE_SUCCESS "Votre message est bien evoyé à l'expert";
  48.     public const MESSAGE_FAIL "L'envoi de de votre message  à l'expert a échoué ";
  49.     public const FLASH_KEY_SUCCESS 'success';
  50.     public const FLASH_KEY_FAIL 'fail';
  51.     public const ID_LOCALISATION "id_localisation";
  52.     public const NOM_LOCALISATION "nom_localisation";
  53.     /**
  54.      * @var \App\Services\ManagerEntity\AnnuairesManagers
  55.      */
  56.     private $am;
  57.     /**
  58.      * @var \App\Controller\SecteursActiviteManagers
  59.      */
  60.     private $sam;
  61.     /**
  62.      * @var TelephoneInternational
  63.      */
  64.     private $ti;
  65.     /**
  66.      * @var ActualitesManagers
  67.      */
  68.     private $acm;
  69.     /**
  70.      * @var ContactPrestataireManagers
  71.      */
  72.     private $cpm;
  73.     /**
  74.      * @var ServicesPrestataireManagers
  75.      */
  76.     private $spm;
  77.     /**
  78.      * @var LocalisationsManagers
  79.      */
  80.     private $lm;
  81.     /**
  82.      * @var MetaTag
  83.      */
  84.     private $metaTag;
  85.     /**
  86.      * @var EntityManagerInterface
  87.      */
  88.     private $em;
  89.     /**
  90.      * @param AnnuairesManagers $am
  91.      * @param SecteursActiviteManagers $sam
  92.      * @param ActualitesManagers $acm
  93.      * @param TelephoneInternational $ti
  94.      * @param ContactPrestataireManagers $cpm
  95.      * @param ServicesPrestataireManagers $spm
  96.      */
  97.     public function __construct(LocalisationsManagers $lmAnnuairesManagers $amSecteursActiviteManagers $samActualitesManagers $acmTelephoneInternational $tiContactPrestataireManagers $cpmServicesPrestataireManagers $spmEntityManagerInterface $emMetaTag $metaTag) {
  98.         $this->acm $acm;
  99.         $this->am $am;
  100.         $this->sam $sam;
  101.         $this->ti $ti;
  102.         $this->cpm $cpm;
  103.         $this->spm $spm;
  104.         $this->lm $lm;
  105.         $this->metaTag $metaTag;
  106.         $this->em $em;
  107.     }
  108.     public function presentation(Request $request$codePays): Response {
  109.         
  110.         $metaTag $this->metaTag
  111.                 ->setTitle("Annuaire des experts FUSACQ : Gagnez en visibilité auprès des cédants et repreneurs d'entreprise")
  112.                 ->setDescription("Référencez votre cabinet dans l’annuaire FUSACQ et gagnez en visibilité auprès de cédants et repreneurs qualifiés. Fiche dédiée, mise en avant et diffusion de vos actualités.");
  113.         
  114.         return $this->render(
  115.                         'annuaires/experts/presentation.html.twig',
  116.                         [
  117.                             'controller_name' => 'AnnuairesExpertsController'
  118.                             'metaTag' => $metaTag
  119.                         ]
  120.                 );
  121.     }
  122.     /**
  123.      * @param $codePays
  124.      */
  125.     public function expertsRecherche(Request $request$codePays): Response {
  126.         $formFactory Forms::createFormFactoryBuilder()->getFormFactory();
  127.         $form $formFactory->createBuilder()
  128.                 ->add(self::SEARCH_WORDTextType::class)
  129.                 ->add(self::ID_PAYSTextType::class)
  130.                 ->add(self::ID_REGIONTextType::class)
  131.                 ->setAction($this->generateUrl('annuaires_experts_recherche', ['codePays' => $codePays]))
  132.                 ->setMethod('GET')
  133.                 ->getForm();
  134.         $searchWord $request->query->get('form')[self::SEARCH_WORD];
  135.         if ($searchWord) {
  136.             $searchWord trim($searchWord);
  137.         }
  138.         $idPays = (isset($request->query->get('form')[self::ID_PAYS])) ? $request->query->get('form')[self::ID_PAYS] : null;
  139.         $idRegion = (isset($request->query->get('form')[self::ID_REGION])) ? $request->query->get('form')[self::ID_REGION] : null;
  140.         $filter = [
  141.             self::SEARCH_WORD => $searchWord,
  142.             self::ID_PAYS => $idPays,
  143.             self::ID_REGION => $idRegion,
  144.         ];
  145.         // Validation structurelle des filtres
  146.         $this->validateFilters($filter);
  147.         $categories $this->am->rechercheExpertsList1($request$filter);
  148.         $experts $this->am->rechercheExpertsList2($request$filter);
  149.         return $this->render(
  150.                         'annuaires/experts/experts_recherche.html.twig',
  151.                         ['controller_name' => 'AnnuairesExpertsController',
  152.                             'categories' => $categories,
  153.                             'experts' => $experts,
  154.                             'form' => $form->createView(),
  155.                         ]
  156.                 );
  157.     }
  158.     /**
  159.      * @return \Symfony\Component\HttpFoundation\Response
  160.      */
  161.     public function index(Request $request$codePays) {
  162.         $formFactory Forms::createFormFactoryBuilder()->getFormFactory();
  163.         $form $formFactory->createBuilder()
  164.                 ->add(self::SEARCH_WORDTextType::class)
  165.                 ->add(self::ID_PAYSTextType::class)
  166.                 ->add(self::ID_REGIONTextType::class)
  167.                 ->setAction($this->generateUrl('annuaires_experts_recherche', ['codePays' => $codePays]))
  168.                 ->setMethod('GET')
  169.                 ->getForm();
  170.         $searchWord = ($request->query->get('form')) ? $request->query->get('form')[self::SEARCH_WORD] : null;
  171.         if ($searchWord) {
  172.             $searchWord trim($searchWord);
  173.         }
  174.         $idPays = (isset($request->query->get('form')[self::ID_PAYS])) ? $request->query->get('form')[self::ID_PAYS] : null;
  175.         $idRegion = (isset($request->query->get('form')[self::ID_REGION])) ? $request->query->get('form')[self::ID_REGION] : null;
  176.         $filter = [
  177.             self::SEARCH_WORD => $searchWord,
  178.             self::ID_PAYS => $idPays,
  179.             self::ID_REGION => $idRegion,
  180.         ];
  181.         // Validation structurelle des filtres
  182.         $this->validateFilters($filter);
  183.         $categories $this->am->rechercheExpertsList1($request$filter);
  184.         $dernieresPrestationsReferencees $this->am->getDernieresPrestationsReferencees();
  185.         $dernieresPrestationsReferenceesSimple $this->am->getDernieresPrestationsReferenceesSimple();
  186.         return $this->render(
  187.                         'annuaires/experts/index.html.twig',
  188.                         ['controller_name' => 'AnnuairesExpertsController',
  189.                             'categories' => $categories"NbDernieresPrestationsReferencees" => count($dernieresPrestationsReferenceesSimple),
  190.                             'dernieresPrestationsReferencees' => $dernieresPrestationsReferencees,
  191.                             'form' => $form->createView(),
  192.                         ]
  193.                 );
  194.     }
  195.     /**
  196.      * @param $codePays
  197.      * @param $lang
  198.      * @return mixed
  199.      */
  200.     public function expertsRechercheSecteur(Request $requestPaginatorInterface $paginator$codePays$lang) {
  201.         $formFactory Forms::createFormFactoryBuilder()->getFormFactory();
  202.         $form $formFactory->createBuilder()
  203.                 ->add(self::MOTS_CLESTextType::class)
  204.                 ->add(self::ID_PAYSTextType::class)
  205.                 ->add(self::ID_REGIONTextType::class)
  206.                 ->add(self::TYPE_SOCIETETextType::class)
  207.                 ->add(self::TYPE_OPERATIONTextType::class)
  208.                 ->setAction($this->generateUrl(
  209.                                 'annuaires_experts_recherche_secteur',
  210.                                 [
  211.                                     'codePays' => $codePays,
  212.                                     'lang' => $lang,
  213.                                 ]
  214.                         ))
  215.                 ->setMethod('GET')
  216.                 ->getForm();
  217.         $motsCle = ($request->query->get(self::MOTS_CLES) !== null) ? $request->query->get(self::MOTS_CLES) : NULL;
  218.         if ($motsCle) {
  219.             $motsCle trim($motsCle);
  220.         }
  221.         $idPays = ($request->query->get(self::ID_PAYS) !== null) ? $request->query->get(self::ID_PAYS) : NULL;
  222.         $idRegion = ($request->query->get(self::ID_REGION) !== null) ? $request->query->get(self::ID_REGION) : NULL;
  223.         $typeSociete = ($request->query->get(self::TYPE_SOCIETE) !== null) ? $request->query->get(self::TYPE_SOCIETE) : NULL;
  224.         $typeOperation = ($request->query->get(self::TYPE_OPERATION) !== null) ? $request->query->get(self::TYPE_OPERATION) : NULL;
  225.         $tri = ($request->query->get(self::TRI) !== null) ? $request->query->get(self::TRI) : NULL;
  226.         $filter = [
  227.             'motsCle' => $motsCle,
  228.             self::ID_PAYS => $idPays,
  229.             self::ID_REGION => $idRegion,
  230.             self::TYPE_SOCIETE => $typeSociete,
  231.             self::TYPE_OPERATION => $typeOperation,
  232.             self::TRI => $tri,
  233.         ];
  234.         // Validation structurelle des filtres
  235.         $this->validateFilters($filter);
  236.         $filter array_filter($filter); // if empty
  237.         if (count($filter) > 0) {
  238.             $idLocalisation = ($idRegion) ? $idRegion $idPays;
  239.             $experts $this->am->getListExpertsBySecteurActiviteLocalisation($request$paginator$idLocalisation$typeSociete$typeOperation$motsCle$tri);
  240.             $nbAllExperts $this->am->getNbExpertsBySecteurActiviteLocalisation($request$idLocalisation$typeSociete$typeOperation$motsCle);
  241.             return $this->render(
  242.                             'annuaires/experts/resultats_experts_recherche_secteur.html.twig',
  243.                             [
  244.                                 'controller_name' => 'AnnuairesExpertsController',
  245.                                 'experts' => $experts'nbAllExperts' => $nbAllExperts,
  246.                             ]
  247.                     );
  248.         }
  249.         return $this->render(
  250.                         'annuaires/experts/fragments/experts_recherche_secteur.html.twig',
  251.                         [
  252.                             'controller_name' => 'AnnuairesExpertsController',
  253.                             'lang' => $lang,
  254.                             'form' => $form->createView(),
  255.                         ]
  256.                 );
  257.     }
  258.     /**
  259.      * @param $codePays
  260.      * @return mixed
  261.      * @throws \Exception
  262.      */
  263.     public function dernieresPrestationsReferenceesFusacq(Request $request$codePays) {
  264.         $dernieresPrestationsReferencees $this->am->getDernieresPrestationsReferencees(20);
  265.         return $this->render(
  266.                         'annuaires/experts/dernieres_prestations_referencees_sur_fusacq.html.twig',
  267.                         [
  268.                             'dernieresPrestationsReferencees' => $dernieresPrestationsReferencees,
  269.                             'controller_name' => 'AnnuairesExpertsController',
  270.                         ]
  271.                 );
  272.     }
  273.     /**
  274.      * @param $idServicePrestataire
  275.      * @param $codePays
  276.      * @return mixed
  277.      * @throws \Exception
  278.      */
  279.     public function ficheActiviteExpertFusacq(Request $requestTranslationExtension $translationExtension$idServicePrestataire$codePays) {
  280.         if (!$idServicePrestataire) {
  281.             throw $this->createNotFoundException('No Expert  found for id ' $idServicePrestataire);
  282.         }
  283.         $prestation $this->spm->getDetailServicesPrestataireById($idServicePrestataire$this->ti);
  284.         if (!$prestation) {
  285.             throw $this->createNotFoundException('No Expert  found for id ' $idServicePrestataire);
  286.         }
  287.         if ($prestation["statut"] != 'publique' && $prestation["statut"] != 'publique_temporaire') {
  288.             $this->addFlash('error_prestataire_introuvable''La prestation n’existe pas ou a été supprimée');
  289.             return $this->redirectToRoute('annuaires_experts_index', ['codePays' => $codePays]);
  290.         }
  291.         $stas $this->em->getRepository(StatistiquesMensuellesPrestataire::class)->findOneBy(array("id_service_prestataire" => $idServicePrestataire"date_mois" => date("Ym")));
  292.         if (empty($stas)) {
  293.             $stas = new StatistiquesMensuellesPrestataire();
  294.             $stas->_set("id_service_prestataire"$idServicePrestataire);
  295.             $stas->_set("date_mois"date("Ym"));
  296.             $stas->_set("nb_affichages_fiche"1);
  297.             $this->em->persist($stas);
  298.             $this->em->flush();
  299.         } else {
  300.             $stas->_set("nb_affichages_fiche"$stas->_get("nb_affichages_fiche") + 1);
  301.             $this->em->persist($stas);
  302.             $this->em->flush();
  303.         }
  304.         $equipes $this->am->getMembresEquipeExpert($prestation['id_service_prestataire'], $prestation['id_societe_prestataire']);
  305.         $blogs $this->acm->getLesDerniersTroisBlogsExperts($prestation['id_service_prestataire'], $prestation['id_societe_prestataire'], date('YmdHis'), NULLnull);
  306.         $model = new ContactezDirectementExperts();
  307.         $model->_set('id_service_prestataire'$idServicePrestataire);
  308.         $currentRoute $request->attributes->get('_route');
  309.         $form $this->createForm(ContactezDirectementExpertsType::class, $model, [
  310.             'action' => $this->generateUrl(
  311.                     $currentRoute,
  312.                     [
  313.                         'codePays' => $codePays,
  314.                         'titreslug' => Utils::slugify($prestation['titre_service']),
  315.                         'idServicePrestataire' => $idServicePrestataire,
  316.                     ]
  317.             ),
  318.             'method' => 'POST',
  319.         ]);
  320.         $form->handleRequest($request);
  321.         if ($form->isSubmitted()) {
  322.             if ($form->isValid()) {
  323.                 $data $form->getData();
  324.                 $this->cpm->contacterSocietePrestataire((array) $data);
  325.                 $this->addFlash(self::FLASH_KEY_SUCCESSself::MESSAGE_SUCCESS);
  326.             } else {
  327.                 $this->addFlash(self::FLASH_KEY_FAILself::MESSAGE_FAIL);
  328.             }
  329.         }
  330.         $lang $request->getSession()->get('lang');
  331.         $arrayVarsTrans["nom_commercial_societe"] = $prestation['nom_commercial_societe'];
  332.         $arrayVarsTrans["nomSecteur"] = $this->spm->getNomSecteurActiviteById($prestation['id_secteur_new']);
  333.         $arrayVarsTrans["nomLocalisation"] = $prestation['ville'];
  334.         $metaTitle str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], '%$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  335.         $metaDescription str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], 'découvrez %$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  336.         $metaTag $this->metaTag
  337.                 ->setTitle($metaTitle)
  338.                 ->setDescription($metaDescription);
  339.         return $this->render('annuaires/experts/fiche_activite.html.twig', [
  340.                     'metaTag' => $metaTag,
  341.                     'controller_name' => 'AnnuairesExpertsController''prestation' => $prestation,
  342.                     'equipes' => $equipes'blogs' => $blogs,
  343.                     'form' => $form->createView(),
  344.         ]);
  345.     }
  346.     /**
  347.      * @param $idMembre
  348.      * @param $idServicePrestataire
  349.      * @param $codePays
  350.      * @return mixed
  351.      * @throws \Exception
  352.      */
  353.     public function ficheExpertDetail(Request $request$idMembre$idServicePrestataire$codePays) {
  354.         if (!$idMembre) {
  355.             throw $this->createNotFoundException('No membre  found for id ' $idMembre);
  356.         }
  357.         if (!$idServicePrestataire) {
  358.             throw $this->createNotFoundException('No ServicePrestataire  found for id ' $idMembre);
  359.         }
  360.         $prestation $this->spm->getDetailServicesPrestataireById($idServicePrestataire$this->ti);
  361.         if ($prestation["statut"] != 'publique' && $prestation["statut"] != 'publique_temporaire') {
  362.             $this->addFlash('error_prestataire_introuvable''La prestation n’existe pas ou a été supprimée');
  363.             return $this->redirectToRoute('annuaires_experts_index', ['codePays' => $codePays]);
  364.         }
  365.         $equipes $this->am->getMembresEquipeExpert($prestation['id_service_prestataire'], $prestation['id_societe_prestataire']);
  366.         $blogs $this->acm->getLesDerniersTroisBlogsExperts($prestation['id_service_prestataire'], $prestation['id_societe_prestataire'], date('YmdHis'), NULLnull);
  367.         $membre $this->am->getUnMembreEquipeExpert($idMembre);
  368.         $operations $this->acm->getlisteOperationsFromMember($idMembre);
  369.         $lienExpertPrecedant $lienExpertSuivant null// les liens vides si pas d'expert
  370.         foreach ($equipes as $i => $memb) {
  371.             if ($idMembre == $memb['id_membre']) { // le membre  courant
  372.                 if (array_key_exists($i 1$equipes)) { // le precedant de sa liste
  373.                     $lienExpertPrecedant $this->generateUrl(
  374.                             $request->attributes->get('_route'), // la route courante , on veut la garder
  375.                             ['codePays' => $codePays'idMembre' => $equipes[$i 1]['id_membre'], 'idServicePrestataire' => $idServicePrestataire'reecriture_url' => $equipes[$i 1]['reecriture_url']]
  376.                     );
  377.                 }
  378.                 if (array_key_exists($i 1$equipes)) { // le suivant de sa liste
  379.                     $lienExpertSuivant $this->generateUrl(
  380.                             $request->attributes->get('_route'), // la route courante , on veut la garder
  381.                             ['codePays' => $codePays'idMembre' => $equipes[$i 1]['id_membre'], 'idServicePrestataire' => $idServicePrestataire'reecriture_url' => $equipes[$i 1]['reecriture_url']]
  382.                     );
  383.                 }
  384.             }
  385.         }
  386.         $currentRoute $request->attributes->get('_route');
  387.         $form $this->createForm(ContactezDirectementMembreExpertsType::class, [
  388.             'id_membre' => $idMembre,
  389.             'id_service_prestataire' => $idServicePrestataire
  390.                 ], [
  391.             'action' => $this->generateUrl(
  392.                     $currentRoute,
  393.                     [
  394.                         'codePays' => $codePays'idMembre' => $idMembre,
  395.                         'reecriture_url' => Utils::slugify($prestation['titre_service']),
  396.                         'idServicePrestataire' => $idServicePrestataire,
  397.                     ]
  398.             ),
  399.             'method' => 'POST',
  400.         ]);
  401.         $form->handleRequest($request);
  402.         if ($form->isSubmitted()) {
  403.             if ($form->isValid()) {
  404.                 $data $form->getData();
  405.                 $this->cpm->contacterMembreEquipePrestataire((array) $data);
  406.                 $this->addFlash(self::FLASH_KEY_SUCCESSself::MESSAGE_SUCCESS);
  407.             } else {
  408.                 $this->addFlash(self::FLASH_KEY_FAILself::MESSAGE_FAIL);
  409.             }
  410.         }
  411.         $metaTitle $membre["prenom"] . " " $membre["nom"] . ", " $membre["raison_sociale"];
  412.         $metaDescription $membre["prenom"] . " " $membre["nom"] . ", " $membre["fonction"] . " " $membre["raison_sociale"];
  413.         $metaTag $this->metaTag
  414.                 ->setTitle($metaTitle)
  415.                 ->setDescription($metaDescription);
  416.         return $this->render('annuaires/experts/fiche_expert_detail.html.twig', [
  417.                     'controller_name' => 'AnnuairesExpertsController',
  418.                     'membre' => $membre'form' => $form->createView(), 'metaTag' => $metaTag,
  419.                     'prestation' => $prestation'equipes' => $equipes'blogs' => $blogs'operations' => $operations,
  420.                     'lienExpertSuivant' => $lienExpertSuivant'lienExpertPrecedant' => $lienExpertPrecedant,
  421.         ]);
  422.     }
  423.     /**
  424.      * @param $idServicePrestataire
  425.      * @param $codePays
  426.      * @return mixed
  427.      * @throws \Exception
  428.      */
  429.     public function ficheEquipeExpertFusacq(Request $requestTranslationExtension $translationExtension$idServicePrestataire$codePays) {
  430.         if (!$idServicePrestataire) {
  431.             throw $this->createNotFoundException('No Expert  found for id ' $idServicePrestataire);
  432.         }
  433.         $prestation $this->spm->getDetailServicesPrestataireById($idServicePrestataire$this->ti);
  434.         if ($prestation["statut"] != 'publique' && $prestation["statut"] != 'publique_temporaire') {
  435.             $this->addFlash('error_prestataire_introuvable''La prestation n’existe pas ou a été supprimée');
  436.             return $this->redirectToRoute('annuaires_experts_index', ['codePays' => $codePays]);
  437.         }
  438.         $equipes $this->am->getMembresEquipeExpert($prestation['id_service_prestataire'], $prestation['id_societe_prestataire']);
  439.         $blogs $this->acm->getLesDerniersTroisBlogsExperts($prestation['id_service_prestataire'], $prestation['id_societe_prestataire'], date('YmdHis'), NULLnull);
  440.         $model = new ContactezDirectementExperts();
  441.         $model->_set('id_service_prestataire'$idServicePrestataire);
  442.         $currentRoute $request->attributes->get('_route');
  443.         $form $this->createForm(ContactezDirectementExpertsType::class, $model, [
  444.             'action' => $this->generateUrl(
  445.                     $currentRoute,
  446.                     [
  447.                         'codePays' => $codePays,
  448.                         'titreslug' => Utils::slugify($prestation['titre_service']),
  449.                         'idServicePrestataire' => $idServicePrestataire,
  450.                     ]
  451.             ),
  452.             'method' => 'POST',
  453.         ]);
  454.         $form->handleRequest($request);
  455.         if ($form->isSubmitted()) {
  456.             if ($form->isValid()) {
  457.                 $data $form->getData();
  458.                 $this->cpm->contacterSocietePrestataire((array) $data);
  459.                 $this->addFlash(self::FLASH_KEY_SUCCESSself::MESSAGE_SUCCESS);
  460.             } else {
  461.                 $this->addFlash(self::FLASH_KEY_FAILself::MESSAGE_FAIL);
  462.             }
  463.         }
  464.         $lang $request->getSession()->get('lang');
  465.         $arrayVarsTrans["nom_commercial_societe"] = $prestation['nom_commercial_societe'];
  466.         $arrayVarsTrans["nomSecteur"] = $this->spm->getNomSecteurActiviteById($prestation['id_secteur_new']);
  467.         $arrayVarsTrans["nomLocalisation"] = $prestation['ville'];
  468.         $metaTitle str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], 'Equipe %$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  469.         $metaDescription str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], 'découvrez l\'équipe %$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  470.         $metaTag $this->metaTag
  471.                 ->setTitle($metaTitle)
  472.                 ->setDescription($metaDescription);
  473.         return $this->render('annuaires/experts/fiche_equipe.html.twig', [
  474.                     'metaTag' => $metaTag,
  475.                     'controller_name' => 'AnnuairesExpertsController''form' => $form->createView(),
  476.                     'prestation' => $prestation'equipes' => $equipes'blogs' => $blogs,
  477.         ]);
  478.     }
  479.     /**
  480.      * @param $idServicePrestataire
  481.      * @param $codePays
  482.      * @return mixed
  483.      * @throws \Exception
  484.      */
  485.     public function ficheBlogExpertFusacq(Request $requestTranslationExtension $translationExtension$idServicePrestataire$codePays) {
  486.         if (!$idServicePrestataire) {
  487.             throw $this->createNotFoundException('No Expert  found for id ' $idServicePrestataire);
  488.         }
  489.         $prestation $this->spm->getDetailServicesPrestataireById($idServicePrestataire$this->ti);
  490.         if ($prestation["statut"] != 'publique' && $prestation["statut"] != 'publique_temporaire') {
  491.             $this->addFlash('error_prestataire_introuvable''La prestation n’existe pas ou a été supprimée');
  492.             return $this->redirectToRoute('annuaires_experts_index', ['codePays' => $codePays]);
  493.         }
  494.         $equipes $this->am->getMembresEquipeExpert($prestation['id_service_prestataire'], $prestation['id_societe_prestataire']);
  495.         $blogs $this->acm->getLesDerniersTroisBlogsExperts($prestation['id_service_prestataire'], $prestation['id_societe_prestataire'], date('YmdHis'), NULLnull);
  496.         $model = new ContactezDirectementExperts();
  497.         $model->_set('id_service_prestataire'$idServicePrestataire);
  498.         $currentRoute $request->attributes->get('_route');
  499.         $form $this->createForm(ContactezDirectementExpertsType::class, $model, [
  500.             'action' => $this->generateUrl(
  501.                     $currentRoute,
  502.                     [
  503.                         'codePays' => $codePays,
  504.                         'titreslug' => Utils::slugify($prestation['titre_service']),
  505.                         'idServicePrestataire' => $idServicePrestataire,
  506.                     ]
  507.             ),
  508.             'method' => 'POST',
  509.         ]);
  510.         $form->handleRequest($request);
  511.         if ($form->isSubmitted()) {
  512.             if ($form->isValid()) {
  513.                 $data $form->getData();
  514.                 $this->cpm->contacterSocietePrestataire((array) $data);
  515.                 $this->addFlash(self::FLASH_KEY_SUCCESSself::MESSAGE_SUCCESS);
  516.             } else {
  517.                 $this->addFlash(self::FLASH_KEY_FAILself::MESSAGE_FAIL);
  518.             }
  519.         }
  520.         $lang $request->getSession()->get('lang');
  521.         $arrayVarsTrans["nom_commercial_societe"] = $prestation['nom_commercial_societe'];
  522.         $arrayVarsTrans["nomSecteur"] = $this->spm->getNomSecteurActiviteById($prestation['id_secteur_new']);
  523.         $arrayVarsTrans["nomLocalisation"] = $prestation['ville'];
  524.         $metaTitle str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], 'Actualité %$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  525.         $metaDescription str_replace(['%$nom_commercial_societe%$''%$nomSecteur%$''%$nomLocalisation%$'], [$arrayVarsTrans["nom_commercial_societe"], $arrayVarsTrans["nomSecteur"], $arrayVarsTrans["nomLocalisation"]], 'découvrez l\'actualité %$nom_commercial_societe%$, %$nomSecteur%$, %$nomLocalisation%$');
  526.         $metaTag $this->metaTag
  527.                 ->setTitle($metaTitle)
  528.                 ->setDescription($metaDescription);
  529.         return $this->render('annuaires/experts/fiche_blog.html.twig', [
  530.                     'metaTag' => $metaTag,
  531.                     'controller_name' => 'AnnuairesExpertsController''form' => $form->createView(),
  532.                     'prestation' => $prestation'equipes' => $equipes'blogs' => $blogs,
  533.         ]);
  534.     }
  535.     /**
  536.      * @param $lang
  537.      * @param $currentRouteParams
  538.      * @param $idPaysPrestataire
  539.      * @param $idLocalisationPrestataire
  540.      * @param $codePays
  541.      * @return mixed
  542.      */
  543.     public function fileAriane($lang$currentRouteParams$idPaysPrestataire$idLocalisationPrestataire$codePays) {
  544.         if (!$currentRouteParams['idServicePrestataire']) {
  545.             throw $this->createNotFoundException('No Expert  found for id ' $currentRouteParams['idServicePrestataire']);
  546.         }
  547.         $idServicePrestataire $currentRouteParams['idServicePrestataire'];
  548.         if (!$idServicePrestataire) {
  549.             throw $this->createNotFoundException('No Expert  found for id ' $idServicePrestataire);
  550.         }
  551.         $prestation $this->spm->getDetailServicesPrestataireById($idServicePrestataire$this->ti); // idServicePrestataire verifié deja depuis la ligne 299
  552.         if ($prestation["statut"] != 'publique' && $prestation["statut"] != 'publique_temporaire') {
  553.             $this->addFlash('error_prestataire_introuvable''La prestation n’existe pas ou a été supprimée');
  554.             return $this->redirectToRoute('annuaires_experts_index', ['codePays' => $codePays]);
  555.         }
  556.         $nomMembre = (isset($currentRouteParams['idMembre'])) ? $this->am->getNomPrenomMembreById($currentRouteParams['idMembre']) : null;
  557.         $secteurs $this->am->getSecteursActivitePrestataireNewParListeId($this->am->getIdSecteurPointerVers($this->am->getIdSecteurNew($idServicePrestataire)));
  558.         $secteursSecondLevel $this->am->getSecteursActivitePrestataireNewParPointeVers($this->am->getIdSecteurNew($idServicePrestataire));
  559.         $response $this->render(
  560.                 'annuaires/experts/fragments/file_ariane_expert.html.twig',
  561.                 [
  562.                     'controller_name' => 'AnnuairesExpertsController',
  563.                     'codePaysWithUnderScore' => $codePays,
  564.                     'secteurs' => $secteurs'secteursSecondLevel' => $secteursSecondLevel,
  565.                     'idServicePrestataire' => $idServicePrestataire'idLocalisationPrestataire' => $idLocalisationPrestataire'idPaysPrestataire' => $idPaysPrestataire,
  566.                     'lang' => $lang,
  567.                     'nomMembre' => $nomMembre'prestation' => $prestation,
  568.                 ]
  569.         );
  570.         $response->setPublic();
  571.         $response->setMaxAge(43200); // 12heures
  572.         return $response;
  573.     }
  574.     /**
  575.      * @param $id_secteur_activite
  576.      * @return mixed
  577.      */
  578.     public function repriseCessionCreationFranchise($id_secteur_activite) {
  579.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  580.         $metaTitle "Reprise, cession, création, franchise, Annuaire des experts FUSACQ";
  581.         $metaDescription "Trouver un expert en Reprise, cession, création, franchise dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  582.         $metaTag $this->metaTag
  583.                 ->setTitle($metaTitle)
  584.                 ->setDescription($metaDescription);
  585.         return $this->render('annuaires/experts/toutes_les_categories/reprise_cession_creation_franchise.html.twig', [
  586.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  587.         ]);
  588.     }
  589.     /**
  590.      * @param $id_secteur_activite
  591.      * @return mixed
  592.      */
  593.     public function marketingVente($id_secteur_activite) {
  594.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  595.         $metaTitle "Marketing & Vente, Annuaire des experts FUSACQ";
  596.         $metaDescription "Trouver un expert en Marketing Vente dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  597.         $metaTag $this->metaTag
  598.                 ->setTitle($metaTitle)
  599.                 ->setDescription($metaDescription);
  600.         return $this->render('annuaires/experts/toutes_les_categories/marketing_vente.html.twig', [
  601.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  602.         ]);
  603.     }
  604.     /**
  605.      * @param $id_secteur_activite
  606.      * @return mixed
  607.      */
  608.     public function comptabiliteAuditFinancementAssurance($id_secteur_activite) {
  609.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  610.         $metaTitle "Comptabilité, audit, financement, assurance, Annuaire des experts FUSACQ";
  611.         $metaDescription "Trouver un expert en Comptabilité, audit, financement, assurance dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  612.         $metaTag $this->metaTag
  613.                 ->setTitle($metaTitle)
  614.                 ->setDescription($metaDescription);
  615.         return $this->render('annuaires/experts/toutes_les_categories/comptabilite_audit_financement_assurance.html.twig', [
  616.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  617.         ]);
  618.     }
  619.     /**
  620.      * @param $id_secteur_activite
  621.      * @return mixed
  622.      */
  623.     public function informatiqueBureautiqueTelecom($id_secteur_activite) {
  624.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  625.         $metaTitle "Informatique / bureautique & Telecom, Annuaire des experts FUSACQ";
  626.         $metaDescription "Trouver un expert en Informatique, bureautique, télécom dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  627.         $metaTag $this->metaTag
  628.                 ->setTitle($metaTitle)
  629.                 ->setDescription($metaDescription);
  630.         return $this->render('annuaires/experts/toutes_les_categories/informatique_bureautique_telecom.html.twig', [
  631.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  632.         ]);
  633.     }
  634.     /**
  635.      * @param $id_secteur_activite
  636.      * @return mixed
  637.      */
  638.     public function ressourcesHumaines($id_secteur_activite) {
  639.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  640.         $metaTitle "Ressources Humaines, Annuaire des experts FUSACQ";
  641.         $metaDescription "Trouver un expert en Ressources Humaines dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  642.         $metaTag $this->metaTag
  643.                 ->setTitle($metaTitle)
  644.                 ->setDescription($metaDescription);
  645.         return $this->render('annuaires/experts/toutes_les_categories/ressources_humaines.html.twig', [
  646.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  647.         ]);
  648.     }
  649.     /**
  650.      * @param $id_secteur_activite
  651.      * @return mixed
  652.      */
  653.     public function droitFiscalitePatrimoineImmobilier($id_secteur_activite) {
  654.         $secteurs $this->spm->getSecteursPourAffichageRecherche($id_secteur_activite);
  655.         $metaTitle "Droit, fiscalité, patrimoine, immobilier, Annuaire des experts FUSACQ";
  656.         $metaDescription "Trouver un expert en Droit, fiscalité, patrimoine, immobilier dans l'annuaire des experts FUSACQ pour vous accompagner dans votre opération de création, reprise, cession ou développement de votre entreprise.";
  657.         $metaTag $this->metaTag
  658.                 ->setTitle($metaTitle)
  659.                 ->setDescription($metaDescription);
  660.         return $this->render('annuaires/experts/toutes_les_categories/droit_fiscalite_patrimoine_immobilier.html.twig', [
  661.                     'controller_name' => 'AnnuairesExpertsController''secteurs' => $secteurs'metaTag' => $metaTag,
  662.         ]);
  663.     }
  664.     /**
  665.      * @param $id_secteur_activite
  666.      * @param PaysAnnuaireExperts $paysAnnuaireExperts
  667.      * @return mixed
  668.      */
  669.     public function listeSousCategoriesExperts(Request $request$id_secteur_activitePaysAnnuaireExperts $paysAnnuaireExperts$codePays) {
  670.         $idLocalisations $this->spm->getLocalisationServicePrestataireByIdSecteurActivite($id_secteur_activite);
  671.         if (Utils::idLocalisationArrayContainsOnlyIdPays($idLocalisations)) { // tous les id sont SANS précisions idregion/iddepartement
  672.             array_unique($idLocalisations);
  673.             $id_localisation end($idLocalisations);
  674.             $secteur $this->spm->getSecteursActivitePrestataireNewParListeId($id_secteur_activite);
  675.             $nom_secteur_activite Utils::slugify(array_column($secteur0)[0]);
  676.             if ($nom_secteur_activite && $id_localisation) {
  677.                 return $this->redirectToRoute(
  678.                                 'annuaires_experts_list_experts_localisation',
  679.                                 [
  680.                                     'id_secteur_activite' => $id_secteur_activite,
  681.                                     'nom_secteur_activite' => $nom_secteur_activite,
  682.                                     self::ID_LOCALISATION => $id_localisation,
  683.                                     self::NOM_LOCALISATION => $paysAnnuaireExperts->getPaysExpertByIdLocalisation($id_localisation)[0],
  684.                                     'codePays' => $codePays
  685.                                 ]
  686.                         );
  687.             }
  688.         }
  689.         $listPays $this->lm->extractListIdPaysFromIdlocalisation($idLocalisations); // list des pays qui ont des experts pour ce secteur activité
  690.         $secteur $this->spm->getSecteursActivitePrestataireNewParListeId($id_secteur_activite);
  691.         $id_pays $request->query->get('id_pays');
  692.         if (!isset($id_pays)) {
  693.             $id_pays $this->container->get("id_pays_by_code_pays")->getIdPaysByCodePays($codePays);
  694.         }
  695.         $listRegionsFrance = ($id_pays == "33") ? $this->listRegionsExpertsPays($listPays$idLocalisations$id_pays) : [];
  696.         $listRegionsBelgique = ($id_pays == "32") ? $this->listRegionsExpertsPays($listPays$idLocalisations$id_pays) : [];
  697.         $listRegionsSuisse = ($id_pays == "41") ? $this->listRegionsExpertsPays($listPays$idLocalisations$id_pays) : [];
  698.         $listRegionsCanada = ($id_pays == "01") ? $this->listRegionsExpertsPays($listPays$idLocalisations$id_pays) : [];
  699.         $listRegionsLuxembourg = ($id_pays == "352") ? $this->listRegionsExpertsPays($listPays$idLocalisations$id_pays) : [];
  700.         $listRegions array_merge($listRegionsFrance$listRegionsBelgique$listRegionsSuisse$listRegionsCanada$listRegionsLuxembourg);
  701.         $metaTitle Utils::firstValInArray($secteur)[0] . ", " Utils::firstValInArray($this->lm->getNomLocalisationById($id_pays)) ["nom_localisation"] . " FUSACQ";
  702.         $metaDescription Utils::firstValInArray($secteur)[0] . ", " Utils::firstValInArray($this->lm->getNomLocalisationById($id_pays)) ["nom_localisation"];
  703.         $metaTag $this->metaTag
  704.                 ->setTitle($metaTitle)
  705.                 ->setDescription($metaDescription);
  706.         return $this->render('annuaires/experts/liste_sous_categories_experts.html.twig', [
  707.                     'controller_name' => 'AnnuairesExpertsController''secteur' => $secteur"paysAnnuaireExperts" => $paysAnnuaireExperts->listPays(),
  708.                     'listRegionsFrance' => ($listRegionsFrance) ? $listRegionsFrance : [],
  709.                     'listRegionsBelgique' => ($listRegionsBelgique) ? $listRegionsBelgique : [],
  710.                     'listRegionsCanada' => ($listRegionsCanada) ? $listRegionsCanada : [],
  711.                     'listRegionsSuisse' => ($listRegionsSuisse) ? $listRegionsSuisse : [],
  712.                     'listRegionsLuxembourg' => ($listRegionsLuxembourg) ? $listRegionsLuxembourg : [],
  713.                     'listRegions' => $listRegions'metaTag' => $metaTag,
  714.                     "id_secteur_activite" => $id_secteur_activite"idLocalisations" => $idLocalisations"listPays" => $listPays
  715.         ]);
  716.     }
  717.     /**
  718.      * @param $listPays
  719.      * @param $idLocalisations
  720.      * @param $idpays
  721.      * @return array|null
  722.      */
  723.     private function listRegionsExpertsPays($listPays$idLocalisations$idpays) {
  724.         $listRegions = (in_array($idpays$listPays)) ? $this->lm->getRegionsEtLeursDepartement($idpays) : [];
  725.         foreach ($listRegions as $item => $region) {
  726.             $region["nb_experts_region"] = Utils::countNbIdLocalisationInArray($region[self::ID_LOCALISATION], $idLocalisationstrue);
  727.             $sum 0;
  728.             if (isset($region["departements"])) {
  729.                 foreach ($region["departements"] as $i => $departement) {
  730.                     $departement["nb_experts"] = Utils::countNbIdLocalisationInArray($departement[self::ID_LOCALISATION], $idLocalisations);
  731.                     $sum += $departement["nb_experts"];
  732.                     $region["departements"][$i] = $departement;
  733.                 }
  734.             }
  735.             $region["nb_experts_departements"] = $sum;
  736.             $listRegions[$item] = $region;
  737.         }
  738.         return $listRegions;
  739.     }
  740.     /**
  741.      * @param $id_secteur_activite
  742.      * @param $id_localisation
  743.      * @return mixed
  744.      */
  745.     public function listExpertsLocalisation(Request $requestTranslationExtension $translationExtension$id_secteur_activite$id_localisation) {
  746.         $secteurs $this->am->getSecteursActivitePrestataireNewParListeId($id_secteur_activite);
  747.         $experts $this->spm->getListServicePrestataireByIdSecteurActiviteByLocalisation($id_secteur_activite$id_localisation);
  748.         $nomLocalisationWithPrefix $this->lm->getNomLocalisationWithPrefixById($id_localisation);
  749.         if ((Utils::lastValInArray($nomLocalisationWithPrefix)) && (Utils::lastValInArray($nomLocalisationWithPrefix)[self::NOM_LOCALISATION])) {
  750.             $nomLocalisationWithPrefix Utils::lastValInArray($nomLocalisationWithPrefix)[self::NOM_LOCALISATION];
  751.         }
  752.         $nomLocalisation $this->lm->getNomLocalisationById($id_localisation);
  753.         $nomLocalisation end($nomLocalisation)[self::NOM_LOCALISATION];
  754.         $nomSecteur $this->spm->getNomSecteurActiviteById($id_secteur_activite);
  755.         $villesRepo $this->getDoctrine()->getRepository(Villes::class);
  756.         $nomVillePrincipale $villesRepo->donne_string_noms_villes_principales_dune_localisation($id_localisation1);
  757.         $lang $request->getSession()->get('lang');
  758.         $arrayVarsTrans["nomSecteur"] = $nomSecteur;
  759.         $arrayVarsTrans["nomLocalisationWithPrefix"] = $nomLocalisationWithPrefix;
  760.         $arrayVarsTrans["nomVillePrincipale"] = $nomVillePrincipale;
  761.         $metaTitle str_replace(
  762.                 ['%$nomSecteur%$''%$nomLocalisationWithPrefix%$'],
  763.                 [$nomSecteur$nomLocalisationWithPrefix],
  764.                 ' %$nomSecteur%$ %$nomLocalisationWithPrefix%$ '
  765.         );
  766.         $metaDescription str_replace(
  767.                 ['%$nomSecteur%$''%$nomLocalisationWithPrefix%$''%$nomVillePrincipale%$'],
  768.                 [$nomSecteur$nomLocalisationWithPrefix$nomVillePrincipale],
  769.                 ' %$nomSecteur%$ %$nomLocalisationWithPrefix%$, %$nomVillePrincipale%$ ');
  770.         $metaTag $this->metaTag
  771.                 ->setTitle($metaTitle)
  772.                 ->setDescription($metaDescription);
  773.         return $this->render('annuaires/experts/list_experts_localisation.html.twig', [
  774.                     'metaTag' => $metaTag,
  775.                     'controller_name' => 'AnnuairesExpertsController',
  776.                     "nomLocalisationWithPrefix" => $nomLocalisationWithPrefixself::ID_LOCALISATION => $id_localisation,
  777.                     "nomLocalisation" => $nomLocalisation"id_secteur_activite" => $id_secteur_activite,
  778.                     "nomSecteur" => $nomSecteur"experts" => $experts"secteurs" => $secteurs
  779.         ]);
  780.     }
  781.     /**
  782.      * @param Request $request
  783.      * @param type $lang
  784.      * @param type $codePays
  785.      * @return type
  786.      */
  787.     public function colonnesGaucheExpert(Request $request$lang$codePays) {
  788.         $dernieresPrestationsReferencees $this->am->getDernieresPrestationsReferencees(3);
  789.         $dernieresPrestationsReferenceesSimple $this->am->getDernieresPrestationsReferenceesSimple();
  790.         $response $this->render(
  791.                 'includes/colonnes_gauche_expert.html.twig',
  792.                 [
  793.                     'controller_name' => 'AnnuairesExpertsController',
  794.                     'codePaysWithUnderScore' => $codePays,
  795.                     'dernieresPrestationsReferencees' => $dernieresPrestationsReferencees,
  796.                     'NbDernieresPrestationsReferencees' => count($dernieresPrestationsReferenceesSimple),
  797.                     'lang' => $lang,
  798.                 ]
  799.         );
  800.         $response->setPublic();
  801.         $response->setMaxAge(43200); // 12heures
  802.         return $response;
  803.     }
  804.     public function detailArticle(Request $request$titreActu$idActuTranslationExtension $translationExtension$codePays) {
  805.         $article $this->acm->getArticleDetailById($idActu);
  806.         if (!$article) {
  807.             throw $this->createNotFoundException('article   introuvable avec id ' $article);
  808.         }
  809.         $metaTitle $article['titre_actualite'] . ", FUSACQ Buzz";
  810.         $metaDescription $article['titre_actualite'];
  811.         $metaTag $this->metaTag
  812.                 ->setTitle($metaTitle)
  813.                 ->setDescription($metaDescription);
  814.         return $this->render('annuaires/experts/detail_article.html.twig', [
  815.                     'controller_name' => 'AnnuairesExpertsController',
  816.                     'article' => $article'metaTag' => $metaTag,
  817.         ]);
  818.     }
  819. }