src/Controller/AnnoncesController.php line 2296

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\aside\asidesUrlPagination;
  4. use App\ClassTheatre\asides;
  5. use App\ClassTheatre\TheatreController;
  6. use App\Service\Abonnements\Abonnements;
  7. use App\Service\CheckMimeType\CheckMimeType;
  8. use App\Service\Cleantext;
  9. use App\Service\Functions;
  10. use App\Service\Geocodage\Geocodage;
  11. use App\Service\TheatreParametres;
  12. use App\Service\TheatreMail\TheatreMail;
  13. use App\Service\videoEmbed\videoEmbed;
  14. use App\Service\wiki2xhtml\wiki2xhtml;
  15. use App\Validator\CheckWebsite;
  16. use App\Validator\Recaptcha;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Psr\Log\LoggerInterface;
  19. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  20. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  21. use Symfony\Component\Form\Extension\Core\Type\FileType;
  22. use Symfony\Component\Form\Extension\Core\Type\FormType;
  23. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  24. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  25. use Symfony\Component\Form\Extension\Core\Type\TextType;
  26. use Symfony\Component\Form\FormFactoryInterface;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\Routing\Annotation\Route;
  29. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  30. use Symfony\Contracts\Translation\TranslatorInterface;
  31. use Symfony\Component\Validator\Constraints\File;
  32. use Symfony\Component\Validator\Constraints\Length;
  33. use Symfony\Component\Validator\Constraints\NotBlank;
  34. use Symfony\Component\Validator\Constraints\Email;
  35. use Symfony\Component\Validator\Constraints as Assert;
  36. use TheatreCore\Classes\Constants\Constants;
  37. use TheatreCore\Entity\AnnAnnonces;
  38. use TheatreCore\Entity\AnnCategories;
  39. use TheatreCore\Entity\AnnReponses;
  40. use TheatreCore\Entity\Bigregions;
  41. use TheatreCore\Entity\BookmarkExtranetuser;
  42. use TheatreCore\Entity\Extranetusers;
  43. use TheatreCore\Form\Type\RecaptchaType;
  44. class AnnoncesController extends TheatreController
  45. {
  46.     private $TheatreParametres;
  47.     
  48.     private $logger;
  49.     /** constructeur hérité
  50.      *
  51.      */
  52.     public function __construct(
  53.         EntityManagerInterface $em,
  54.         TranslatorInterface $translator,
  55.         TokenStorageInterface $tokenStorage,
  56.         Functions $func,
  57.         Abonnements $abonnements,
  58.         TheatreParametres $TheatreParametres,
  59.         LoggerInterface $logger
  60.     )
  61.     {
  62.         parent::__construct($translator$tokenStorage);
  63.         $this->TheatreParametres $TheatreParametres;
  64.         $GLOBALS['rub_courante'] = $this->context['controller'] = $this->view->controller 'annonces';
  65.         $this->em $em;
  66.         $this->func $func;
  67.         $this->asides = new asides();
  68.         $this->serviceAbonnements $abonnements;
  69.         $this->logger $logger;
  70.     }
  71.     /**
  72.      * @Route("/annonces/", name="annonces_view")
  73.      */
  74.     public function index(Request $request)
  75.     {
  76.         // annonces
  77.         $annonces $this->em->getRepository(AnnAnnonces::class);
  78.         // categories
  79.         $categories $this->em->getRepository(AnnCategories::class);
  80.         // utilisateurs
  81.         $extranetusers $this->em->getRepository(Extranetusers::class);
  82.         // liste des categories
  83.         $categories_list $categories->getCategoriesList(true);
  84.         $categories_list[0] = 'Liste des catégories';
  85.         ksort($categories_list);
  86.         // formulaire de recherche
  87.         $this->view->accueils true;
  88.         $this->getRechercheAnnonce($request$categories_list);
  89.         // trouver les categories avec url_clean
  90.         $categories_list = array();
  91.         $categories_list $categories->queryAll('SELECT * FROM ' $categories->__table ' WHERE online=1 ORDER BY class');
  92.         // classe cleantext
  93.         $ct = new Cleantext($this->em);
  94.         // nb d'annonce dans la categorie
  95.         $sql_nb 'SELECT idcategorie, COUNT(*) AS count FROM ' $annonces->__table ' WHERE online=1 AND valid=1 AND attente=0 GROUP BY idcategorie';
  96.         $resultats_query_categories_count $annonces->queryAll($sql_nb);
  97.         $resultats_categories_count = [];
  98.         foreach ($resultats_query_categories_count as $key => $value) {
  99.             $resultats_categories_count[$value['idcategorie']] = $value['count'];
  100.         }
  101.         foreach ($categories_list as $value) {
  102.             $idcategorie $value['idcategorie'];
  103.             $categories_l[$idcategorie] = $value;
  104.             $categories_l[$idcategorie]['nb_annonces'] = $resultats_categories_count[$idcategorie] ?? 0;
  105.             // derniere annonce dans la categorie
  106.             $last 'SELECT MAX(dateinsert) as lastdate FROM ' $annonces->__table ' WHERE idcategorie=' $idcategorie;
  107.             if ($lastcat $annonces->queryOne($last)) {
  108.                 $categories_l[$idcategorie]['lastcat'] = $lastcat;
  109.                 $categories_l[$idcategorie]['lastdate'] = $annonces->getFormeDate($lastcat'd/m/Y');
  110.                 $categories_l[$idcategorie]['lastheure'] = $annonces->getFormeDate($lastcat'H:i');
  111.             }
  112.         }
  113.         $this->view->categories $categories_l;
  114.         // derniere annonce
  115.         $sql_last 'SELECT a.*,e.login FROM ' $annonces->__table ' a, ' $extranetusers->__table ' e
  116.              WHERE e.idextranetuser=a.idextranetuser
  117.              AND a.online=1 AND a.valid=1 AND a.attente=0 ORDER BY a.dateinsert DESC LIMIT 0,1';
  118.         if (is_array($last $annonces->queryRow($sql_last))) {
  119.             $singleCategory $categories->find($last['idcategorie']);
  120.             $url_clean $annonces->cutSentence($ct->str2URL($last['sujet']), 200);
  121.             $url_clean $url_clean '-annonce' $last['idannonce'];
  122.             $last['url_clean'] = $url_clean;
  123.             $last['name_categorie'] = $singleCategory->getName();
  124. //            require_once PATH_LIBS.'Text/Wiki2xhtml/class.wiki2xhtml.php'; // appel de la classe wiki2xhtml
  125.             $wiki = new wiki2xhtml();
  126.             $description_courte $wiki->transform($annonces->cutSentence($last['description'], 250));
  127.             $last['description_courte'] = strip_tags($description_courte);
  128.             $last['url_categorie'] = $singleCategory->getUrlClean();
  129.             $last['date'] = $annonces->getFormeDate($last['dateinsert'], 'd/m/Y');
  130.             $last['heure'] = $annonces->getFormeDate($last['dateinsert'], 'H:i');
  131.             $this->view->last $last;
  132.         }
  133.         // nombre d'annonces
  134.         $this->view->nb_total_annonces $annonces->queryOne('SELECT COUNT(idannonce) FROM ' $annonces->__table ' WHERE online=1 AND valid=1 AND attente=0');
  135.         // titre de la page
  136.         $this->title_page 'Les petites annonces du théâtre et du spectacle';
  137.         // fil d'arianne
  138.         $this->view->locate = array('' => 'Les petites annonces');
  139.         // style css
  140.         $this->view->style_more = array('annonces');
  141.         // jquery
  142.         $this->view->jquery_cal 'datepicker';
  143.         $asides = new asides();
  144.         $asides->load('annonce_reseau');
  145.         $asides->load('annonce_aside');
  146.         $asides->load('common_publicite');
  147.         $this->view->aside $asides->view($this->view);
  148.         //On affiche la publicité google
  149.         $asides_publicite = new asides();
  150.         asides::setEntityManager($this->em);
  151.         asides::loadaside('Publicite')->addGoogleCorrespondant($asides_publicite$this->serviceAbonnements);
  152.         $this->context['view']->asides_publicite_footer $asides_publicite->view($this->context['view']);
  153.         //On affiche la publicité google
  154.         $asides_publicite = new asides();
  155.         asides::loadaside('Publicite')->addGoogle($asides_publicite$this->serviceAbonnements);
  156.         $this->context['view']->asides_publicite $asides_publicite->view($this->context['view']);
  157.         return $this->view('annonces/view.html.twig');
  158.     }
  159.     // }}}
  160.     /**
  161.      * @Route("/annonces/page/aide/", name="annonces_page_aide")
  162.      */
  163.     public function action_aide(FormFactoryInterface $formFactory)
  164.     {
  165.         // titre de la page
  166.         $title_page 'Aide sur les petites annonces';
  167.         // fil d'arianne
  168.         $this->view->locate = array('/annonces/' => 'Les petites annonces',
  169.             '' => 'Aide',
  170.         );
  171.         // categories
  172.         $categories $this->em->getRepository(AnnCategories::class);
  173.         $categories_list $categories->getCategoriesList(true);
  174. //        $elements['idcategorie'] = new HTML_Template_Flexy_Element;
  175. //        $elements['idcategorie']->setOptions($categories_list);
  176. //        $elements['idcategorie']->setOptions(array('0'=> utf8_encode(html_entity_decode('dans la cat&eacute;gorie...'))));
  177. //        $elements['idcategorie']->setValue('0');
  178.         // style css
  179.         $this->view->style_more = array('annonces');
  180.         $form $formFactory->createNamedBuilder('');
  181.         $form->add('idcategorie'ChoiceType::class, [
  182.             'label' => 'Catégorie',
  183.             'placeholder' => 'Liste des catégories',
  184.             'choices' => array_flip($categories_list),
  185.             'required' => false,
  186.             'attr' => [
  187.                 'id' => 'idcategorie'
  188.             ]
  189.         ]);
  190.         $this->view->formAsideSearch $form->getForm()->createView();
  191.         return $this->view('annonces/aide.html.twig');
  192.     }
  193.     /**
  194.      * @Route("/annonces/suivre/rss/", name="annonces_suivre_rss")
  195.      * @Route("/annonces/suivre/rss/idannonce/{idannonce}", name="annonces_suivre_rss_idannonce")
  196.      */
  197.     public function action_rss($idannonce nullRequest $requestCleantext $ct)
  198.     {
  199.         $this->context['params']['idannonce'] = $idannonce;
  200.         if (array_key_exists('idcategorie'$this->context['params']) && is_numeric($this->context['params']['idannonce'])) {
  201.             $this->categories(null);
  202.         } else {
  203.             // annonces
  204.             $annonces $this->em->getRepository(AnnAnnonces::class);
  205.             // categories
  206.             $categories $this->em->getRepository(AnnCategories::class);
  207.             // classe wiki
  208.             $wiki = new wiki2xhtml();
  209.             $sql_annonce 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.lieu,e.login,c.url_clean, c.name as categorie_name
  210.                     FROM ' $categories->__table ' c, ' $annonces->__table ' a
  211.                         LEFT OUTER JOIN extranetusers e
  212.                         ON a.idextranetuser=e.idextranetuser
  213.                     WHERE c.idcategorie=a.idcategorie AND a.online=1 AND a.valid=1 AND a.attente=0
  214.                     ORDER BY a.dateinsert DESC LIMIT 0,10';
  215.             //echo $sql_annonce;
  216.             // executer la requete
  217.             $datas $annonces->query($sql_annonce);
  218.             $annonces_list = array();
  219.             // liste annonces
  220.             foreach ($datas as $data) {
  221.                 $annonces->loadResult($data);
  222.                 $idannonce $annonces->idannonce;
  223.                 $annonces_list[$idannonce] = array(
  224.                     'description' => $annonces->description,
  225.                     'lieu' => $annonces->lieu);
  226.                 $annonces_list[$idannonce]['sujet'] = ucfirst($annonces->sujet);
  227.                 $annonces_list[$idannonce]['lieu'] = ucwords(strtolower($annonces->lieu));
  228.                 $annonces_list[$idannonce]['date'] = $annonces->getFormeDate($annonces->dateinsert$GLOBALS['format_date']['fr']);
  229.                 $annonces_list[$idannonce]['heure'] = $annonces->getFormeDate($annonces->dateinsert'H:i');
  230.                 $description strip_tags($wiki->transform($annonces->description));
  231.                 $annonces_list[$idannonce]['description_courte'] = $annonces->cutSentence($description250);
  232.                 // nom de la categorie
  233.                 $annonces_list[$idannonce]['categorie_name'] = $annonces->categorie_name;
  234.                 // url_clean
  235.                 $url_clean $annonces->cutSentence($ct->str2URL($annonces->sujet), 200);
  236.                 $url_clean $url_clean '-annonce' $idannonce;
  237.                 $annonces_list[$idannonce]['url_clean'] = $url_clean;
  238.                 $annonces_list[$idannonce]['url_categorie'] = $annonces->url_clean;
  239.                 // md5
  240.                 $md5 md5($annonces->idannonce);
  241.                 $annonces_list[$idannonce]['md5'] = $md5;
  242.                 // date
  243.                 $date $annonces->dateinsert;
  244.                 $t explode(' '$date);
  245.                 list($y$m$d) = explode('-'$t[0]);
  246.                 list($h$i$s) = explode(':'$t[1]);
  247.                 $w3t gmdate(DATE_ATOMmktime($h$i$s$m$d$y));
  248.                 $annonces_list[$idannonce]['w3t'] = $w3t;
  249.                 // premiere annonce = updated
  250.                 if (!isset($updated)) {
  251.                     $this->context['view']->updated $w3t;
  252.                     $this->context['view']->md5 $md5;
  253.                     $updated true;
  254.                 }
  255.             }
  256.             // passer les annonces au templates
  257.             $this->context['view']->annonces $annonces_list;
  258.         }
  259.         $response $this->view('annonces/rss.html.twig');
  260.         $response->headers->set('Content-Type''xml');
  261.         $response->setCharset('utf-8');
  262.         return $response;
  263.     }
  264.     /**
  265.      * @Route("/annonces/proposer/ajouter", name="annonces_ajouter")
  266.      * @Route("/annonces/proposer/ajouter/idannonce/{idannonce}", name="annonces_ajouter_idannonce")
  267.      */
  268.     public function action_ajouter($idannonce nullRequest $request)
  269.     {
  270.         $this->context['params']['idannonce'] = $idannonce;
  271.         // classe des annonces
  272.         $annonces $this->em->getRepository(AnnAnnonces::class);
  273.         // classe pour le wiki
  274.         $wiki = new wiki2xhtml();
  275.         // option de Wiki2xhtml
  276.         $wiki->setOpt('active_auto_urls'1);    # Activation de la reconnaissance d'url (inactif)
  277.         $wiki->setOpt('active_autoemails'1);    # Activation de la reconnaissance des emails (inactif)
  278.         $wiki->setOpt('active_pre'0);        # desactivation du <pre>
  279.         //$wiki->setOpt('active_auto_img',0);    # Activation des images automatiques dans les liens []
  280.         //$wiki->setOpt('active_img',0);        # Activation des images (())
  281.         $wiki->setOpt('first_title_level'1);    # Premier niveau de titre <h..>
  282.         // parametre idannonce
  283.         if (array_key_exists('idannonce'$this->context['params']) && is_numeric($this->context['params']['idannonce'])) {
  284.             $idannonce $this->context['params']['idannonce'];
  285.         } elseif (isset($_POST['idannonce']) && is_numeric($_POST['idannonce'])) {
  286.             $idannonce $_POST['idannonce'];
  287.         } else {
  288.             $idannonce null;
  289.         }
  290.         // on le passe a la vue
  291.         $this->view->idannonce $idannonce;
  292.         // on verifie l'authentification sinon > page acces
  293.         if (!$this->getUser() instanceof Extranetusers) {
  294.             if (!empty($idannonce)) {
  295.                 $urifrom '/annonces/proposer/ajouter/idannonce/' $idannonce;
  296.             } else {
  297.                 $urifrom '/annonces/proposer/ajouter/';
  298.             }
  299.             return $this->redirect('/montheatre/connexion?urifrom=' $urifrom '&entete_connexion=annonces');
  300.         }
  301.         // infos sur l'utilisateur
  302.         $user $this->em->getRepository(Extranetusers::class);
  303.         $this->view->email_user $this->getUser()->getEmail();
  304.         $idextranetuser $this->getUser()->getIdextranetuser();
  305.         // pour le fichier associé
  306.         function path_to($basedir$nomfichier$preview true$only_dir false)
  307.         {
  308.             $nomfichier basename($nomfichier);
  309.             if ($preview) {
  310.                 $basedir .= 'preview/';
  311.             }
  312.             $hashdir substr(md5($nomfichier), 02) . '/'/* répertoire de hachage */
  313.             return $basedir $hashdir . ($only_dir '' $nomfichier);
  314.         }
  315.         //chemin des fichiers
  316.         $rep_upload_abs $this->getParameter('app.dir.annonces') . '/';
  317.         $url_upload $this->getParameter('app.dir.upload') . 'annonces/';
  318.         if (!file_exists($rep_upload_abs 'preview/')) {
  319.             @mkdir($rep_upload_abs 'preview/'0775true);
  320.         }
  321.         $formFactory $this->formAddAnnonces();
  322.         // modification
  323.         $nomfichier_old false;
  324.         if (!empty($idannonce)) {
  325.             $request->getSession()->set('accepte_condition''on');
  326.             // selection de l'annonce
  327.             $infos_annonce $annonces->queryRow('SELECT * FROM ' $annonces->__table ' WHERE idannonce=' $idannonce ' AND idextranetuser=' $idextranetuser);
  328.             // si pas trouve
  329.             if (empty($infos_annonce)) {
  330.                 $this->view->error['select_annonce'] = 'ATTENTION ! Une erreur est survenue pendant la s&eacute;lection de votre annonce !';
  331.                 $this->view->erreur_annonce true;
  332.                 // debug
  333.                 //$this->view->error['select_annonce'] = $infos_annonce->getMessage();
  334.             } else {
  335.                 // remplir les champs du form
  336.                 $formFactory->setData($infos_annonce);
  337.                 // pour la vue
  338.                 if (!empty($infos_annonce)) {
  339.                     $this->view->modification true;
  340.                     $this->view->num_annonce $infos_annonce['idannonce'];
  341.                     $this->view->idtypecontrat $infos_annonce['idtypecontrat'];
  342.                 }
  343.                 // precision sur les fichiers
  344.                 if (!empty($infos_annonce['fichier']) && !empty($infos_annonce['typefichier'])
  345.                     && file_exists(path_to($rep_upload_abs$infos_annonce['fichier'], false))) {
  346.                     $this->view->fichier $infos_annonce['fichier'];
  347.                     $this->view->url_fichier path_to($url_upload$infos_annonce['fichier'], false);
  348.                     $this->view->extension $infos_annonce['typefichier'];
  349.                     $nomfichier_old $infos_annonce['fichier'];
  350.                 }
  351.             }
  352.         }
  353.         if (isset($_POST['idcategorie']) && $_POST['idcategorie'] == 3) {
  354.             if (isset($_POST['idtypecontrat']) && $_POST['idtypecontrat'] > 0) {
  355.                 $this->view->idtypecontrat $_POST['idtypecontrat'];
  356.             } else {
  357.                 $this->view->idtypecontrat 50;
  358.             }
  359.         }
  360.         // valider les conditions d'utilisation
  361.         if (isset($_GET['valide_condition'])) {
  362.             $request->getSession()->set('accepte_condition''on');
  363.         }
  364.         // si le user n'a pas accepte les conditions, on les affiches
  365.         if (!$request->getSession()->get('accepte_condition')) {
  366.             $this->view->conditions true;
  367.         }
  368.         // csrf
  369.         $nomfichier false;
  370.         $extension false;
  371.         $nomfichier_final false;
  372.         $extension_final false;
  373.         $inpreview true;
  374.         if (!empty($_POST['nomfichier_final'])) {
  375.             $nomfichier_final $_POST['nomfichier_final'];
  376.             $inpreview preg_match('#^preview/#'$nomfichier_final);
  377.             if (!file_exists(path_to($rep_upload_abs$nomfichier_final$inpreview)))
  378.                 $nomfichier_final false;
  379.             else if (in_array($_POST['extension_final'], array('pdf''jpg')))
  380.                 $extension_final $_POST['extension_final'];
  381.         }
  382.         $preview false;
  383.         if (isset($_POST['preview'])) {
  384.             $preview true;
  385.         }
  386.         //print_r($_REQUEST);
  387.         $form $formFactory->getForm();
  388.         $form->handleRequest($request);
  389.         // validation du formulaire
  390.         if ($form->isSubmitted() && $form->isValid()) {
  391.             // suppression fichier
  392.             if (!empty($_POST['supprimer_fichier'])) {
  393.                 if ($nomfichier_final) {
  394.                     @unlink(path_to($rep_upload_abs$nomfichier_final$inpreview));
  395.                     if ($nomfichier_final == $nomfichier_old) {
  396.                         $nomfichier_old false;
  397.                         unset($this->view->fichier);
  398.                     }
  399.                     $nomfichier_final false;
  400.                 }
  401.             }
  402.             $objfile $form->get('fichier')->getData();
  403.             $error false;
  404.             // upload d'un fichier
  405.             if ($objfile) {
  406.                 // fichier temporaire à scanner
  407.                 $file_scan $objfile->getPathName();
  408.                 // Vérification type mime
  409.                 $mimetype CheckMimeType::checkMimeTypeFinfo($file_scan, array('image/jpeg''image/jpg''image/pjpeg''application/pdf'), falsetrue$this->func);
  410.                 if (!$mimetype) {
  411.                     $error true;
  412.                     $this->view->error['mimetype'] = 'Seuls les fichiers de type JPEG ou PDF sont acceptés.';
  413.                 }
  414.                 // test antivirus
  415.                 if (!$error) {
  416. //            exec(CLAMSCAN.' --quiet '.$file_scan,$out,$test);
  417. //            if ($test==1) {
  418. //                $this->view->error['virus'] = 'Un virus a été détecté dans le fichier que vous avez associé à votre annonce !';
  419. //            } elseif($test>1) {
  420. //                $this->view->error['virus_failer'] = 'Il y a eu un problème pendant l\'analyse antivirus. Merci de nous contacter.';
  421. //            }
  422.                 }
  423.                 // test de la taille
  424.                 if (!$error) {
  425.                     $taille filesize($file_scan);
  426.                     if ($taille $this->taille_maxi) {
  427.                         $error true;
  428.                         $this->view->error['size'] = 'Le fichier que vous souhaitez associer à votre annonce est trop volumineux !';
  429.                     }
  430.                 }
  431.                 if (!$error) {
  432.                     // extensions
  433.                     $extension false;
  434.                     if (in_array($mimetype, array('image/jpeg''image/jpg''image/pjpeg'))) { // penser au type pjpeg
  435.                         $extension 'jpg';
  436.                         $im = @getimagesize($file_scan);
  437.                         if (empty($im)) {
  438.                             $this->view->error['image'] = 'Le fichier que vous souhaitez associer à votre annonce n\'est pas une image valide.';
  439.                         } else {
  440.                             $w $im[0];
  441.                             $h $im[1];
  442.                             $type $im[2];
  443.                             if ($type != IMAGETYPE_JPEG) {
  444.                                 $error true;
  445.                                 $this->view->error['image'] = 'Le fichier que vous souhaitez associer à votre annonce n\'est pas au format JPEG.';
  446.                             } else if ($w || $w 4096 || $h || $h 4096) {
  447.                                 $error true;
  448.                                 $this->view->error['dimensions'] = 'L\'image que vous souhaitez associer a des dimensions surprenantes (' $w 'x' $h ').';
  449.                             }
  450.                         }
  451.                     } elseif (in_array($mimetype, array('application/pdf'))) {
  452.                         $extension 'pdf';
  453.                     }
  454.                 }
  455.                 // si pas d'erreur, fichier dans le rep qui va bien
  456.                 if (!$error && empty($this->view->error) && $extension) {
  457.                     // mettre en forme le nom du fichier
  458.                     do {
  459.                         $nomfichier uniqid('ann-') . '.' $extension;
  460.                         $directory path_to(''$nomfichiertruetrue);
  461.                     } while (file_exists($directory $nomfichier));
  462.                     $rep_upload_abs $this->getParameter('app.dir.annonces') . '/';
  463.                     $abs_directory $rep_upload_abs $directory;
  464.                     if (!file_exists($abs_directory)) {
  465.                         mkdir($abs_directory0775true);
  466.                     }
  467.                     // deplacer
  468.                     if (!$objfile->move($abs_directory$nomfichier)) {
  469.                         $this->view->error['dl'] = 'Il y a eu un problème pendant le téléchargement de votre fichier. Merci de réessayer ou de contacter l\'assistance technique.';
  470.                     } else {
  471.                         // si deja un fichier pour cette annonce, on le supprime
  472.                         if ($nomfichier_final && $inpreview) {
  473.                             @unlink(path_to($rep_upload_abs$nomfichier_final));
  474.                             $nomfichier_final false;
  475.                         }
  476.                     }
  477.                 }
  478.             }
  479.             // url
  480.             $site $form->get('site')->getData();
  481.             if ($site == 'http://') {
  482.                 $site null;
  483.             }
  484.             // renvoyer les infos
  485.             $description $form->get('description')->getData();
  486.             $pays $form->get('pays')->getData();
  487.             $sujet $form->get('sujet')->getData();
  488.             $lieu $form->get('lieu')->getData();
  489.             $cp $form->get('cp')->getData();
  490.             $idcategorie $form->get('idcategorie')->getData();
  491.             if ($form->get('idtypecontrat')->getData() != '') {
  492.                 $idtypecontrat $form->get('idtypecontrat')->getData();
  493.             }
  494.             $adresse $form->get('adresse')->getData();
  495.             // MODE previsualisation
  496.             if ($preview && !$error && empty($this->view->error)) {
  497.                 // renvoyer les infos a la vue
  498.                 $this->view->description $wiki->transform($description);
  499.                 $this->view->pays $annonces->getNameCountry($pays);
  500.                 $this->view->site $site;
  501.                 $this->view->sujet $sujet;
  502.                 $this->view->lieu $lieu;
  503.                 $this->view->adresse $adresse;
  504.                 $this->view->cp $cp;
  505.                 if (isset($idtypecontrat)) {
  506.                     $this->view->idtypecontrat $idtypecontrat;
  507.                 }
  508.                 // categorie
  509.                 $this->view->categorie $this->context['categorie_list'][$idcategorie];
  510.                 if (!empty($idtypecontrat)) {
  511.                     $this->view->typecontrat_txt $this->context['type_contrat'][$idtypecontrat];
  512.                 }
  513.                 // si nouveau fichier, le mettre en champ caché
  514.                 if ($nomfichier && $extension) {
  515.                     $this->view->fichier path_to(''$nomfichier);
  516.                     $this->view->url_fichier path_to($url_upload$nomfichier);
  517.                     $this->view->extension $extension;
  518.                 }
  519.                 // si fichier déjà chargé
  520.                 if ($nomfichier_final && $extension_final) {
  521.                     $this->view->fichier path_to(''$nomfichier_final);
  522.                     $this->view->url_fichier path_to($url_upload$nomfichier_final);
  523.                     $this->view->extension $extension_final;
  524.                 }
  525.                 // afficher la preview avec le bouton de confirmation
  526.                 $this->view->preview true;
  527.             } else if ((!isset($error) || empty($error)) && empty($this->view->error)) {
  528.                 // MODE sauvegarde
  529.                 $fields_values = array('sujet' => $sujet,
  530.                     'site' => $site,
  531.                     'description' => $description,
  532.                     'idcategorie' => $idcategorie,
  533.                     'online' => '0',
  534.                     'valid' => '0',
  535.                     'attente' => '0',
  536.                     'adresse' => $adresse,
  537.                     'lieu' => $lieu,
  538.                     'pays' => $pays,
  539.                     'cp' => $cp,
  540.                     'idextranetuser' => $idextranetuser,
  541.                     'adresse_ip' => $_SERVER['REMOTE_ADDR'] . ' / ' $_SERVER['HTTP_USER_AGENT'],
  542.                     'dateinsert' => $this->now(),
  543.                 );
  544.                 if (isset($idtypecontrat)) {
  545.                     $fields_values['idtypecontrat'] = $idtypecontrat;
  546.                 }
  547.                 $nomfichier_db false;
  548.                 $extension_db false;
  549.                 if ($nomfichier_final && $extension_final) {
  550.                     $nomfichier_db $nomfichier_final;
  551.                     $extension_db $extension_final;
  552.                 }
  553.                 if ($nomfichier && $extension) {
  554.                     $nomfichier_db $nomfichier;
  555.                     $extension_db $extension;
  556.                 }
  557.                 if ($nomfichier_db && $extension_db) {
  558.                     $fields_values['fichier'] = path_to(''$nomfichier_dbfalse);
  559.                     $fields_values['typefichier'] = $extension_db;
  560.                 }
  561.                 $adresse_geocodage $adresse ',' $cp ' ' $lieu ', ' $pays;
  562.                 $ServiceGeocodage = new Geocodage();
  563.                 $geocodage $ServiceGeocodage->getGoogleGeocoding($adresse_geocodage);
  564. //                if (is_array($geocodage)) {
  565.                 $fields_values['x'] = 0;
  566.                 $fields_values['y'] = 0;
  567. //                }
  568.                 // preparer les champs
  569.                 $annonces->setUpdateFields($fields_values);
  570.                 try {
  571.                     $res $annonces->setData($idannoncetrue);
  572.                     // si modification
  573.                     if (!empty($idannonce)) {
  574.                         $this->view->modif true;
  575.                         $this->view->num_annonce $idannonce;
  576.                         // supprimer les éventuelles vignettes
  577.                         if (file_exists($rep_upload_abs 'thumbs/ann-' $idannonce '.jpg')) {
  578.                             @unlink($rep_upload_abs 'thumbs/ann-' $idannonce '.jpg');
  579.                         }
  580.                     } else {
  581.                         //header('Location: /annonces/proposer/ajouter')
  582.                         $this->view->num_annonce $res;
  583.                     }
  584.                     if ($nomfichier_db && $extension_db) {
  585.                         $source path_to($rep_upload_abs$nomfichier_db);
  586.                         $dest path_to($rep_upload_abs$nomfichier_dbfalse);
  587.                         $dir dirname($dest);
  588.                         if (!file_exists($dir)) {
  589.                             @mkdir($dir0775true);
  590.                         }
  591.                         // renomme de preview à definitif
  592.                         @rename($source$dest);
  593.                         //suppression du fichier précédent le cas échéant
  594.                         if ($nomfichier_old) {
  595.                             @unlink(path_to($rep_upload_abs$nomfichier_oldfalse));
  596.                         }
  597.                     }
  598.                     $this->view->result_annonce true;
  599.                     $this->view->preview false;
  600.                 } catch (\Exception $e) {
  601.                     $this->view->err_ann true;
  602.                     $err_insert true;
  603.                     $err['no_insert'] = $e->getMessage();
  604.                     $this->logger->error($e->getMessage());
  605.                     $this->logger->debug($e->getTraceAsString());
  606.                 }
  607.                 // si OK, on ajoute a la newsletter
  608.                 if (!isset($err_insert)) {
  609. //                    $subscribers = $this->em->getRepository(Subscribers::class);
  610. //                    $subscribers->setSubscribe($this->getUser()->getEmail(),'thnet',$pays,'thnet');
  611.                 }
  612.             } // fin du save
  613.         }
  614.         // aide wiki
  615.         $this->view->aide_wiki utf8_encode($wiki->help());
  616.         // titre de la page
  617.         if (empty($idannonce)) {
  618.             $this->title_page 'Proposez votre annonce';
  619.         } else {
  620.             $this->title_page 'Modifier votre annonce';
  621.         }
  622.         // fil d'arianne et menu principal actif
  623.         $locate = array('/annonces/' => 'Petites annonces');
  624.         if (empty($idannonce)) {
  625.             $locate[] = 'Proposez votre annonce';
  626.         } else {
  627.             $locate[] = 'Modifier votre annonce';
  628.         }
  629.         $this->view->locate $locate;
  630.         // style css
  631.         $this->view->style_more = array(
  632.             'annonces',
  633.             array(
  634.                 '/navigation/js/markitup/skins/markitup/style.css',
  635.                 '/navigation/js/markitup/sets/dotclear/style.css'
  636.             )
  637.         );
  638.         $this->view->js_more = array(
  639.             array(
  640.                 //'/navigation/js/markitup/jquery.markitup.pack.js',
  641.                 '/navigation/js/markitup/jquery.markitup.js',
  642.                 '/navigation/js/markitup/sets/dotclear/set.js',
  643.             )
  644.         );
  645.         return $this->view('annonces/ajouter.html.twig', [
  646.             'form' => $form->createView()
  647.         ]);
  648.     }
  649.     private function formAddAnnonces()
  650.     {
  651.         $formFactory $this->get('form.factory')->createNamedBuilder(''FormType::class, null, [
  652.             'allow_extra_fields' => true,
  653.             'attr' => [
  654.                 'id' => 'masterform',
  655.                 'novalidate' => true
  656.             ]
  657.         ]);
  658.         $formFactory->add('site'TextType::class, [
  659.             'label' => 'Site Internet',
  660.             'constraints' => [
  661.                 new Assert\Url([
  662.                     'message' => 'Site Internet : l\'adresse du site semble incorrecte(elle doit commencer par http://)'
  663.                 ]),
  664.                 new CheckWebsite([
  665.                     'message' => 'Site Internet : le site Internet que vous avez précisé ne semble pas disponible ! Vérifiez qu\'il s\'agit bien de la bonne adresse'
  666.                 ])
  667.             ],
  668.             'attr' => [
  669.                 'size' => '45',
  670.                 'id' => 'site'
  671.             ]
  672.         ]);
  673.         $formFactory->add('lieu'TextType::class, [
  674.             'label' => 'Ville / lieu',
  675.             'constraints' => [
  676.                 new NotBlank([
  677.                     'message' => 'Ville / lieu : veuillez préciser la ville et le lieu'
  678.                 ]),
  679.                 new Length([
  680.                     'max' => 60,
  681.                     'maxMessage' => 'Ville / lieu : le nom de la ville ou du lieu ne doit pas faire plus de 60 caractères'
  682.                 ])
  683.             ],
  684.             'attr' => [
  685.                 'size' => '40',
  686.                 'id' => 'lieu'
  687.             ]
  688.         ]);
  689.         $formFactory->add('adresse'TextareaType::class, [
  690.             'label' => 'Adresse postale',
  691.             'required' => false,
  692.             'attr' => [
  693.                 'rows' => '2',
  694.                 'cols' => '60',
  695.                 'id' => 'adresse'
  696.             ]
  697.         ]);
  698.         $formFactory->add('cp'TextType::class, [
  699.             'label' => 'Code postal',
  700.             'constraints' => [
  701.                 new NotBlank([
  702.                     'message' => 'Code postal : veuillez préciser le code postal'
  703.                 ]),
  704.             ],
  705.             'attr' => [
  706.                 'size' => '20',
  707.                 'id' => 'cp'
  708.             ]
  709.         ]);
  710.         $annonces $this->em->getRepository(AnnAnnonces::class);
  711.         $formFactory->add('pays'ChoiceType::class, [
  712.             'label' => 'Pays',
  713.             'choices' => $annonces->getCountryList(),
  714.             'constraints' => [
  715.                 new NotBlank([
  716.                     'message' => 'Pays : veuillez préciser le pays'
  717.                 ]),
  718.                 new Length([
  719.                     'max' => 2,
  720.                     'maxMessage' => 'Pays : veuillez préciser le pays'
  721.                 ])
  722.             ],
  723.             'attr' => ['id' => 'pays']
  724.         ]);
  725.         if (!isset($_POST['preview'])) {
  726.             $formFactory->setData(array('pays' => 'FR'));
  727.         }
  728.         // categories
  729.         $categories $this->em->getRepository(AnnCategories::class);
  730.         $this->context['categorie_list'] = $categorie_list $categories->getCategoriesList();
  731.         $formFactory->add('idcategorie'ChoiceType::class, [
  732.             'label' => 'Catégorie de votre annonce',
  733.             'placeholder' => 'Choisissez dans la liste',
  734.             'choices' => array_flip($categorie_list),
  735.             'constraints' => [
  736.                 new NotBlank([
  737.                     'message' => 'Catégorie : veuillez préciser la catégorie pour votre annonce'
  738.                 ]),
  739.                 new Assert\Type([
  740.                     'type' => 'integer',
  741.                     'message' => 'Catégorie : veuillez préciser la catégorie pour votre annonce'
  742.                 ])
  743.             ],
  744.             'attr' => ['id' => 'idcategorie']
  745.         ]);
  746.         // uniquement pour emploi rému
  747.         $this->context['type_contrat'] = $type_contrat $annonces->getTypesContrat();
  748.         $constraints_idtypecontrat_dynamic = [];
  749.         if (isset($_POST['idtypecontrat'])) {
  750.             $typemessage 'Type de contrat : <strong>pour des raisons légales</strong> vous devez préciser le type de contrat';
  751.             $constraints_idtypecontrat_dynamic = [
  752.                 new NotBlank([
  753.                     'message' => $typemessage
  754.                 ]),
  755.                 new Assert\NotNull([
  756.                     'message' => $typemessage
  757.                 ]),
  758.                 new Assert\Type([
  759.                     'type' => 'integer',
  760.                     'message' => $typemessage
  761.                 ]),
  762.             ];
  763.         }
  764.         $formFactory->add('idtypecontrat'ChoiceType::class, [
  765.             'label' => 'Type de contrat de travail',
  766.             'choices' => array_flip($type_contrat),
  767.             'constraints' => $constraints_idtypecontrat_dynamic,
  768.             'attr' => ['id' => 'idtypecontrat']
  769.         ]);
  770.         $formFactory->add('sujet'TextType::class, [
  771.             'label' => 'Titre de votre annonce (75 signes maximum)',
  772.             'constraints' => [
  773.                 new NotBlank([
  774.                     'message' => 'Titre de votre annonce : veuillez préciser le titre de votre annonce'
  775.                 ]),
  776.                 new Length([
  777.                     'min' => 2,
  778.                     'minMessage' => 'Veuillez saisir au moins deux lettres du nom',
  779.                     'max' => 200,
  780.                     'maxMessage' => 'Titre : le titre de votre annonce ne doit pas faire plus de 200 caractères'
  781.                 ])
  782.             ],
  783.             'attr' => [
  784.                 'size' => '80',
  785.                 'id' => 'sujet'
  786.             ]
  787.         ]);
  788.         $formFactory->add('description'TextareaType::class, [
  789.             'label' => 'Texte de votre annonce',
  790.             'constraints' => [
  791.                 new NotBlank([
  792.                     'message' => 'Texte de votre annonce : veuillez préciser le texte de votre annonce'
  793.                 ]),
  794. //                new Length([
  795. //                    'max' => 60,
  796. //                    'maxMessage' => 'Texte : le texte de votre annonce ne doit pas faire plus de 60 caractères'
  797. //                ])
  798.             ],
  799.             'attr' => [
  800.                 'cols' => '130',
  801.                 'rows' => '20',
  802.                 'class' => 'markitup'
  803.             ]
  804.         ]);
  805.         $formFactory->add('preview'SubmitType::class, [
  806.             'label' => 'Prévisualisez votre annonce',
  807.             'attr' => [
  808.                 'class' => 'boutform',
  809.                 'id' => 'preview'
  810.             ]
  811.         ]);
  812.         //file
  813.         $this->taille_maxi 10 1024 1024// 10 Mo
  814.         $objfile $formFactory->add('fichier'FileType::class, [
  815.             'label' => 'Fichier',
  816.             'data_class' => null,
  817.             'required' => false,
  818.             'constraints' => [
  819.                 new File([
  820.                     'maxSize' => $this->taille_maxi 'k',
  821.                     'maxSizeMessage' => 'Le fichier choisi est trop volumineux (max. 10 Mo)'
  822.                 ])
  823.             ],
  824.             'attr' => [
  825.                 'id' => 'fileupload'
  826.             ]
  827.         ]);
  828.         return $formFactory;
  829.     }
  830.     /**
  831.      * @Route("/annonces/{slug}/", name="annonces_categories")
  832.      */
  833.     public function categories($slug nullRequest $request)
  834.     {
  835.         $this->RouterOptions($slug'categorie'$GLOBALS['rub_courante']);
  836.         $idcategorie $params['idcategorie'] = $this->id;
  837.         $annonces $this->em->getRepository(AnnAnnonces::class);
  838.         // categories
  839.         $categories $this->em->getRepository(AnnCategories::class);
  840.         if (!isset($idcategorie) && array_key_exists('idcategorie'$params)) {
  841.             $idcategorie $params['idcategorie'];
  842.             $this->view->idcategorie $idcategorie;
  843.         }
  844.         // on verifie que le parametre id existe
  845.         if (!isset($idcategorie)) {
  846.             return $this->redirect('/annonces/');
  847.         }
  848.         if ($idcategorie == 3) {
  849.             $this->view->is_emploi true;
  850.         }
  851.         // infos sur la categorie
  852.         $sql_cat 'SELECT name,url_clean FROM ' $categories->__table '
  853.             WHERE idcategorie=' . (int)$idcategorie;
  854.         $cat $categories->queryRow($sql_cat);
  855.         // regions
  856.         $regions $this->em->getRepository(Bigregions::class);
  857.         // classe cleantext
  858.         $ct = new Cleantext($this->em);
  859.         // liste des categories
  860.         $categories_list $categories->getCategoriesList(false);
  861.         // on boucle et on retire la cat en cours
  862.         foreach ($categories_list as $k => $v) {
  863.             if ($k == $cat['url_clean']) {
  864.                 unset($categories_list[$k]);
  865.             } else {
  866.                 $k '/annonces/' $k '/';
  867.                 $categories_list_new[$k] = $v;
  868.             }
  869.         }
  870.         $this->getRechercheAnnonce($request$categories_list_new);
  871.         // nombre de resultat pas page
  872.         $nbpage_array = array('20' => '20''40' => '40''60' => '60''80' => '80');
  873.         if (!empty($cat['name'])) {
  874.             // nom de la categorie
  875.             $this->view->nom_categorie $cat['name'];
  876.             // infos generales
  877.             $this->view->flux_rss_categorie $_ENV['URL_THNET'] . '/annonces/suivre/rss/idcategorie/' $idcategorie;
  878.             $this->view->flux_rss[] = array(
  879.                 'name' => $cat['name'],
  880.                 'url' => $this->view->flux_rss_categorie,
  881.             );
  882.             $nbpagelimit $this->context['formAsideSearch']->get('nbpagelimit')->getData();
  883.             $nbpagelimit 30;
  884.             if (empty($nbpagelimit) && isset($_GET['nbpagelimit'])) {
  885.                 $pagerOptions['perPage'] = $_GET['nbpagelimit'];
  886.                 $nbpagelimit $_GET['nbpagelimit'];
  887.             } else {
  888.                 $pagerOptions['perPage'] = $nbpagelimit;
  889.             }
  890.             if (empty($nbpagelimit) || !array_key_exists($nbpagelimit$nbpage_array)) {
  891.                 $pagerOptions['perPage'] = 20;
  892.             }
  893.             $sql_rec '';
  894.             if (!empty($_REQUEST['cp']) && is_numeric($_REQUEST['cp'])) {
  895.                 //recherche par code postal
  896.                 $cp trim($_REQUEST['cp']);
  897.                 $cplen strlen($cp);
  898.                 if ($cplen >= && $cplen 5) {
  899.                     $sql_rec ' AND LEFT(LTRIM(a.cp),' $cplen ') = \'' $annonces->escape($cp) . '\' ';
  900.                 } else {
  901.                     $sql_rec ' AND a.cp =\'' $annonces->escape($cp) . '\' ';
  902.                 }
  903.             } else if (!empty($_REQUEST['area']) && is_numeric($_REQUEST['area'])) {
  904.                 //recherche par région
  905.                 $area = (int)$_REQUEST['area'];
  906.                 $sql_rec ' AND ' $regions->getZipCode($area'a''cp'null'pays');
  907.             }
  908.             $sql_annonce 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.fichier,a.typefichier,a.lieu,a.cp,e.login,c.url_clean
  909.                     FROM ' $categories->__table ' c, ' $annonces->__table ' a
  910.                         LEFT OUTER JOIN extranetusers e
  911.                         ON a.idextranetuser=e.idextranetuser
  912.                     WHERE c.idcategorie=a.idcategorie
  913.                     AND a.online=1
  914.                     AND a.valid=1
  915.                     AND a.attente=0
  916.                     AND a.idcategorie=' $idcategorie ' ' $sql_rec '
  917.                     ORDER BY a.dateinsert DESC';
  918.             //echo $sql_annonce;
  919.             $sql_count 'SELECT count(idannonce) FROM ' $annonces->__table ' a
  920.                   WHERE a.online=1
  921.                   AND a.valid=1
  922.                   AND a.attente=0
  923.                   AND a.idcategorie=' $idcategorie '  ' $sql_rec;
  924.             // nombre d'enregistrement
  925.             $totalItems $annonces->queryOne($sql_count);
  926.             if (!empty($totalItems) && $totalItems 0) {
  927.                 $pagerOptions['totalItems'] = $totalItems;
  928.                 // pagination
  929.                 $paged_data $this->getPagination($totalItems);
  930.                 //limite
  931.                 $limit $annonces->dbLimit($this->perPage$this->getLimitStart());
  932.                 // executer la requete
  933.                 //$spectacle->query($sql_normal . $sql . $limit);
  934.                 $annonces->query($sql_annonce $limit);
  935.                 $annonces_list = array();
  936.                 $color null;
  937.                 // liste annonces
  938.                 while ($annonces->fetch()) {
  939.                     $idannonce $annonces->idannonce;
  940.                     $ann $annonces->getInfosAnnonceRow();
  941.                     $idannonce $ann['idannonce'];
  942.                     // premiere annonce = updated fil rss
  943.                     if (!isset($updated)) {
  944.                         $this->view->updated $ann['w3t'];
  945.                         $this->view->md5 $ann['md5'];
  946.                         $updated true;
  947.                     }
  948.                     // si fichier jpg, générer une vignette
  949.                     if ($annonces->fichier != '') {
  950.                         $vignette null;
  951.                         if ($annonces->typefichier 'jpg') {
  952.                             $vignette $annonces->getVignetteAnnonce($idannonce, array(), $annonces->fichier);
  953.                             if ($vignette) {
  954.                                 $ann['vignette'] = $vignette;
  955.                                 $ann['vignette_flou'] = $annonces->getVignetteAnnonce($idannonce, array('blur' => true), $annonces->fichier);
  956.                             }
  957.                         }
  958.                     }
  959.                     // titre court et texte iphone
  960.                     $ann['sujet_cut'] = $annonces->cutSentence($ann['sujet'], 30true);
  961.                     $ann['description_courte_cut'] = $annonces->cutSentence($ann['description_courte'], 100true);
  962.                     $annonces_list[$idannonce] = $ann;
  963.                 }
  964.                 // passer les annonces au templates
  965.                 $this->view->annonces $annonces_list;
  966.                 if (isset($paged_data)) {
  967.                     $urlpagination = new asidesUrlPagination(
  968.                         '/annonces/' $cat['url_clean'] . '/generate_params',
  969.                         array(
  970.                             'areac' => (isset($area)) ? $area 'all',
  971.                         ),
  972.                         $this->context
  973.                     );
  974.                     $paged_data['url_custom'] = $urlpagination->url_pagination();
  975.                 }
  976.                 $this->view->pagination $paged_data;
  977.             }
  978.         }
  979.         // titre de la page
  980.         $this->title_page $cat['name'] . ' - Les petites annonces du théâtre et du spectacle';
  981.         // fil d'arianne
  982.         $this->view->locate = array('/annonces/' => 'Les petites annonces',
  983.             '' => $cat['name']);
  984.         // jquery
  985.         $this->view->js_more[] = 'jquery.qtip.min.js';
  986.         //asides
  987.         $asides = new asides();
  988.         $asides->load('annonce_reseau');
  989.         $asides->load(['annonce_barre' => array(
  990.             'exec' => array(
  991.                 'htmlstart' => true
  992.             ),
  993.             'title' => 'Rechercher'
  994.         )]);
  995.         $asides->load(['annonce_categorie' => array(
  996.             'exec' => array(
  997.                 'htmlend' => true
  998.             ),
  999.         )]);
  1000.         //affichage du dernier tweet pour les offres d'emploisé
  1001.         if ($idcategorie == 3) {
  1002.             $asides->load(['common_twitter' => array(
  1003.                 'title_custom' => 'suivre',
  1004.                 'subtitle_custom' => 'Le fil emplois rémunérés',
  1005.                 'url_custom' => 'https://twitter.com/thnet_annonces'
  1006.             )]);
  1007.         }
  1008.         $asides->load('common_publicite');
  1009.         $this->view->aside $asides->view($this->view);
  1010.         $asides_publicite = new asides();
  1011.         asides::setEntityManager($this->em);
  1012.         asides::loadaside('Publicite')->addGoogle($asides_publicite$this->serviceAbonnements);
  1013.         $this->context['view']->asides_publicite $asides_publicite->view($this->view);
  1014.         //On affiche la publicité google
  1015.         $asides_publicite = new asides();
  1016.         asides::loadaside('Publicite')->addGoogleCorrespondantText($asides_publicite$this->serviceAbonnements);
  1017.         $this->context['view']->asides_publicite_footer $asides_publicite->view($this->context['view']);
  1018.         return $this->view('annonces/categorie.html.twig');
  1019.     }
  1020.     // }}}
  1021.     /**
  1022.      * @Route("/annonces/{slug}/{annonce}/", name="annonces_categorie_annonce")
  1023.      */
  1024.     public function annonce($slug null$annonce nullRequest $requestTheatreMail $TheatreMail)
  1025.     {
  1026.         preg_match_all('([0-9]+)'$annonce$matchs);
  1027.         $idannonce end($matchs[0]);
  1028.         $this->RouterOptions($slug'categorie'$GLOBALS['rub_courante']);
  1029.         $idcategorie $params['idcategorie'] = $this->id;
  1030.         // annonces
  1031.         $annonces $this->em->getRepository(AnnAnnonces::class);
  1032.         // categories
  1033.         $categories $this->em->getRepository(AnnCategories::class);
  1034.         // utilisateurs
  1035.         $reponses $this->em->getRepository(AnnReponses::class);
  1036.         // on verifie que le parametre id_ann existe
  1037.         if (isset($idannonce) && is_numeric($idannonce)) {
  1038.             $idannonce $idannonce;
  1039.         } else {
  1040.             return $this->redirect('/error/');
  1041.         }
  1042.         if (isset($_GET['print'])) {
  1043.             $this->view->typeaffichage 'print';
  1044.         } else {
  1045.             $this->view->typeaffichage 'normal';
  1046.             $this->view->use_addthis true;
  1047.         }
  1048.         $wiki = new wiki2xhtml();
  1049.         // option de Wiki2xhtml
  1050.         $wiki->setOpt('active_auto_urls'1);    # Activation de la reconnaissance d'url (inactif)
  1051.         $wiki->setOpt('active_autoemails'1);    # Activation de la reconnaissance des emails (inactif)
  1052.         $wiki->setOpt('active_pre'0);        # desactivation du <pre>
  1053.         $wiki->setOpt('active_auto_img'0);    # Activation des images automatiques dans les liens []
  1054.         $wiki->setOpt('active_img'1);        # Activation des images (())
  1055.         $wiki->setOpt('first_title_level'1);    # Premier niveau de titre <h..>
  1056.         // definition de mesg
  1057.         $mesg = array();
  1058.         $ct = new Cleantext($this->em);
  1059.         // requete aussi pour l'extranetuser
  1060.         $sql_annonce 'SELECT a.*,e.login,e.email as email_extra
  1061.                 FROM ' $annonces->__table ' a
  1062.                     LEFT OUTER JOIN extranetusers e
  1063.                     ON a.idextranetuser=e.idextranetuser
  1064.                 WHERE a.idannonce=' $idannonce;
  1065.         // requete sur l'annonce
  1066.         $annonce $annonces->queryRow($sql_annonce);
  1067.         // pb sql
  1068.         if (empty($annonce)) {
  1069.             $this->view->error['pb'] = 'Il a eu un problème pendant la récupération de l\'annonce';
  1070. //            $this->view->error['pb_suite'] = $annonce->getDebugInfo();
  1071.             $this->view->error_annonce true;
  1072.             $this->view->no_bookmark true;
  1073.         } else {
  1074.             // idextranetuser connecté ?
  1075.             if ($this->getUser() instanceof Extranetusers) {
  1076.                 $idextranetuser $this->getUser()->getIdextranetuser();
  1077.             } else {
  1078.                 $idextranetuser null;
  1079.             }
  1080.             // si l'annonce n'existe pas ou elle est supprimée
  1081.             if (empty($annonce) || $annonce['attente'] == 2) {
  1082.                 $this->view->error['pb'] = 'Cette annonce n\'est plus disponible';
  1083.                 $this->view->error_annonce true;
  1084.                 $this->view->no_bookmark true;
  1085.                 $title_page 'Cette annonce n\'est plus disponible - erreur 404';
  1086.                 header('HTTP/1.0 404 Not Found');
  1087.             } else {
  1088.                 // si l'annonce a plus de 30 jours, on le signale
  1089.                 if (!empty($annonce['dateupdate'])) {
  1090.                     $dateup $annonce['dateupdate'];
  1091.                 } else {
  1092.                     $dateup $annonce['dateinsert'];
  1093.                 }
  1094.                 $datepass date('Y-m-d H:i:s'mktime(date('H'), date('i'), date('s'), date('m'), date('d') - 30date('Y')));
  1095.                 if ($dateup $datepass) {
  1096.                     $this->view->annonce_ancienne true;
  1097.                 }
  1098.                 // voir une réponse en particulier
  1099.                 if (isset($_GET['voir-reponse']) && is_numeric($_GET['voir-reponse'])) {
  1100.                     $idreponse_voir $_GET['voir-reponse'];
  1101.                 } else {
  1102.                     $idreponse_voir null;
  1103.                 }
  1104.                 // droit de modifier ?
  1105.                 if (!empty($annonce['idextranetuser']) && $annonce['attente'] != 2) {
  1106.                     // si c'est l'annonce de l'utilisateur connecté
  1107.                     if ($idextranetuser && $idextranetuser == $annonce['idextranetuser']) {
  1108.                         // on précise donc que c'est la sienne
  1109.                         $is_my true;
  1110.                         $this->view->modif_annonce true;
  1111.                         // si annonce en attente de validation = message
  1112.                         if ($annonce['valid'] == 0) {
  1113.                             $this->view->error['attente_validation'] = '<strong>ATTENTION : cette annonce est en attente de validation.
  1114.                                                     <br />Elle n\'est actuellement visible que par vous lorsque vous êtes connecté à votre espace <i>mon théâtre</i>.</strong>';
  1115.                             $this->view->error_preview true;
  1116.                         }
  1117.                         // checker si il y a des réponses a cette annonce
  1118.                         $annonce_reponses $reponses->getReponses($idannonce);
  1119.                         if (!empty($annonce_reponses)) {
  1120.                             // nombre de réponse
  1121.                             $this->view->nb_reponses count($annonce_reponses);
  1122.                             foreach ($annonce_reponses as $k => $v) {
  1123.                                 if ($v['idreponse'] == $idreponse_voir) {
  1124.                                     $reponsesb $this->em->getRepository(AnnAnnonces::class);
  1125.                                     $info_reponse $reponsesb->getInfosReponse($v['idreponse'], true);
  1126.                                     $annonce_reponses[$k]['reponse'] = $info_reponse['reponse'];
  1127.                                     $annonce_reponses[$k]['voir'] = 'read';
  1128.                                     // marquer comme lue
  1129.                                     $reponsesb->setRead($v['idreponse']);
  1130.                                 } else {
  1131.                                     $annonce_reponses[$k]['voir'] = 'notread';
  1132.                                 }
  1133.                             }
  1134.                             $this->view->annonce_reponses $annonce_reponses;
  1135.                         }
  1136.                         // si l'annonce n'est pas celle du user, verifier quelle est valide et online
  1137.                     } elseif ($annonce['valid'] == || $annonce['online'] == 0) {
  1138.                         $this->view->error['pb'] = 'Cette annonce n\'existe pas ou n\'est plus disponible';
  1139.                         $this->view->error_annonce true;
  1140.                         $this->view->no_bookmark true;
  1141.                         header('HTTP/1.0 404 Not Found');
  1142.                     }
  1143.                     // si ce n'est pas l'annonce du user mais qu'un user est connecté, vérifié si il a une réponse
  1144.                     if ($idextranetuser && $idextranetuser != $annonce['idextranetuser']) {
  1145.                         $reponses_by_user $reponses->getReponsesByUser($idextranetuser$idannonce);
  1146.                         foreach ($reponses_by_user as $k => $v) {
  1147.                             if ($v['idreponse'] == $idreponse_voir) {
  1148.                                 $reponsesb $this->em->getRepository(AnnReponses::class);
  1149.                                 $info_reponse $reponsesb->getInfosReponse($v['idreponse'], true);
  1150.                                 $reponses_by_user[$k]['reponse'] = $info_reponse['reponse'];
  1151.                                 $reponses_by_user[$k]['voir'] = 'read';
  1152.                             }
  1153.                         }
  1154.                         if (!empty($reponses_by_user)) {
  1155.                             $this->view->reponses_by_user $reponses_by_user;
  1156.                         }
  1157.                     }
  1158.                 }
  1159.                 // changer des caracteres speciaux sauter des lignes...
  1160.                 $descrip $wiki->transform($annonce['description']);
  1161.                 $annonce['description'] = $descrip;
  1162.                 // video ?
  1163.                 if (!empty($annonce['video_src'])) {
  1164.                     require_once PATH_LIBS '/HTML/Video_embded.php';
  1165.                     $annonce['video_src'] = videoEmbed::get_video($annonce['video_src']);
  1166.                 }
  1167.                 // type de contrat de travail
  1168.                 if (!empty($annonce['idtypecontrat'])) {
  1169.                     $type_contrat $annonces->getTypesContrat();
  1170.                     $annonce['typecontrat'] = $type_contrat[$annonce['idtypecontrat']];
  1171.                 }
  1172.                 // categorie de l'annonce
  1173.                 $data $categories->get($annonce['idcategorie']);
  1174.                 $annonce['categorie'] = $categories->objToArray();
  1175.                 // url de l'annonce
  1176.                 $annonce['url_clean'] = $annonces->getUrlClean($idannonce$annonce['sujet'], $data['urlClean']);
  1177.                 // pays
  1178.                 $annonce['pays'] = $annonces->getNameCountry($annonce['pays']);
  1179.                 // nom
  1180.                 $annonce['nom'] = $annonce['login'];
  1181.                 // mail
  1182.                 $annonce['email'] = $annonce['email_extra'];
  1183.                 //vignette
  1184.                 // si fichier jpg, générer une vignette
  1185.                 if ($annonce['fichier'] != '') {
  1186.                     $vignette null;
  1187.                     if ($annonce['typefichier'] = 'jpg') {
  1188.                         $vignette $annonces->getVignetteAnnonce($idannonce, array(), $annonce['fichier']);
  1189.                         if ($vignette) {
  1190.                             $annonce['vignette'] = $vignette;
  1191.                             $annonce['vignette_flou'] = $annonces->getVignetteAnnonce($idannonce, array('blur' => true), $annonce['fichier']);
  1192.                         }
  1193.                     }
  1194.                 }
  1195.                 // carte google ?
  1196.                 if ($annonce['x'] != '0.00000000' && $annonce['y'] != '0.00000000') {
  1197.                     $this->view->geocodable true;
  1198.                     $this->view->cartox $annonce['x'];
  1199.                     $this->view->cartoy $annonce['y'];
  1200.                     $this->view->cartoc 11;
  1201.                     // dimension de la carte
  1202.                     $this->view->cartow 360;
  1203.                     $this->view->cartoh 240;
  1204.                     $this->view->google_maps_key Constants::Get('google_maps_key'0);
  1205.                 }
  1206.                 // heure date
  1207.                 $annonce['heureinsert'] = $annonces->getFormeDate($annonce['dateinsert'], 'H:i');
  1208.                 $annonce['dateinsert'] = $annonces->getFormeDate($annonce['dateinsert'], $GLOBALS['format_date']['fr']);
  1209.                 if (!empty($annonce['dateupdate']) && $annonce['dateupdate'] != '0000-00-00 00:00:00') {
  1210.                     $annonce['heureupdate'] = $annonces->getFormeDate($annonce['dateupdate'], 'H:i');
  1211.                     $annonce['dateupdate'] = $annonces->getFormeDate($annonce['dateupdate'], $GLOBALS['format_date']['fr']);
  1212.                 } else {
  1213.                     $annonce['dateupdate'] = false;
  1214.                 }
  1215.                 // fichier
  1216.                 if (!empty($annonce['fichier']) && file_exists($this->getParameter('app.dir.annonces') . $annonce['fichier'])) {
  1217.                     $annonce['url_fichier'] = $_ENV['URL_DIRECTORYUPLOAD'] . 'annonces/' $annonce['fichier'];
  1218.                     // préciser si image
  1219.                     if ($annonce['typefichier'] == 'jpg') {
  1220.                         $annonce['is_image'] = true;
  1221.                     }
  1222.                 }
  1223.                 $this->view->annonce $annonce;
  1224.                 // voir si l'objet est bookmarke
  1225.                 if (!isset($is_my) && $this->getUser() instanceof Extranetusers) {
  1226.                     $bookmark $this->em->getRepository(BookmarkExtranetuser::class);
  1227.                     if ($bookmark->isBookmark($idannonce'ann_annonces'$this->getUser()->getIdextranetuser())) {
  1228.                         $this->view->is_bookmark true;
  1229.                     }
  1230.                 } else {
  1231.                     $this->view->no_bookmark true;
  1232.                 }
  1233.                 // identifiant de l'annonce
  1234.                 $this->view->id $idannonce;
  1235.                 $this->view->mtinfos = array('object' => 'ann_annonces''idobject' => $idannonce'urifrom' => $annonce['url_clean'], 'info_rub' => 'cette annonce');
  1236.                 // action add/delete bookmark
  1237.                 if (isset($_GET['bookmark'])) {
  1238.                     $this->view->bookmark true;
  1239.                     $do_action $_GET['do_action'];
  1240.                     $this->view->$do_action true;
  1241.                 }
  1242.                 /** @todo */
  1243.                 // envoyer a un ami
  1244.                 if (isset($_GET['envoiami'])) {
  1245. //                    require 'envoyer-ami.php';
  1246. //                    $this->view->envoiami = true;
  1247. //                    $this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
  1248. //                        'attr' => [
  1249. //                            'id' => 'masterform'
  1250. //                        ]
  1251. //                    ]);
  1252. //                    $this->context['form'] = $this->context['formFactory']->getForm();
  1253. //                    $this->context['form']->handleRequest($request);
  1254.                 }
  1255.                 // contacter l'annonceur
  1256.                 if (isset($_GET['contact'])) {
  1257. //                    require 'contact-annonce.php';
  1258.                     $this->getFormulaireContacterAnnonceur($request$TheatreMail);
  1259.                     $this->view->contact true;
  1260.                 }
  1261.                 // signaler
  1262.                 if (isset($_GET['signaler'])) {
  1263.                     $this->getFormulaireSignalement($request$TheatreMail);
  1264.                     $this->view->signaler true;
  1265.                 }
  1266.                 // titre de la page
  1267.                 $title_page $annonce['sujet'];
  1268.                 // ajouter title_page
  1269.                 if (isset($this->view->contact)) {
  1270.                     $title_page .= ' - Contactez l\'annonceur';
  1271.                 }
  1272.                 // fil d'arianne
  1273.                 $this->view->locate = array('/annonces/' => 'Les petites annonces',
  1274.                     '/annonces/' $data['urlClean'] . '/' => $data['name'],
  1275.                     '' => $annonce['sujet']
  1276.                 );
  1277.                 // pour bookmarking.inc.html
  1278.                 $this->view->fem 'e';
  1279.             }
  1280.         } // fin recup annonce
  1281.         // liste des categories
  1282.         $categories $this->em->getRepository(AnnCategories::class);
  1283.         $categories_list $categories->getCategoriesList(false);
  1284.         $this->getRechercheAnnonce(null$categories_list);
  1285. //        $elements['idcategorie'] = new HTML_Template_Flexy_Element;
  1286. //        $elements['idcategorie']->setOptions($categories_list);
  1287. //        $elements['idcategorie']->setOptions(array('0'=> html_entity_decode('Dans la catégorie...')));
  1288. //        $elements['idcategorie']->setValue('0');
  1289.         $asides = new asides();
  1290.         $asides->load('annonce_thumbnail');
  1291.         $asides->load('ajoutez_MT.inc');
  1292.         $asides->load('annonce_reseau');
  1293.         $asides->load(['annonce_barre' => array(
  1294.             'exec' => array(
  1295.                 'htmlstart' => true
  1296.             ),
  1297.             'title' => 'Rechercher'
  1298.         )]);
  1299.         $asides->load(['annonce_categorie' => array(
  1300.             'exec' => array(
  1301.                 'htmlend' => true
  1302.             ),
  1303.         )]);
  1304.         $asides->load('common_publicite');
  1305.         $this->context['view']->aside $asides->view($this->view);
  1306.         $asides_publicite = new asides();
  1307.         asides::setEntityManager($this->em);
  1308.         asides::loadaside('Publicite')->addGoogle($asides_publicite$this->serviceAbonnements);
  1309.         $this->context['view']->asides_publicite $asides_publicite->view($this->view);
  1310.         // style css et js
  1311.         $this->view->style_more[] = 'annonces';
  1312.         $this->view->js_more[] = 'jquery.qtip.min.js';
  1313.         return $this->view('annonces/annonce.html.twig');
  1314.     }
  1315.     /**
  1316.      * @Route("/annonces/outils/recherche", name="annonces_outils_recherche")
  1317.      */
  1318.     public function action_outils_recherche(Request $requestEntityManagerInterface $em)
  1319.     {
  1320.         // annonces
  1321.         $annonces $this->em->getRepository(AnnAnnonces::class);
  1322.         // categories
  1323.         $categories $this->em->getRepository(AnnCategories::class);
  1324.         // liste des categories
  1325.         $categories_list $categories->getCategoriesList(true);
  1326.         $categories_list[0] = 'Liste des catégories';
  1327.         ksort($categories_list);
  1328.         // formualire de recherche
  1329.         $this->getRechercheAnnonce($request$categories_list);
  1330.         // si le formulaire est validé on insere l'enregistrement
  1331.         if ($this->context['formAsideSearch']->isSubmitted() || isset($_GET['page']) || isset($area)) {
  1332.             $regions $em->getRepository(Bigregions::class);
  1333.             // recuperation de variable mot clés
  1334.             $keywords $this->context['formAsideSearch']->get('keywords_annonces')->getData();
  1335.             if (empty($keywords) && isset($_GET['keywords_annonces'])) {
  1336.                 $keywords $_GET['keywords_annonces'];
  1337.             }
  1338.             // pour la vue
  1339.             if (!empty($keywords)) {
  1340.                 $this->view->keywords $keywords;
  1341.             }
  1342.             $idcategorie $this->context['formAsideSearch']->get('idcategorie')->getData();
  1343.             if (empty($idcategorie) && isset($_GET['idcategorie'])) {
  1344.                 $idcategorie $_GET['idcategorie'];
  1345.             }
  1346.             // date debut
  1347.             $datestart $this->context['formAsideSearch']->get('datestart')->getData();
  1348.             if (empty($datestart) && isset($_GET['datestart'])) {
  1349.                 $datestart $_GET['datestart'];
  1350.             }
  1351.             // pour la vue
  1352.             if (!empty($datestart)) {
  1353.                 $this->view->datestart $annonces->getFormeDate($datestart$GLOBALS['format_date']['fr']);
  1354.             }
  1355.             // date fin
  1356.             $dateend $this->context['formAsideSearch']->get('dateend')->getData();
  1357.             if (empty($dateend) && isset($_GET['dateend'])) {
  1358.                 $dateend $_GET['dateend'];
  1359.             }
  1360.             // pour la vue
  1361.             if (!empty($dateend)) {
  1362.                 $this->view->dateend $annonces->getFormeDate($dateend$GLOBALS['format_date']['fr']);
  1363.             }
  1364.             // region
  1365.             if (!isset($area)) {
  1366.                 $area $this->context['formAsideSearch']->get('area')->getData();
  1367.             }
  1368.             if (empty($area) && isset($_GET['area'])) {
  1369.                 $area $_GET['area'];
  1370.             }
  1371.             // pour la vue
  1372.             if (!empty($area)) {
  1373.                 $this->view->area $regions->getRegionName($area);
  1374.             }
  1375.             // code postal
  1376.             $cp $this->context['formAsideSearch']->get('cp')->getData();
  1377.             if (empty($cp) && isset($_GET['cp'])) {
  1378.                 $cp trim($_GET['cp']);
  1379.             }
  1380.             // pour la vue
  1381.             if (!empty($cp)) {
  1382.                 $this->view->cp $cp;
  1383.             }
  1384.             // ordre de tri
  1385.             $tri $this->context['formAsideSearch']->get('tri')->getData();
  1386.             if (empty($tri) && isset($_GET['tri'])) {
  1387.                 $tri $_GET['tri'];
  1388.             }
  1389.             if (empty($tri)) {
  1390.                 $tri 'dateinsert';
  1391.             }
  1392.             // pour la vue
  1393.             if (!empty($tri)) {
  1394.                 $this->view->tri $tri;
  1395.             }
  1396.             // nombre de résultats par page
  1397.             $nbpagelimit $this->context['formAsideSearch']->get('nbpagelimit')->getData();
  1398.             if (empty($nbpagelimit) && isset($_GET['nbpagelimit'])) {
  1399.                 $nbpagelimit $_GET['nbpagelimit'];
  1400.                 $pagerOptions['perPage'] = $nbpagelimit;
  1401.             } else {
  1402.                 $pagerOptions['perPage'] = $nbpagelimit;
  1403.             }
  1404.             $nbpage_array = array('20' => '20''40' => '40''60' => '60''80' => '80');
  1405.             // si pas dans le maxi/mini
  1406.             if (empty($nbpagelimit) || !array_key_exists($nbpagelimit$nbpage_array)) {
  1407.                 $pagerOptions['perPage'] = 20;
  1408.             }
  1409.             // requete normale
  1410.             $sql_normal 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.lieu,a.cp,c.idcategorie,c.url_clean,e.login';
  1411.             // compter les resultats
  1412.             $sql_count 'SELECT COUNT(DISTINCT(a.idannonce)';
  1413.             // init var
  1414.             $sql null;
  1415.             // recherche
  1416.             if (isset($_REQUEST['description']) && $_REQUEST['description'] == 1) {
  1417.                 $fields 'a.sujet,a.description';
  1418.             } else {
  1419.                 $fields 'a.sujet';
  1420.             }
  1421.             // si mots clés
  1422.             if (!empty($keywords)) {
  1423.                 $keywords htmlspecialchars($keywordsENT_COMPAT);
  1424.                 $keywords trim($keywords);
  1425.                 $sql_normal .= ', MATCH(' $fields ') AGAINST (\'' $annonces->escape($keywords) . '\') AS cpt';
  1426.                 $sql_count .= ', MATCH(' $fields ') AGAINST (\'' $annonces->escape($keywords) . '\')';
  1427.             }
  1428.             // sql count suite
  1429.             $sql_count .= ') as total ';
  1430.             // from
  1431.             $sql .= ' FROM ' $annonces->__table ' a
  1432.                 INNER JOIN ' $categories->__table ' c ON a.idcategorie=c.idcategorie
  1433.                 LEFT OUTER JOIN extranetusers e ON a.idextranetuser=e.idextranetuser';
  1434.             // conditions
  1435.             $sql .= ' WHERE a.online=1 AND a.valid=1 AND a.attente=0';
  1436.             // recherche dans une catégorie
  1437.             if (!empty($idcategorie)) {
  1438.                 $sql .= ' AND a.idcategorie=' $idcategorie;
  1439.             }
  1440.             // on match directement
  1441.             if (!empty($keywords)) {
  1442.                 $sql .= ' AND MATCH(' $fields ') AGAINST (\'' $annonces->escape($keywords) . '\' IN BOOLEAN MODE) ';
  1443.             }
  1444.             // recherche par code postal ???
  1445.             if (!empty($cp) && is_numeric($cp)) {
  1446.                 $cplen strlen($cp);
  1447.                 if ($cplen >= && $cplen 5) {
  1448.                     $sql .= ' AND LEFT(LTRIM(a.cp),' $cplen ') = \'' $annonces->escape($cp) . '\' ';
  1449.                 } else {
  1450.                     $sql .= ' AND a.cp =\'' $annonces->escape($cp) . '\' ';
  1451.                 }
  1452.             } elseif (!empty($area) && is_numeric($area)) {
  1453.                 // recherche par region (retouver les départements)
  1454.                 $sql .= ' AND ' $regions->getZipCode($area'a''cp'null'pays');
  1455.             }
  1456.             // recherche avec la date
  1457.             if (!empty($datestart)) {
  1458.                 $tabdatestart explode('/'$datestart);
  1459.                 $start_year = (int)$tabdatestart[2];
  1460.                 $start_month = (int)$tabdatestart[1];
  1461.                 $start_day = (int)$tabdatestart[0];
  1462.                 if (checkdate((int)$start_month, (int)$start_day, (int)$start_year)) $datestart $start_year '-' $start_month '-' $start_day;
  1463.             }
  1464.             if (!empty($dateend)) {
  1465.                 $tabdateend explode('/'$dateend);
  1466.                 $end_year = (int)$tabdateend[2];
  1467.                 $end_month = (int)$tabdateend[1];
  1468.                 $end_day = (int)$tabdateend[0];
  1469.                 if (checkdate((int)$end_month, (int)$end_day, (int)$end_year)) $dateend $end_year '-' $end_month '-' $end_day;
  1470.             }
  1471.             // recherche par date
  1472.             if (!empty($datestart) && !empty($dateend)) {
  1473.                 // remettre en timestamp
  1474.                 $sql .= ' AND (a.dateinsert BETWEEN (\'' $datestart '\') AND (\'' $dateend '\'))';
  1475.             }
  1476.             // ordre de tri
  1477.             if (!empty($tri)) {
  1478.                 if ($tri == 'titre') {
  1479.                     $sql_order ' ORDER BY a.sujet,cpt';
  1480.                 }
  1481.                 if ($tri == 'dateinsert') {
  1482.                     $sql_order ' ORDER BY a.dateinsert DESC';
  1483.                 }
  1484.                 if ($tri == 'localisation') {
  1485.                     $sql_order ' ORDER BY a.cp,ctp';
  1486.                 }
  1487.                 if ($tri == 'pertinence') {
  1488.                     $sql_order ' ORDER BY cpt';
  1489.                 }
  1490.             }
  1491.             //echo $sql_count.$sql;
  1492.             // nombre d'enregistrement
  1493.             $totalItems $annonces->queryOne($sql_count $sql);
  1494.             if (!empty($totalItems) && $totalItems 0) {
  1495.                 // tpl
  1496.                 $this->view->result true;
  1497.                 $pagerOptions['totalItems'] = $totalItems;
  1498.                 $this->perPage 20;
  1499.                 // pagination
  1500.                 $this->view->pagination $this->getPagination($totalItems);
  1501.                 //limite
  1502.                 $limit $annonces->dbLimit($this->perPage$this->getLimitStart());
  1503.                 // executer la requete
  1504.                 //echo $sql_normal.$sql.$sql_order.$limit; // debug
  1505.                 $annonces->query($sql_normal $sql $sql_order $limit);
  1506.                 $annonces_list = array();
  1507.                 $color null;
  1508.                 // liste annonces
  1509.                 while ($annonces->fetch()) {
  1510.                     $ann $annonces->getInfosAnnonceRow();
  1511.                     $idannonce $ann['idannonce'];
  1512.                     $annonces_list[$idannonce] = $ann;
  1513.                 }
  1514.                 // passer les annonces au templates
  1515.                 $this->view->annonces $annonces_list;
  1516.                 // liens du pager
  1517. //                $paged_data['links'] = str_replace('annonces/recherche/index.php', '', $paged_data['links']);
  1518.             }
  1519.         }
  1520.         // titre de la page
  1521.         $title_page 'Rechercher une annonce - Les petites annonces du théâtre et du spectacle';
  1522.         // fil d'arianne
  1523.         $this->view->locate = array('/annonces/' => 'Les petites annonces',
  1524.             '' => 'Rechercher des annonces');
  1525.         $this->rub_courante 'annonces';
  1526.         // style css
  1527.         $this->view->style_more = array('rubrique''annonces');
  1528.         // jquery
  1529.         $this->view->jquery_cal 'datepicker';
  1530.         $asides = new asides();
  1531.         $asides->load('annonce_reseau');
  1532.         $asides->load('annonce_aside');
  1533.         $this->view->aside $asides->view($this->view);
  1534.         return $this->view('annonces/recherche.html.twig');
  1535.     }
  1536.     private function getFormulaireContacterAnnonceur($request null$TheatreMail)
  1537.     {
  1538.         $annonce $this->view->annonce;
  1539.         $this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
  1540.             'attr' => [
  1541.                 'id' => 'masterform'
  1542.             ]
  1543.         ]);
  1544.         // formulaire pour contacter un annonceur
  1545.         $this->context['formFactory']->add('contact_nom'TextType::class, [
  1546.             'label' => 'Votre nom',
  1547.             'attr' => [
  1548.                 'size' => '30',
  1549.                 'id' => 'contact_nom'
  1550.             ],
  1551.             'constraints' => [
  1552.                 new NotBlank([
  1553.                     'message' => 'Votre nom : veuillez préciser votre nom'
  1554.                 ]),
  1555.                 new Length([
  1556.                     'max' => 60,
  1557.                     'maxMessage' => 'Votre nom : votre nom ne doit pas faire plus de 60 caractères',
  1558.                 ])
  1559.             ],
  1560.         ]);
  1561.         $this->context['formFactory']->add('contact_email'TextType::class, [
  1562.             'label' => 'Votre adresse de courriel',
  1563.             'attr' => [
  1564.                 'size' => '40',
  1565.                 'id' => 'contact_email'
  1566.             ],
  1567. //            Votre adresse de courriel : votre adresse de courriel semble incorrect
  1568.             'constraints' => [
  1569.                 new NotBlank([
  1570.                     'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
  1571.                 ]),
  1572.                 new Email([
  1573.                     'message' => 'Votre adresse de courriel : votre adresse de courriel semble incorrect'
  1574.                 ])
  1575.             ],
  1576.         ]);
  1577.         $this->context['formFactory']->add('contact_message'TextareaType::class, [
  1578.             'label' => 'Votre message',
  1579.             'attr' => [
  1580.                 'cols' => '95',
  1581.                 'rows' => '20',
  1582.                 'id' => 'contact_message'
  1583.             ],
  1584.             'constraints' => [
  1585.                 new NotBlank([
  1586.                     'message' => 'Votre message : veuillez préciser le texte de votre message'
  1587.                 ])
  1588.             ],
  1589.         ]);
  1590.         $this->context['formFactory']->add('contact_validation'SubmitType::class, [
  1591.             'label' => utf8_encode(html_entity_decode('Envoyez votre message')),
  1592.             'attr' => [
  1593.                 'class' => 'boutform'
  1594.             ]
  1595.         ]);
  1596.         $this->context['formFactory']->add('copie_message'CheckboxType::class, [
  1597.             'label' => 'M\'envoyer une copie de ma réponse par courriel',
  1598.             'required' => false,
  1599.             'attr' => [
  1600.                 'class' => 'checkbox'
  1601.             ]
  1602.         ]);
  1603.         // captcha
  1604.         if (!$this->getUser() instanceof Extranetusers) {
  1605.             $this->context['formFactory']->add('recaptcha'RecaptchaType::class, [
  1606.                 'mapped' => false,
  1607.                 'empty_data' => '1',
  1608.                 'constraints' => [
  1609.                     new Recaptcha([
  1610.                         'request' => $request
  1611.                     ])
  1612.                 ]
  1613.             ]);
  1614.         } else {
  1615.             // Suite à un soucis d'affichage (nom des balises visibles) la valeur du label est incorporée directement dans la vue : templates/annonces/contact-annonce.html.twig ligne 42
  1616. //            $copie_message_extranetuser_value = 'Enregistrer ma réponse dans mon compte <em>mon théâtre</em> <a href="/montheatre/">' . $this->getUser()->getLogin() . '</a>';
  1617.             $this->context['formFactory']->add('copie_message_extranetuser'CheckboxType::class, [
  1618. //                'label' => $copie_message_extranetuser_value,
  1619.                 'attr' => [
  1620.                     'checked' => 'checked',
  1621.                     'class' => 'checkbox'
  1622.                 ]
  1623.             ]);
  1624.             $this->context['view']->infos_user $this->getUser();
  1625.         }
  1626.         $this->context['form'] = $this->context['formFactory']->getForm();
  1627.         $this->context['form']->handleRequest($request);
  1628.         if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
  1629.             // email de la réponse
  1630.             $contact_email $this->context['form']->get('contact_email')->getData();
  1631.             $contact_nom $this->context['form']->get('contact_nom')->getData();
  1632.             $contact_message $this->context['form']->get('contact_message')->getData();
  1633.             // envoi du message
  1634.             $TheatreMail->setDestinataire($annonce['email']); // destinataire
  1635.             $TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
  1636.             $TheatreMail->setReplyTo($contact_email); // répondre à
  1637.             $TheatreMail->setSubject('Réponse à votre annonce ' $annonce['idannonce'] . ' sur theatre-contemporain.net');
  1638.             $params_tr = array(
  1639.                 'num_annonce' => $annonce['idannonce'],
  1640.                 'sujet_annonce' => $annonce['sujet'],
  1641.                 'lien_annonce' => $GLOBALS['url_module'] . $annonce['url_clean'],
  1642.                 'contact_nom' => $contact_nom,
  1643.                 'contact_email' => $contact_email,
  1644.                 'contact_message' => $contact_message,
  1645.             );
  1646.             $TheatreMail->prepare('emails/message_contact_annonce.html.twig'$params_tr);
  1647.             try {
  1648.                 $TheatreMail->send();
  1649.                 $this->view->reponse['ok'] = 'Votre message a bien été envoyé à l\'annonceur.';
  1650.                 $this->context['view']->contact_ok true;
  1651.             } catch (\Exception $e) {
  1652.                 $this->logger->error($e->getMessage());
  1653.                 $this->logger->debug($e->getTraceAsString());
  1654.                 $this->view->error['no'] = $this->context['tr']->trans('error_generique_sendmessage');
  1655.             }
  1656.             // si demandé, envoi d'une copie du message par mail au lecteur/répondeur
  1657.             $copie_message $this->context['form']->get('copie_message')->getData();
  1658.             if ($copie_message == 1) {
  1659.                 $TheatreMail->setDestinataire($contact_email); // destinataire
  1660.                 $TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
  1661.                 $TheatreMail->setReplyTo($contact_email); // répondre à
  1662.                 $TheatreMail->setSubject('Votre réponse à l\'annonce ' $annonce['idannonce'] . ' sur theatre-contemporain.net');
  1663.                 $params_tr = array(
  1664.                     'num_annonce' => $annonce['idannonce'],
  1665.                     'sujet_annonce' => $annonce['sujet'],
  1666.                     'lien_annonce' => $GLOBALS['url_module'] . $annonce['url_clean'],
  1667.                     'contact_nom' => $contact_nom,
  1668.                     'contact_email' => $contact_email,
  1669.                     'contact_message' => $contact_message
  1670.                 );
  1671.                 $TheatreMail->prepare('emails/message_contact_annonce_copie.html.twig'$params_tr);
  1672.                 try {
  1673.                     $TheatreMail->send();
  1674.                     $this->view->reponse['ok_copie'] = 'Une copie de votre réponse vous a été envoyée.';
  1675.                 } catch (\Exception $e) {
  1676.                     $this->logger->error($e->getMessage());
  1677.                     $this->logger->debug($e->getTraceAsString());
  1678.                     $this->view->error['no_copie'] = $this->context['tr']->trans('error_generique_sendmessage');
  1679.                 }
  1680.             }
  1681.             // enregistrement de la réponse demandée par l'annonceur ou par l'extranetuser
  1682.             $copie_message_extranetuser 0;
  1683.             if ($this->context['form']->has('copie_message_extranetuser')) {
  1684.                 $copie_message_extranetuser $this->context['form']->get('copie_message_extranetuser')->getData();
  1685.             }
  1686.             // uniquement si l'annonceur à le choix d'enregistrer les réponses !
  1687.             if ($annonce['copie_reponse'] == || !empty($copie_message_extranetuser)) {
  1688.                 $ann_reponses $this->em->getRepository(AnnReponses::class);
  1689.                 // reponse
  1690.                 $reponse_values = array(
  1691.                     'sujet_annonce' => $annonce['sujet'],
  1692.                     'reponse' => $contact_message,
  1693.                     'idannonce' => $annonce['idannonce'],
  1694.                     'annonceur_view' => $annonce['copie_reponse'],
  1695.                     'lecteur_nom' => $contact_nom,
  1696.                     'lecteur_email' => $contact_email,
  1697.                 );
  1698.                 // enregistrer le lecteur si c'est un extranetuser
  1699.                 if ($this->getUser() instanceof Extranetusers) {
  1700.                     $reponse_values['idextranetuser'] = $this->getUser()->getIdextranetuser();
  1701.                     // le lecteur veux voir sa réponse
  1702.                     if ($copie_message_extranetuser) {
  1703.                         $reponse_values['lecteur_view'] = $copie_message_extranetuser;
  1704.                     }
  1705.                 }
  1706.                 $ann_reponses->saveReponse($reponse_values);
  1707.                 // TODO : envoyer un mail à technique@ si erreur
  1708.             }
  1709.         } else {
  1710.             if ($this->getUser() instanceof Extranetusers) {
  1711.                 $this->context['form']->get('contact_email')->setData($this->getUser()->getEmail());
  1712.                 $this->context['form']->get('contact_nom')->setData($this->getUser()->getFirstname() . ' ' $this->getUser()->getLastname());
  1713.             }
  1714.         }
  1715.         //On envoie à la vue, le formulaire.
  1716.         $this->context['view']->form_contact_annonceur $this->context['form']->createView();
  1717.     }
  1718.     private function getFormulaireSignalement($request null$TheatreMail null)
  1719.     {
  1720.         $this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
  1721.             'attr' => [
  1722.                 'id' => 'masterform'
  1723.             ]
  1724.         ]);
  1725.         // formulaire pour signaler un pb
  1726.         $this->context['formFactory']->add('signaler_nom'TextType::class, [
  1727.             'label' => 'Votre nom',
  1728.             'attr' => [
  1729.                 'size' => '30'
  1730.             ],
  1731.             'constraints' => [
  1732.                 new NotBlank([
  1733.                     'message' => 'Votre nom : veuillez préciser votre nom'
  1734.                 ]),
  1735.                 new Length([
  1736.                     'max' => 60,
  1737.                     'maxMessage' => 'Votre nom : votre nom ne doit pas faire plus de 60 caractères',
  1738.                 ])
  1739.             ],
  1740.         ]);
  1741.         $this->context['formFactory']->add('signaler_email'TextType::class, [
  1742.             'label' => 'Votre adresse de courriel',
  1743.             'attr' => [
  1744.                 'size' => '40'
  1745.             ],
  1746.             'constraints' => [
  1747.                 new NotBlank([
  1748.                     'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
  1749.                 ]),
  1750.                 new Email([
  1751.                     'message' => 'Votre adresse de courriel : votre adresse de courriel semble incorrect'
  1752.                 ])
  1753.             ]
  1754.         ]);
  1755.         $this->context['formFactory']->add('signaler_message'TextareaType::class, [
  1756.             'label' => 'Motif du signalement',
  1757.             'attr' => [
  1758.                 'cols' => '110',
  1759.                 'rows' => '20'
  1760.             ],
  1761.             'constraints' => [
  1762.                 new NotBlank([
  1763.                     'message' => 'Motif : merci de préciser la raison de ce signalement'
  1764.                 ]),
  1765.             ]
  1766.         ]);
  1767.         $this->context['formFactory']->add('signaler_validation'SubmitType::class, [
  1768.             'label' => utf8_encode(html_entity_decode('Envoyez votre message')),
  1769.             'attr' => [
  1770.                 'class' => 'boutform'
  1771.             ]
  1772.         ]);
  1773.         // captcha si pas loggué
  1774.         if (!$this->getUser() instanceof Extranetusers) {
  1775.             if ($this->getParameter('captcha_active')) {
  1776.                 $this->context['formFactory']->add('recaptcha'RecaptchaType::class, [
  1777.                     'mapped' => false,
  1778.                     'empty_data' => '1',
  1779.                     'constraints' => [
  1780.                         new Recaptcha([
  1781.                             'request' => $request
  1782.                         ])
  1783.                     ]
  1784.                 ]);
  1785.             }
  1786.         }
  1787.         $this->context['form'] = $this->context['formFactory']->getForm();
  1788.         $this->context['form']->handleRequest($request);
  1789.         if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
  1790.             // supprimer les tags html
  1791.             $signaler_nom $this->context['form']->get('signaler_nom')->getData();
  1792.             $signaler_message $this->context['form']->get('signaler_message')->getData();
  1793.             $signaler_email $this->context['form']->get('signaler_email')->getData();
  1794.             // envoi du message
  1795.             $TheatreMail->setDestinataire($_ENV['CONTACT_MAIL']); // destinataire
  1796.             $TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
  1797.             $TheatreMail->setReplyTo($signaler_email); // répondre à
  1798.             $TheatreMail->setSubject('Annonce signalée sur theatre-contemporain.net');
  1799.             $params_tr = array(
  1800.                 'lien_annonce' => $GLOBALS['url_module'] . $this->view->annonce['url_clean'],
  1801.                 'signaler_nom' => $signaler_nom,
  1802.                 'signaler_email' => $signaler_email,
  1803.                 'signaler_message' => $signaler_message
  1804.             );
  1805.             $TheatreMail->prepare('emails/message_signaler_annonce.html.twig'$params_tr'emails/message_signaler_annonce.txt.twig');
  1806.             try {
  1807.                 $TheatreMail->send();
  1808.                 $this->view->reponse['ok'] = 'Votre message a bien été envoyé.';
  1809.                 $this->context['view']->signaler_ok true;
  1810.             } catch (\Exception $e) {
  1811.                 $this->logger->error($e->getMessage());
  1812.                 $this->logger->debug($e->getTraceAsString());
  1813.                 $this->view->error['no'] = $this->context['tr']->trans('error_generique_sendmessage');
  1814.             }
  1815.         }
  1816.         //On envoie à la vue, le formulaire.
  1817.         $this->context['view']->form $this->context['form']->createView();
  1818.     }
  1819.     public function getRechercheAnnonce($request null$categories_list = [])
  1820.     {
  1821.         $regions $this->em->getRepository(Bigregions::class);
  1822.         $formAsideSearch $this->get('form.factory')->createNamedBuilder(''FormType::class);
  1823.         // element de recherche
  1824.         // formulaire de saisie
  1825.         $formAsideSearch->add('keywords_annonces'TextType::class, [
  1826.             'label' => 'Mots clés',
  1827.             'required' => false,
  1828.             'attr' => [
  1829.                 'size' => '35',
  1830.                 'id' => 'keywords_annonces'
  1831.             ]
  1832.         ]);
  1833.         $formAsideSearch->add('idcategorie'ChoiceType::class, [
  1834.             'label' => 'Catégorie',
  1835.             'placeholder' => 'Liste des catégories',
  1836.             'choices' => array_flip($categories_list),
  1837.             'required' => false,
  1838.             'attr' => [
  1839.                 'id' => 'idcategorie'
  1840.             ]
  1841.         ]);
  1842.         $formAsideSearch->add('datestart'TextType::class, [
  1843.             'label' => 'Entre',
  1844.             'required' => false,
  1845.             'attr' => [
  1846.                 'size' => '10',
  1847.                 'id' => 'datestart',
  1848.                 'placeholder' => 'Début'
  1849.             ]
  1850.         ]);
  1851.         $formAsideSearch->add('dateend'TextType::class, [
  1852.             'label' => 'et',
  1853.             'required' => false,
  1854.             'attr' => [
  1855.                 'size' => '10',
  1856.                 'id' => 'dateend',
  1857.                 'placeholder' => 'Fin'
  1858.             ]
  1859.         ]);
  1860.         $formAsideSearch->add('area'ChoiceType::class, [
  1861.             'label' => 'R&eacute;gion',
  1862.             'placeholder' => 'par région',
  1863.             'required' => false,
  1864.             'choices' => array_flip($regions->getArea()),
  1865.             'attr' => [
  1866.                 'class' => 'select_language',
  1867.                 'id' => 'area'
  1868.             ]
  1869.         ]);
  1870.         $formAsideSearch->add('cp'TextType::class, [
  1871.             'label' => 'Code postal',
  1872.             'required' => false,
  1873.             'attr' => [
  1874.                 'size' => 10,
  1875.                 'id' => 'cp'
  1876.             ]
  1877.         ]);
  1878.         $formAsideSearch->add('validation'SubmitType::class, [
  1879.             'label' => 'Recherche',
  1880.             'attr' => [
  1881.                 'class' => 'boutform'
  1882.             ]
  1883.         ]);
  1884.         // nombre de resultat pas page
  1885.         $nbpage_array = array('20' => '20''40' => '40''60' => '60''80' => '80');
  1886.         $formAsideSearch->add('nbpagelimit'ChoiceType::class, [
  1887.             'label' => 'R&eacute;sultats par page',
  1888.             'choices' => $nbpage_array
  1889.         ]);
  1890.         // criteres de tri
  1891.         $tri_array = array(
  1892.             'dateinsert' => 'Date de publication',
  1893.             'titre' => 'Titre',
  1894.             'cp' => 'Code postal');
  1895.         $formAsideSearch->add('tri'ChoiceType::class, [
  1896.             'label' => 'Trier par',
  1897.             'required' => false,
  1898.             'choices' => array_flip($tri_array)
  1899.         ]);
  1900.         // sur le titre ou sur titre+description
  1901.         $formAsideSearch->add('description'CheckboxType::class, [
  1902.             'label' => 'Rechercher aussi le descriptif',
  1903.             'required' => false,
  1904.             'attr' => [
  1905.                 'class' => 'checkbox'
  1906.             ]
  1907.         ]);
  1908.         $this->context['formAsideSearch'] = $formAsideSearch;
  1909.         $this->getCommonSearchView($request);
  1910.     }
  1911. }