<?php
namespace App\Controller;
use App\ClassTheatre\aside\asidesUrlPagination;
use App\ClassTheatre\asides;
use App\ClassTheatre\TheatreController;
use App\Service\Abonnements\Abonnements;
use App\Service\CheckMimeType\CheckMimeType;
use App\Service\Cleantext;
use App\Service\Functions;
use App\Service\Geocodage\Geocodage;
use App\Service\TheatreParametres;
use App\Service\TheatreMail\TheatreMail;
use App\Service\videoEmbed\videoEmbed;
use App\Service\wiki2xhtml\wiki2xhtml;
use App\Validator\CheckWebsite;
use App\Validator\Recaptcha;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints as Assert;
use TheatreCore\Classes\Constants\Constants;
use TheatreCore\Entity\AnnAnnonces;
use TheatreCore\Entity\AnnCategories;
use TheatreCore\Entity\AnnReponses;
use TheatreCore\Entity\Bigregions;
use TheatreCore\Entity\BookmarkExtranetuser;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Form\Type\RecaptchaType;
class AnnoncesController extends TheatreController
{
private $TheatreParametres;
private $logger;
/** constructeur hérité
*
*/
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
Functions $func,
Abonnements $abonnements,
TheatreParametres $TheatreParametres,
LoggerInterface $logger
)
{
parent::__construct($translator, $tokenStorage);
$this->TheatreParametres = $TheatreParametres;
$GLOBALS['rub_courante'] = $this->context['controller'] = $this->view->controller = 'annonces';
$this->em = $em;
$this->func = $func;
$this->asides = new asides();
$this->serviceAbonnements = $abonnements;
$this->logger = $logger;
}
/**
* @Route("/annonces/", name="annonces_view")
*/
public function index(Request $request)
{
// annonces
$annonces = $this->em->getRepository(AnnAnnonces::class);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
// utilisateurs
$extranetusers = $this->em->getRepository(Extranetusers::class);
// liste des categories
$categories_list = $categories->getCategoriesList(true);
$categories_list[0] = 'Liste des catégories';
ksort($categories_list);
// formulaire de recherche
$this->view->accueils = true;
$this->getRechercheAnnonce($request, $categories_list);
// trouver les categories avec url_clean
$categories_list = array();
$categories_list = $categories->queryAll('SELECT * FROM ' . $categories->__table . ' WHERE online=1 ORDER BY class');
// classe cleantext
$ct = new Cleantext($this->em);
// nb d'annonce dans la categorie
$sql_nb = 'SELECT idcategorie, COUNT(*) AS count FROM ' . $annonces->__table . ' WHERE online=1 AND valid=1 AND attente=0 GROUP BY idcategorie';
$resultats_query_categories_count = $annonces->queryAll($sql_nb);
$resultats_categories_count = [];
foreach ($resultats_query_categories_count as $key => $value) {
$resultats_categories_count[$value['idcategorie']] = $value['count'];
}
foreach ($categories_list as $value) {
$idcategorie = $value['idcategorie'];
$categories_l[$idcategorie] = $value;
$categories_l[$idcategorie]['nb_annonces'] = $resultats_categories_count[$idcategorie] ?? 0;
// derniere annonce dans la categorie
$last = 'SELECT MAX(dateinsert) as lastdate FROM ' . $annonces->__table . ' WHERE idcategorie=' . $idcategorie;
if ($lastcat = $annonces->queryOne($last)) {
$categories_l[$idcategorie]['lastcat'] = $lastcat;
$categories_l[$idcategorie]['lastdate'] = $annonces->getFormeDate($lastcat, 'd/m/Y');
$categories_l[$idcategorie]['lastheure'] = $annonces->getFormeDate($lastcat, 'H:i');
}
}
$this->view->categories = $categories_l;
// derniere annonce
$sql_last = 'SELECT a.*,e.login FROM ' . $annonces->__table . ' a, ' . $extranetusers->__table . ' e
WHERE e.idextranetuser=a.idextranetuser
AND a.online=1 AND a.valid=1 AND a.attente=0 ORDER BY a.dateinsert DESC LIMIT 0,1';
if (is_array($last = $annonces->queryRow($sql_last))) {
$singleCategory = $categories->find($last['idcategorie']);
$url_clean = $annonces->cutSentence($ct->str2URL($last['sujet']), 200);
$url_clean = $url_clean . '-annonce' . $last['idannonce'];
$last['url_clean'] = $url_clean;
$last['name_categorie'] = $singleCategory->getName();
// require_once PATH_LIBS.'Text/Wiki2xhtml/class.wiki2xhtml.php'; // appel de la classe wiki2xhtml
$wiki = new wiki2xhtml();
$description_courte = $wiki->transform($annonces->cutSentence($last['description'], 250));
$last['description_courte'] = strip_tags($description_courte);
$last['url_categorie'] = $singleCategory->getUrlClean();
$last['date'] = $annonces->getFormeDate($last['dateinsert'], 'd/m/Y');
$last['heure'] = $annonces->getFormeDate($last['dateinsert'], 'H:i');
$this->view->last = $last;
}
// nombre d'annonces
$this->view->nb_total_annonces = $annonces->queryOne('SELECT COUNT(idannonce) FROM ' . $annonces->__table . ' WHERE online=1 AND valid=1 AND attente=0');
// titre de la page
$this->title_page = 'Les petites annonces du théâtre et du spectacle';
// fil d'arianne
$this->view->locate = array('' => 'Les petites annonces');
// style css
$this->view->style_more = array('annonces');
// jquery
$this->view->jquery_cal = 'datepicker';
$asides = new asides();
$asides->load('annonce_reseau');
$asides->load('annonce_aside');
$asides->load('common_publicite');
$this->view->aside = $asides->view($this->view);
//On affiche la publicité google
$asides_publicite = new asides();
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogleCorrespondant($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite_footer = $asides_publicite->view($this->context['view']);
//On affiche la publicité google
$asides_publicite = new asides();
asides::loadaside('Publicite')->addGoogle($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite = $asides_publicite->view($this->context['view']);
return $this->view('annonces/view.html.twig');
}
// }}}
/**
* @Route("/annonces/page/aide/", name="annonces_page_aide")
*/
public function action_aide(FormFactoryInterface $formFactory)
{
// titre de la page
$title_page = 'Aide sur les petites annonces';
// fil d'arianne
$this->view->locate = array('/annonces/' => 'Les petites annonces',
'' => 'Aide',
);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
$categories_list = $categories->getCategoriesList(true);
// $elements['idcategorie'] = new HTML_Template_Flexy_Element;
// $elements['idcategorie']->setOptions($categories_list);
// $elements['idcategorie']->setOptions(array('0'=> utf8_encode(html_entity_decode('dans la catégorie...'))));
// $elements['idcategorie']->setValue('0');
// style css
$this->view->style_more = array('annonces');
$form = $formFactory->createNamedBuilder('');
$form->add('idcategorie', ChoiceType::class, [
'label' => 'Catégorie',
'placeholder' => 'Liste des catégories',
'choices' => array_flip($categories_list),
'required' => false,
'attr' => [
'id' => 'idcategorie'
]
]);
$this->view->formAsideSearch = $form->getForm()->createView();
return $this->view('annonces/aide.html.twig');
}
/**
* @Route("/annonces/suivre/rss/", name="annonces_suivre_rss")
* @Route("/annonces/suivre/rss/idannonce/{idannonce}", name="annonces_suivre_rss_idannonce")
*/
public function action_rss($idannonce = null, Request $request, Cleantext $ct)
{
$this->context['params']['idannonce'] = $idannonce;
if (array_key_exists('idcategorie', $this->context['params']) && is_numeric($this->context['params']['idannonce'])) {
$this->categories(null);
} else {
// annonces
$annonces = $this->em->getRepository(AnnAnnonces::class);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
// classe wiki
$wiki = new wiki2xhtml();
$sql_annonce = 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.lieu,e.login,c.url_clean, c.name as categorie_name
FROM ' . $categories->__table . ' c, ' . $annonces->__table . ' a
LEFT OUTER JOIN extranetusers e
ON a.idextranetuser=e.idextranetuser
WHERE c.idcategorie=a.idcategorie AND a.online=1 AND a.valid=1 AND a.attente=0
ORDER BY a.dateinsert DESC LIMIT 0,10';
//echo $sql_annonce;
// executer la requete
$datas = $annonces->query($sql_annonce);
$annonces_list = array();
// liste annonces
foreach ($datas as $data) {
$annonces->loadResult($data);
$idannonce = $annonces->idannonce;
$annonces_list[$idannonce] = array(
'description' => $annonces->description,
'lieu' => $annonces->lieu);
$annonces_list[$idannonce]['sujet'] = ucfirst($annonces->sujet);
$annonces_list[$idannonce]['lieu'] = ucwords(strtolower($annonces->lieu));
$annonces_list[$idannonce]['date'] = $annonces->getFormeDate($annonces->dateinsert, $GLOBALS['format_date']['fr']);
$annonces_list[$idannonce]['heure'] = $annonces->getFormeDate($annonces->dateinsert, 'H:i');
$description = strip_tags($wiki->transform($annonces->description));
$annonces_list[$idannonce]['description_courte'] = $annonces->cutSentence($description, 250);
// nom de la categorie
$annonces_list[$idannonce]['categorie_name'] = $annonces->categorie_name;
// url_clean
$url_clean = $annonces->cutSentence($ct->str2URL($annonces->sujet), 200);
$url_clean = $url_clean . '-annonce' . $idannonce;
$annonces_list[$idannonce]['url_clean'] = $url_clean;
$annonces_list[$idannonce]['url_categorie'] = $annonces->url_clean;
// md5
$md5 = md5($annonces->idannonce);
$annonces_list[$idannonce]['md5'] = $md5;
// date
$date = $annonces->dateinsert;
$t = explode(' ', $date);
list($y, $m, $d) = explode('-', $t[0]);
list($h, $i, $s) = explode(':', $t[1]);
$w3t = gmdate(DATE_ATOM, mktime($h, $i, $s, $m, $d, $y));
$annonces_list[$idannonce]['w3t'] = $w3t;
// premiere annonce = updated
if (!isset($updated)) {
$this->context['view']->updated = $w3t;
$this->context['view']->md5 = $md5;
$updated = true;
}
}
// passer les annonces au templates
$this->context['view']->annonces = $annonces_list;
}
$response = $this->view('annonces/rss.html.twig');
$response->headers->set('Content-Type', 'xml');
$response->setCharset('utf-8');
return $response;
}
/**
* @Route("/annonces/proposer/ajouter", name="annonces_ajouter")
* @Route("/annonces/proposer/ajouter/idannonce/{idannonce}", name="annonces_ajouter_idannonce")
*/
public function action_ajouter($idannonce = null, Request $request)
{
$this->context['params']['idannonce'] = $idannonce;
// classe des annonces
$annonces = $this->em->getRepository(AnnAnnonces::class);
// classe pour le wiki
$wiki = new wiki2xhtml();
// option de Wiki2xhtml
$wiki->setOpt('active_auto_urls', 1); # Activation de la reconnaissance d'url (inactif)
$wiki->setOpt('active_autoemails', 1); # Activation de la reconnaissance des emails (inactif)
$wiki->setOpt('active_pre', 0); # desactivation du <pre>
//$wiki->setOpt('active_auto_img',0); # Activation des images automatiques dans les liens []
//$wiki->setOpt('active_img',0); # Activation des images (())
$wiki->setOpt('first_title_level', 1); # Premier niveau de titre <h..>
// parametre idannonce
if (array_key_exists('idannonce', $this->context['params']) && is_numeric($this->context['params']['idannonce'])) {
$idannonce = $this->context['params']['idannonce'];
} elseif (isset($_POST['idannonce']) && is_numeric($_POST['idannonce'])) {
$idannonce = $_POST['idannonce'];
} else {
$idannonce = null;
}
// on le passe a la vue
$this->view->idannonce = $idannonce;
// on verifie l'authentification sinon > page acces
if (!$this->getUser() instanceof Extranetusers) {
if (!empty($idannonce)) {
$urifrom = '/annonces/proposer/ajouter/idannonce/' . $idannonce;
} else {
$urifrom = '/annonces/proposer/ajouter/';
}
return $this->redirect('/montheatre/connexion?urifrom=' . $urifrom . '&entete_connexion=annonces');
}
// infos sur l'utilisateur
$user = $this->em->getRepository(Extranetusers::class);
$this->view->email_user = $this->getUser()->getEmail();
$idextranetuser = $this->getUser()->getIdextranetuser();
// pour le fichier associé
function path_to($basedir, $nomfichier, $preview = true, $only_dir = false)
{
$nomfichier = basename($nomfichier);
if ($preview) {
$basedir .= 'preview/';
}
$hashdir = substr(md5($nomfichier), 0, 2) . '/'; /* répertoire de hachage */
return $basedir . $hashdir . ($only_dir ? '' : $nomfichier);
}
//chemin des fichiers
$rep_upload_abs = $this->getParameter('app.dir.annonces') . '/';
$url_upload = $this->getParameter('app.dir.upload') . 'annonces/';
if (!file_exists($rep_upload_abs . 'preview/')) {
@mkdir($rep_upload_abs . 'preview/', 0775, true);
}
$formFactory = $this->formAddAnnonces();
// modification
$nomfichier_old = false;
if (!empty($idannonce)) {
$request->getSession()->set('accepte_condition', 'on');
// selection de l'annonce
$infos_annonce = $annonces->queryRow('SELECT * FROM ' . $annonces->__table . ' WHERE idannonce=' . $idannonce . ' AND idextranetuser=' . $idextranetuser);
// si pas trouve
if (empty($infos_annonce)) {
$this->view->error['select_annonce'] = 'ATTENTION ! Une erreur est survenue pendant la sélection de votre annonce !';
$this->view->erreur_annonce = true;
// debug
//$this->view->error['select_annonce'] = $infos_annonce->getMessage();
} else {
// remplir les champs du form
$formFactory->setData($infos_annonce);
// pour la vue
if (!empty($infos_annonce)) {
$this->view->modification = true;
$this->view->num_annonce = $infos_annonce['idannonce'];
$this->view->idtypecontrat = $infos_annonce['idtypecontrat'];
}
// precision sur les fichiers
if (!empty($infos_annonce['fichier']) && !empty($infos_annonce['typefichier'])
&& file_exists(path_to($rep_upload_abs, $infos_annonce['fichier'], false))) {
$this->view->fichier = $infos_annonce['fichier'];
$this->view->url_fichier = path_to($url_upload, $infos_annonce['fichier'], false);
$this->view->extension = $infos_annonce['typefichier'];
$nomfichier_old = $infos_annonce['fichier'];
}
}
}
if (isset($_POST['idcategorie']) && $_POST['idcategorie'] == 3) {
if (isset($_POST['idtypecontrat']) && $_POST['idtypecontrat'] > 0) {
$this->view->idtypecontrat = $_POST['idtypecontrat'];
} else {
$this->view->idtypecontrat = 50;
}
}
// valider les conditions d'utilisation
if (isset($_GET['valide_condition'])) {
$request->getSession()->set('accepte_condition', 'on');
}
// si le user n'a pas accepte les conditions, on les affiches
if (!$request->getSession()->get('accepte_condition')) {
$this->view->conditions = true;
}
// csrf
$nomfichier = false;
$extension = false;
$nomfichier_final = false;
$extension_final = false;
$inpreview = true;
if (!empty($_POST['nomfichier_final'])) {
$nomfichier_final = $_POST['nomfichier_final'];
$inpreview = preg_match('#^preview/#', $nomfichier_final);
if (!file_exists(path_to($rep_upload_abs, $nomfichier_final, $inpreview)))
$nomfichier_final = false;
else if (in_array($_POST['extension_final'], array('pdf', 'jpg')))
$extension_final = $_POST['extension_final'];
}
$preview = false;
if (isset($_POST['preview'])) {
$preview = true;
}
//print_r($_REQUEST);
$form = $formFactory->getForm();
$form->handleRequest($request);
// validation du formulaire
if ($form->isSubmitted() && $form->isValid()) {
// suppression fichier
if (!empty($_POST['supprimer_fichier'])) {
if ($nomfichier_final) {
@unlink(path_to($rep_upload_abs, $nomfichier_final, $inpreview));
if ($nomfichier_final == $nomfichier_old) {
$nomfichier_old = false;
unset($this->view->fichier);
}
$nomfichier_final = false;
}
}
$objfile = $form->get('fichier')->getData();
$error = false;
// upload d'un fichier
if ($objfile) {
// fichier temporaire à scanner
$file_scan = $objfile->getPathName();
// Vérification type mime
$mimetype = CheckMimeType::checkMimeTypeFinfo($file_scan, array('image/jpeg', 'image/jpg', 'image/pjpeg', 'application/pdf'), false, true, $this->func);
if (!$mimetype) {
$error = true;
$this->view->error['mimetype'] = 'Seuls les fichiers de type JPEG ou PDF sont acceptés.';
}
// test antivirus
if (!$error) {
// exec(CLAMSCAN.' --quiet '.$file_scan,$out,$test);
// if ($test==1) {
// $this->view->error['virus'] = 'Un virus a été détecté dans le fichier que vous avez associé à votre annonce !';
// } elseif($test>1) {
// $this->view->error['virus_failer'] = 'Il y a eu un problème pendant l\'analyse antivirus. Merci de nous contacter.';
// }
}
// test de la taille
if (!$error) {
$taille = filesize($file_scan);
if ($taille > $this->taille_maxi) {
$error = true;
$this->view->error['size'] = 'Le fichier que vous souhaitez associer à votre annonce est trop volumineux !';
}
}
if (!$error) {
// extensions
$extension = false;
if (in_array($mimetype, array('image/jpeg', 'image/jpg', 'image/pjpeg'))) { // penser au type pjpeg
$extension = 'jpg';
$im = @getimagesize($file_scan);
if (empty($im)) {
$this->view->error['image'] = 'Le fichier que vous souhaitez associer à votre annonce n\'est pas une image valide.';
} else {
$w = $im[0];
$h = $im[1];
$type = $im[2];
if ($type != IMAGETYPE_JPEG) {
$error = true;
$this->view->error['image'] = 'Le fichier que vous souhaitez associer à votre annonce n\'est pas au format JPEG.';
} else if ($w < 1 || $w > 4096 || $h < 1 || $h > 4096) {
$error = true;
$this->view->error['dimensions'] = 'L\'image que vous souhaitez associer a des dimensions surprenantes (' . $w . 'x' . $h . ').';
}
}
} elseif (in_array($mimetype, array('application/pdf'))) {
$extension = 'pdf';
}
}
// si pas d'erreur, fichier dans le rep qui va bien
if (!$error && empty($this->view->error) && $extension) {
// mettre en forme le nom du fichier
do {
$nomfichier = uniqid('ann-') . '.' . $extension;
$directory = path_to('', $nomfichier, true, true);
} while (file_exists($directory . $nomfichier));
$rep_upload_abs = $this->getParameter('app.dir.annonces') . '/';
$abs_directory = $rep_upload_abs . $directory;
if (!file_exists($abs_directory)) {
mkdir($abs_directory, 0775, true);
}
// deplacer
if (!$objfile->move($abs_directory, $nomfichier)) {
$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.';
} else {
// si deja un fichier pour cette annonce, on le supprime
if ($nomfichier_final && $inpreview) {
@unlink(path_to($rep_upload_abs, $nomfichier_final));
$nomfichier_final = false;
}
}
}
}
// url
$site = $form->get('site')->getData();
if ($site == 'http://') {
$site = null;
}
// renvoyer les infos
$description = $form->get('description')->getData();
$pays = $form->get('pays')->getData();
$sujet = $form->get('sujet')->getData();
$lieu = $form->get('lieu')->getData();
$cp = $form->get('cp')->getData();
$idcategorie = $form->get('idcategorie')->getData();
if ($form->get('idtypecontrat')->getData() != '') {
$idtypecontrat = $form->get('idtypecontrat')->getData();
}
$adresse = $form->get('adresse')->getData();
// MODE previsualisation
if ($preview && !$error && empty($this->view->error)) {
// renvoyer les infos a la vue
$this->view->description = $wiki->transform($description);
$this->view->pays = $annonces->getNameCountry($pays);
$this->view->site = $site;
$this->view->sujet = $sujet;
$this->view->lieu = $lieu;
$this->view->adresse = $adresse;
$this->view->cp = $cp;
if (isset($idtypecontrat)) {
$this->view->idtypecontrat = $idtypecontrat;
}
// categorie
$this->view->categorie = $this->context['categorie_list'][$idcategorie];
if (!empty($idtypecontrat)) {
$this->view->typecontrat_txt = $this->context['type_contrat'][$idtypecontrat];
}
// si nouveau fichier, le mettre en champ caché
if ($nomfichier && $extension) {
$this->view->fichier = path_to('', $nomfichier);
$this->view->url_fichier = path_to($url_upload, $nomfichier);
$this->view->extension = $extension;
}
// si fichier déjà chargé
if ($nomfichier_final && $extension_final) {
$this->view->fichier = path_to('', $nomfichier_final);
$this->view->url_fichier = path_to($url_upload, $nomfichier_final);
$this->view->extension = $extension_final;
}
// afficher la preview avec le bouton de confirmation
$this->view->preview = true;
} else if ((!isset($error) || empty($error)) && empty($this->view->error)) {
// MODE sauvegarde
$fields_values = array('sujet' => $sujet,
'site' => $site,
'description' => $description,
'idcategorie' => $idcategorie,
'online' => '0',
'valid' => '0',
'attente' => '0',
'adresse' => $adresse,
'lieu' => $lieu,
'pays' => $pays,
'cp' => $cp,
'idextranetuser' => $idextranetuser,
'adresse_ip' => $_SERVER['REMOTE_ADDR'] . ' / ' . $_SERVER['HTTP_USER_AGENT'],
'dateinsert' => $this->now(),
);
if (isset($idtypecontrat)) {
$fields_values['idtypecontrat'] = $idtypecontrat;
}
$nomfichier_db = false;
$extension_db = false;
if ($nomfichier_final && $extension_final) {
$nomfichier_db = $nomfichier_final;
$extension_db = $extension_final;
}
if ($nomfichier && $extension) {
$nomfichier_db = $nomfichier;
$extension_db = $extension;
}
if ($nomfichier_db && $extension_db) {
$fields_values['fichier'] = path_to('', $nomfichier_db, false);
$fields_values['typefichier'] = $extension_db;
}
$adresse_geocodage = $adresse . ',' . $cp . ' ' . $lieu . ', ' . $pays;
$ServiceGeocodage = new Geocodage();
$geocodage = $ServiceGeocodage->getGoogleGeocoding($adresse_geocodage);
// if (is_array($geocodage)) {
$fields_values['x'] = 0;
$fields_values['y'] = 0;
// }
// preparer les champs
$annonces->setUpdateFields($fields_values);
try {
$res = $annonces->setData($idannonce, true);
// si modification
if (!empty($idannonce)) {
$this->view->modif = true;
$this->view->num_annonce = $idannonce;
// supprimer les éventuelles vignettes
if (file_exists($rep_upload_abs . 'thumbs/ann-' . $idannonce . '.jpg')) {
@unlink($rep_upload_abs . 'thumbs/ann-' . $idannonce . '.jpg');
}
} else {
//header('Location: /annonces/proposer/ajouter')
$this->view->num_annonce = $res;
}
if ($nomfichier_db && $extension_db) {
$source = path_to($rep_upload_abs, $nomfichier_db);
$dest = path_to($rep_upload_abs, $nomfichier_db, false);
$dir = dirname($dest);
if (!file_exists($dir)) {
@mkdir($dir, 0775, true);
}
// renomme de preview à definitif
@rename($source, $dest);
//suppression du fichier précédent le cas échéant
if ($nomfichier_old) {
@unlink(path_to($rep_upload_abs, $nomfichier_old, false));
}
}
$this->view->result_annonce = true;
$this->view->preview = false;
} catch (\Exception $e) {
$this->view->err_ann = true;
$err_insert = true;
$err['no_insert'] = $e->getMessage();
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
}
// si OK, on ajoute a la newsletter
if (!isset($err_insert)) {
// $subscribers = $this->em->getRepository(Subscribers::class);
// $subscribers->setSubscribe($this->getUser()->getEmail(),'thnet',$pays,'thnet');
}
} // fin du save
}
// aide wiki
$this->view->aide_wiki = utf8_encode($wiki->help());
// titre de la page
if (empty($idannonce)) {
$this->title_page = 'Proposez votre annonce';
} else {
$this->title_page = 'Modifier votre annonce';
}
// fil d'arianne et menu principal actif
$locate = array('/annonces/' => 'Petites annonces');
if (empty($idannonce)) {
$locate[] = 'Proposez votre annonce';
} else {
$locate[] = 'Modifier votre annonce';
}
$this->view->locate = $locate;
// style css
$this->view->style_more = array(
'annonces',
array(
'/navigation/js/markitup/skins/markitup/style.css',
'/navigation/js/markitup/sets/dotclear/style.css'
)
);
$this->view->js_more = array(
array(
//'/navigation/js/markitup/jquery.markitup.pack.js',
'/navigation/js/markitup/jquery.markitup.js',
'/navigation/js/markitup/sets/dotclear/set.js',
)
);
return $this->view('annonces/ajouter.html.twig', [
'form' => $form->createView()
]);
}
private function formAddAnnonces()
{
$formFactory = $this->get('form.factory')->createNamedBuilder('', FormType::class, null, [
'allow_extra_fields' => true,
'attr' => [
'id' => 'masterform',
'novalidate' => true
]
]);
$formFactory->add('site', TextType::class, [
'label' => 'Site Internet',
'constraints' => [
new Assert\Url([
'message' => 'Site Internet : l\'adresse du site semble incorrecte(elle doit commencer par http://)'
]),
new CheckWebsite([
'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'
])
],
'attr' => [
'size' => '45',
'id' => 'site'
]
]);
$formFactory->add('lieu', TextType::class, [
'label' => 'Ville / lieu',
'constraints' => [
new NotBlank([
'message' => 'Ville / lieu : veuillez préciser la ville et le lieu'
]),
new Length([
'max' => 60,
'maxMessage' => 'Ville / lieu : le nom de la ville ou du lieu ne doit pas faire plus de 60 caractères'
])
],
'attr' => [
'size' => '40',
'id' => 'lieu'
]
]);
$formFactory->add('adresse', TextareaType::class, [
'label' => 'Adresse postale',
'required' => false,
'attr' => [
'rows' => '2',
'cols' => '60',
'id' => 'adresse'
]
]);
$formFactory->add('cp', TextType::class, [
'label' => 'Code postal',
'constraints' => [
new NotBlank([
'message' => 'Code postal : veuillez préciser le code postal'
]),
],
'attr' => [
'size' => '20',
'id' => 'cp'
]
]);
$annonces = $this->em->getRepository(AnnAnnonces::class);
$formFactory->add('pays', ChoiceType::class, [
'label' => 'Pays',
'choices' => $annonces->getCountryList(),
'constraints' => [
new NotBlank([
'message' => 'Pays : veuillez préciser le pays'
]),
new Length([
'max' => 2,
'maxMessage' => 'Pays : veuillez préciser le pays'
])
],
'attr' => ['id' => 'pays']
]);
if (!isset($_POST['preview'])) {
$formFactory->setData(array('pays' => 'FR'));
}
// categories
$categories = $this->em->getRepository(AnnCategories::class);
$this->context['categorie_list'] = $categorie_list = $categories->getCategoriesList();
$formFactory->add('idcategorie', ChoiceType::class, [
'label' => 'Catégorie de votre annonce',
'placeholder' => 'Choisissez dans la liste',
'choices' => array_flip($categorie_list),
'constraints' => [
new NotBlank([
'message' => 'Catégorie : veuillez préciser la catégorie pour votre annonce'
]),
new Assert\Type([
'type' => 'integer',
'message' => 'Catégorie : veuillez préciser la catégorie pour votre annonce'
])
],
'attr' => ['id' => 'idcategorie']
]);
// uniquement pour emploi rému
$this->context['type_contrat'] = $type_contrat = $annonces->getTypesContrat();
$constraints_idtypecontrat_dynamic = [];
if (isset($_POST['idtypecontrat'])) {
$typemessage = 'Type de contrat : <strong>pour des raisons légales</strong> vous devez préciser le type de contrat';
$constraints_idtypecontrat_dynamic = [
new NotBlank([
'message' => $typemessage
]),
new Assert\NotNull([
'message' => $typemessage
]),
new Assert\Type([
'type' => 'integer',
'message' => $typemessage
]),
];
}
$formFactory->add('idtypecontrat', ChoiceType::class, [
'label' => 'Type de contrat de travail',
'choices' => array_flip($type_contrat),
'constraints' => $constraints_idtypecontrat_dynamic,
'attr' => ['id' => 'idtypecontrat']
]);
$formFactory->add('sujet', TextType::class, [
'label' => 'Titre de votre annonce (75 signes maximum)',
'constraints' => [
new NotBlank([
'message' => 'Titre de votre annonce : veuillez préciser le titre de votre annonce'
]),
new Length([
'min' => 2,
'minMessage' => 'Veuillez saisir au moins deux lettres du nom',
'max' => 200,
'maxMessage' => 'Titre : le titre de votre annonce ne doit pas faire plus de 200 caractères'
])
],
'attr' => [
'size' => '80',
'id' => 'sujet'
]
]);
$formFactory->add('description', TextareaType::class, [
'label' => 'Texte de votre annonce',
'constraints' => [
new NotBlank([
'message' => 'Texte de votre annonce : veuillez préciser le texte de votre annonce'
]),
// new Length([
// 'max' => 60,
// 'maxMessage' => 'Texte : le texte de votre annonce ne doit pas faire plus de 60 caractères'
// ])
],
'attr' => [
'cols' => '130',
'rows' => '20',
'class' => 'markitup'
]
]);
$formFactory->add('preview', SubmitType::class, [
'label' => 'Prévisualisez votre annonce',
'attr' => [
'class' => 'boutform',
'id' => 'preview'
]
]);
//file
$this->taille_maxi = 10 * 1024 * 1024; // 10 Mo
$objfile = $formFactory->add('fichier', FileType::class, [
'label' => 'Fichier',
'data_class' => null,
'required' => false,
'constraints' => [
new File([
'maxSize' => $this->taille_maxi . 'k',
'maxSizeMessage' => 'Le fichier choisi est trop volumineux (max. 10 Mo)'
])
],
'attr' => [
'id' => 'fileupload'
]
]);
return $formFactory;
}
/**
* @Route("/annonces/{slug}/", name="annonces_categories")
*/
public function categories($slug = null, Request $request)
{
$this->RouterOptions($slug, 'categorie', $GLOBALS['rub_courante']);
$idcategorie = $params['idcategorie'] = $this->id;
$annonces = $this->em->getRepository(AnnAnnonces::class);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
if (!isset($idcategorie) && array_key_exists('idcategorie', $params)) {
$idcategorie = $params['idcategorie'];
$this->view->idcategorie = $idcategorie;
}
// on verifie que le parametre id existe
if (!isset($idcategorie)) {
return $this->redirect('/annonces/');
}
if ($idcategorie == 3) {
$this->view->is_emploi = true;
}
// infos sur la categorie
$sql_cat = 'SELECT name,url_clean FROM ' . $categories->__table . '
WHERE idcategorie=' . (int)$idcategorie;
$cat = $categories->queryRow($sql_cat);
// regions
$regions = $this->em->getRepository(Bigregions::class);
// classe cleantext
$ct = new Cleantext($this->em);
// liste des categories
$categories_list = $categories->getCategoriesList(false);
// on boucle et on retire la cat en cours
foreach ($categories_list as $k => $v) {
if ($k == $cat['url_clean']) {
unset($categories_list[$k]);
} else {
$k = '/annonces/' . $k . '/';
$categories_list_new[$k] = $v;
}
}
$this->getRechercheAnnonce($request, $categories_list_new);
// nombre de resultat pas page
$nbpage_array = array('20' => '20', '40' => '40', '60' => '60', '80' => '80');
if (!empty($cat['name'])) {
// nom de la categorie
$this->view->nom_categorie = $cat['name'];
// infos generales
$this->view->flux_rss_categorie = $_ENV['URL_THNET'] . '/annonces/suivre/rss/idcategorie/' . $idcategorie;
$this->view->flux_rss[] = array(
'name' => $cat['name'],
'url' => $this->view->flux_rss_categorie,
);
$nbpagelimit = $this->context['formAsideSearch']->get('nbpagelimit')->getData();
$nbpagelimit = 30;
if (empty($nbpagelimit) && isset($_GET['nbpagelimit'])) {
$pagerOptions['perPage'] = $_GET['nbpagelimit'];
$nbpagelimit = $_GET['nbpagelimit'];
} else {
$pagerOptions['perPage'] = $nbpagelimit;
}
if (empty($nbpagelimit) || !array_key_exists($nbpagelimit, $nbpage_array)) {
$pagerOptions['perPage'] = 20;
}
$sql_rec = '';
if (!empty($_REQUEST['cp']) && is_numeric($_REQUEST['cp'])) {
//recherche par code postal
$cp = trim($_REQUEST['cp']);
$cplen = strlen($cp);
if ($cplen >= 2 && $cplen < 5) {
$sql_rec = ' AND LEFT(LTRIM(a.cp),' . $cplen . ') = \'' . $annonces->escape($cp) . '\' ';
} else {
$sql_rec = ' AND a.cp =\'' . $annonces->escape($cp) . '\' ';
}
} else if (!empty($_REQUEST['area']) && is_numeric($_REQUEST['area'])) {
//recherche par région
$area = (int)$_REQUEST['area'];
$sql_rec = ' AND ' . $regions->getZipCode($area, 'a', 'cp', null, 'pays');
}
$sql_annonce = 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.fichier,a.typefichier,a.lieu,a.cp,e.login,c.url_clean
FROM ' . $categories->__table . ' c, ' . $annonces->__table . ' a
LEFT OUTER JOIN extranetusers e
ON a.idextranetuser=e.idextranetuser
WHERE c.idcategorie=a.idcategorie
AND a.online=1
AND a.valid=1
AND a.attente=0
AND a.idcategorie=' . $idcategorie . ' ' . $sql_rec . '
ORDER BY a.dateinsert DESC';
//echo $sql_annonce;
$sql_count = 'SELECT count(idannonce) FROM ' . $annonces->__table . ' a
WHERE a.online=1
AND a.valid=1
AND a.attente=0
AND a.idcategorie=' . $idcategorie . ' ' . $sql_rec;
// nombre d'enregistrement
$totalItems = $annonces->queryOne($sql_count);
if (!empty($totalItems) && $totalItems > 0) {
$pagerOptions['totalItems'] = $totalItems;
// pagination
$paged_data = $this->getPagination($totalItems);
//limite
$limit = $annonces->dbLimit($this->perPage, $this->getLimitStart());
// executer la requete
//$spectacle->query($sql_normal . $sql . $limit);
$annonces->query($sql_annonce . $limit);
$annonces_list = array();
$color = null;
// liste annonces
while ($annonces->fetch()) {
$idannonce = $annonces->idannonce;
$ann = $annonces->getInfosAnnonceRow();
$idannonce = $ann['idannonce'];
// premiere annonce = updated fil rss
if (!isset($updated)) {
$this->view->updated = $ann['w3t'];
$this->view->md5 = $ann['md5'];
$updated = true;
}
// si fichier jpg, générer une vignette
if ($annonces->fichier != '') {
$vignette = null;
if ($annonces->typefichier = 'jpg') {
$vignette = $annonces->getVignetteAnnonce($idannonce, array(), $annonces->fichier);
if ($vignette) {
$ann['vignette'] = $vignette;
$ann['vignette_flou'] = $annonces->getVignetteAnnonce($idannonce, array('blur' => true), $annonces->fichier);
}
}
}
// titre court et texte iphone
$ann['sujet_cut'] = $annonces->cutSentence($ann['sujet'], 30, true);
$ann['description_courte_cut'] = $annonces->cutSentence($ann['description_courte'], 100, true);
$annonces_list[$idannonce] = $ann;
}
// passer les annonces au templates
$this->view->annonces = $annonces_list;
if (isset($paged_data)) {
$urlpagination = new asidesUrlPagination(
'/annonces/' . $cat['url_clean'] . '/generate_params',
array(
'areac' => (isset($area)) ? $area : 'all',
),
$this->context
);
$paged_data['url_custom'] = $urlpagination->url_pagination();
}
$this->view->pagination = $paged_data;
}
}
// titre de la page
$this->title_page = $cat['name'] . ' - Les petites annonces du théâtre et du spectacle';
// fil d'arianne
$this->view->locate = array('/annonces/' => 'Les petites annonces',
'' => $cat['name']);
// jquery
$this->view->js_more[] = 'jquery.qtip.min.js';
//asides
$asides = new asides();
$asides->load('annonce_reseau');
$asides->load(['annonce_barre' => array(
'exec' => array(
'htmlstart' => true
),
'title' => 'Rechercher'
)]);
$asides->load(['annonce_categorie' => array(
'exec' => array(
'htmlend' => true
),
)]);
//affichage du dernier tweet pour les offres d'emploisé
if ($idcategorie == 3) {
$asides->load(['common_twitter' => array(
'title_custom' => 'suivre',
'subtitle_custom' => 'Le fil emplois rémunérés',
'url_custom' => 'https://twitter.com/thnet_annonces'
)]);
}
$asides->load('common_publicite');
$this->view->aside = $asides->view($this->view);
$asides_publicite = new asides();
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogle($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite = $asides_publicite->view($this->view);
//On affiche la publicité google
$asides_publicite = new asides();
asides::loadaside('Publicite')->addGoogleCorrespondantText($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite_footer = $asides_publicite->view($this->context['view']);
return $this->view('annonces/categorie.html.twig');
}
// }}}
/**
* @Route("/annonces/{slug}/{annonce}/", name="annonces_categorie_annonce")
*/
public function annonce($slug = null, $annonce = null, Request $request, TheatreMail $TheatreMail)
{
preg_match_all('([0-9]+)', $annonce, $matchs);
$idannonce = end($matchs[0]);
$this->RouterOptions($slug, 'categorie', $GLOBALS['rub_courante']);
$idcategorie = $params['idcategorie'] = $this->id;
// annonces
$annonces = $this->em->getRepository(AnnAnnonces::class);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
// utilisateurs
$reponses = $this->em->getRepository(AnnReponses::class);
// on verifie que le parametre id_ann existe
if (isset($idannonce) && is_numeric($idannonce)) {
$idannonce = $idannonce;
} else {
return $this->redirect('/error/');
}
if (isset($_GET['print'])) {
$this->view->typeaffichage = 'print';
} else {
$this->view->typeaffichage = 'normal';
$this->view->use_addthis = true;
}
$wiki = new wiki2xhtml();
// option de Wiki2xhtml
$wiki->setOpt('active_auto_urls', 1); # Activation de la reconnaissance d'url (inactif)
$wiki->setOpt('active_autoemails', 1); # Activation de la reconnaissance des emails (inactif)
$wiki->setOpt('active_pre', 0); # desactivation du <pre>
$wiki->setOpt('active_auto_img', 0); # Activation des images automatiques dans les liens []
$wiki->setOpt('active_img', 1); # Activation des images (())
$wiki->setOpt('first_title_level', 1); # Premier niveau de titre <h..>
// definition de mesg
$mesg = array();
$ct = new Cleantext($this->em);
// requete aussi pour l'extranetuser
$sql_annonce = 'SELECT a.*,e.login,e.email as email_extra
FROM ' . $annonces->__table . ' a
LEFT OUTER JOIN extranetusers e
ON a.idextranetuser=e.idextranetuser
WHERE a.idannonce=' . $idannonce;
// requete sur l'annonce
$annonce = $annonces->queryRow($sql_annonce);
// pb sql
if (empty($annonce)) {
$this->view->error['pb'] = 'Il a eu un problème pendant la récupération de l\'annonce';
// $this->view->error['pb_suite'] = $annonce->getDebugInfo();
$this->view->error_annonce = true;
$this->view->no_bookmark = true;
} else {
// idextranetuser connecté ?
if ($this->getUser() instanceof Extranetusers) {
$idextranetuser = $this->getUser()->getIdextranetuser();
} else {
$idextranetuser = null;
}
// si l'annonce n'existe pas ou elle est supprimée
if (empty($annonce) || $annonce['attente'] == 2) {
$this->view->error['pb'] = 'Cette annonce n\'est plus disponible';
$this->view->error_annonce = true;
$this->view->no_bookmark = true;
$title_page = 'Cette annonce n\'est plus disponible - erreur 404';
header('HTTP/1.0 404 Not Found');
} else {
// si l'annonce a plus de 30 jours, on le signale
if (!empty($annonce['dateupdate'])) {
$dateup = $annonce['dateupdate'];
} else {
$dateup = $annonce['dateinsert'];
}
$datepass = date('Y-m-d H:i:s', mktime(date('H'), date('i'), date('s'), date('m'), date('d') - 30, date('Y')));
if ($dateup < $datepass) {
$this->view->annonce_ancienne = true;
}
// voir une réponse en particulier
if (isset($_GET['voir-reponse']) && is_numeric($_GET['voir-reponse'])) {
$idreponse_voir = $_GET['voir-reponse'];
} else {
$idreponse_voir = null;
}
// droit de modifier ?
if (!empty($annonce['idextranetuser']) && $annonce['attente'] != 2) {
// si c'est l'annonce de l'utilisateur connecté
if ($idextranetuser && $idextranetuser == $annonce['idextranetuser']) {
// on précise donc que c'est la sienne
$is_my = true;
$this->view->modif_annonce = true;
// si annonce en attente de validation = message
if ($annonce['valid'] == 0) {
$this->view->error['attente_validation'] = '<strong>ATTENTION : cette annonce est en attente de validation.
<br />Elle n\'est actuellement visible que par vous lorsque vous êtes connecté à votre espace <i>mon théâtre</i>.</strong>';
$this->view->error_preview = true;
}
// checker si il y a des réponses a cette annonce
$annonce_reponses = $reponses->getReponses($idannonce);
if (!empty($annonce_reponses)) {
// nombre de réponse
$this->view->nb_reponses = count($annonce_reponses);
foreach ($annonce_reponses as $k => $v) {
if ($v['idreponse'] == $idreponse_voir) {
$reponsesb = $this->em->getRepository(AnnAnnonces::class);
$info_reponse = $reponsesb->getInfosReponse($v['idreponse'], true);
$annonce_reponses[$k]['reponse'] = $info_reponse['reponse'];
$annonce_reponses[$k]['voir'] = 'read';
// marquer comme lue
$reponsesb->setRead($v['idreponse']);
} else {
$annonce_reponses[$k]['voir'] = 'notread';
}
}
$this->view->annonce_reponses = $annonce_reponses;
}
// si l'annonce n'est pas celle du user, verifier quelle est valide et online
} elseif ($annonce['valid'] == 0 || $annonce['online'] == 0) {
$this->view->error['pb'] = 'Cette annonce n\'existe pas ou n\'est plus disponible';
$this->view->error_annonce = true;
$this->view->no_bookmark = true;
header('HTTP/1.0 404 Not Found');
}
// si ce n'est pas l'annonce du user mais qu'un user est connecté, vérifié si il a une réponse
if ($idextranetuser && $idextranetuser != $annonce['idextranetuser']) {
$reponses_by_user = $reponses->getReponsesByUser($idextranetuser, $idannonce);
foreach ($reponses_by_user as $k => $v) {
if ($v['idreponse'] == $idreponse_voir) {
$reponsesb = $this->em->getRepository(AnnReponses::class);
$info_reponse = $reponsesb->getInfosReponse($v['idreponse'], true);
$reponses_by_user[$k]['reponse'] = $info_reponse['reponse'];
$reponses_by_user[$k]['voir'] = 'read';
}
}
if (!empty($reponses_by_user)) {
$this->view->reponses_by_user = $reponses_by_user;
}
}
}
// changer des caracteres speciaux sauter des lignes...
$descrip = $wiki->transform($annonce['description']);
$annonce['description'] = $descrip;
// video ?
if (!empty($annonce['video_src'])) {
require_once PATH_LIBS . '/HTML/Video_embded.php';
$annonce['video_src'] = videoEmbed::get_video($annonce['video_src']);
}
// type de contrat de travail
if (!empty($annonce['idtypecontrat'])) {
$type_contrat = $annonces->getTypesContrat();
$annonce['typecontrat'] = $type_contrat[$annonce['idtypecontrat']];
}
// categorie de l'annonce
$data = $categories->get($annonce['idcategorie']);
$annonce['categorie'] = $categories->objToArray();
// url de l'annonce
$annonce['url_clean'] = $annonces->getUrlClean($idannonce, $annonce['sujet'], $data['urlClean']);
// pays
$annonce['pays'] = $annonces->getNameCountry($annonce['pays']);
// nom
$annonce['nom'] = $annonce['login'];
// mail
$annonce['email'] = $annonce['email_extra'];
//vignette
// si fichier jpg, générer une vignette
if ($annonce['fichier'] != '') {
$vignette = null;
if ($annonce['typefichier'] = 'jpg') {
$vignette = $annonces->getVignetteAnnonce($idannonce, array(), $annonce['fichier']);
if ($vignette) {
$annonce['vignette'] = $vignette;
$annonce['vignette_flou'] = $annonces->getVignetteAnnonce($idannonce, array('blur' => true), $annonce['fichier']);
}
}
}
// carte google ?
if ($annonce['x'] != '0.00000000' && $annonce['y'] != '0.00000000') {
$this->view->geocodable = true;
$this->view->cartox = $annonce['x'];
$this->view->cartoy = $annonce['y'];
$this->view->cartoc = 11;
// dimension de la carte
$this->view->cartow = 360;
$this->view->cartoh = 240;
$this->view->google_maps_key = Constants::Get('google_maps_key', 0);
}
// heure date
$annonce['heureinsert'] = $annonces->getFormeDate($annonce['dateinsert'], 'H:i');
$annonce['dateinsert'] = $annonces->getFormeDate($annonce['dateinsert'], $GLOBALS['format_date']['fr']);
if (!empty($annonce['dateupdate']) && $annonce['dateupdate'] != '0000-00-00 00:00:00') {
$annonce['heureupdate'] = $annonces->getFormeDate($annonce['dateupdate'], 'H:i');
$annonce['dateupdate'] = $annonces->getFormeDate($annonce['dateupdate'], $GLOBALS['format_date']['fr']);
} else {
$annonce['dateupdate'] = false;
}
// fichier
if (!empty($annonce['fichier']) && file_exists($this->getParameter('app.dir.annonces') . $annonce['fichier'])) {
$annonce['url_fichier'] = $_ENV['URL_DIRECTORYUPLOAD'] . 'annonces/' . $annonce['fichier'];
// préciser si image
if ($annonce['typefichier'] == 'jpg') {
$annonce['is_image'] = true;
}
}
$this->view->annonce = $annonce;
// voir si l'objet est bookmarke
if (!isset($is_my) && $this->getUser() instanceof Extranetusers) {
$bookmark = $this->em->getRepository(BookmarkExtranetuser::class);
if ($bookmark->isBookmark($idannonce, 'ann_annonces', $this->getUser()->getIdextranetuser())) {
$this->view->is_bookmark = true;
}
} else {
$this->view->no_bookmark = true;
}
// identifiant de l'annonce
$this->view->id = $idannonce;
$this->view->mtinfos = array('object' => 'ann_annonces', 'idobject' => $idannonce, 'urifrom' => $annonce['url_clean'], 'info_rub' => 'cette annonce');
// action add/delete bookmark
if (isset($_GET['bookmark'])) {
$this->view->bookmark = true;
$do_action = $_GET['do_action'];
$this->view->$do_action = true;
}
/** @todo */
// envoyer a un ami
if (isset($_GET['envoiami'])) {
// require 'envoyer-ami.php';
// $this->view->envoiami = true;
// $this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
// 'attr' => [
// 'id' => 'masterform'
// ]
// ]);
// $this->context['form'] = $this->context['formFactory']->getForm();
// $this->context['form']->handleRequest($request);
}
// contacter l'annonceur
if (isset($_GET['contact'])) {
// require 'contact-annonce.php';
$this->getFormulaireContacterAnnonceur($request, $TheatreMail);
$this->view->contact = true;
}
// signaler
if (isset($_GET['signaler'])) {
$this->getFormulaireSignalement($request, $TheatreMail);
$this->view->signaler = true;
}
// titre de la page
$title_page = $annonce['sujet'];
// ajouter title_page
if (isset($this->view->contact)) {
$title_page .= ' - Contactez l\'annonceur';
}
// fil d'arianne
$this->view->locate = array('/annonces/' => 'Les petites annonces',
'/annonces/' . $data['urlClean'] . '/' => $data['name'],
'' => $annonce['sujet']
);
// pour bookmarking.inc.html
$this->view->fem = 'e';
}
} // fin recup annonce
// liste des categories
$categories = $this->em->getRepository(AnnCategories::class);
$categories_list = $categories->getCategoriesList(false);
$this->getRechercheAnnonce(null, $categories_list);
// $elements['idcategorie'] = new HTML_Template_Flexy_Element;
// $elements['idcategorie']->setOptions($categories_list);
// $elements['idcategorie']->setOptions(array('0'=> html_entity_decode('Dans la catégorie...')));
// $elements['idcategorie']->setValue('0');
$asides = new asides();
$asides->load('annonce_thumbnail');
$asides->load('ajoutez_MT.inc');
$asides->load('annonce_reseau');
$asides->load(['annonce_barre' => array(
'exec' => array(
'htmlstart' => true
),
'title' => 'Rechercher'
)]);
$asides->load(['annonce_categorie' => array(
'exec' => array(
'htmlend' => true
),
)]);
$asides->load('common_publicite');
$this->context['view']->aside = $asides->view($this->view);
$asides_publicite = new asides();
asides::setEntityManager($this->em);
asides::loadaside('Publicite')->addGoogle($asides_publicite, $this->serviceAbonnements);
$this->context['view']->asides_publicite = $asides_publicite->view($this->view);
// style css et js
$this->view->style_more[] = 'annonces';
$this->view->js_more[] = 'jquery.qtip.min.js';
return $this->view('annonces/annonce.html.twig');
}
/**
* @Route("/annonces/outils/recherche", name="annonces_outils_recherche")
*/
public function action_outils_recherche(Request $request, EntityManagerInterface $em)
{
// annonces
$annonces = $this->em->getRepository(AnnAnnonces::class);
// categories
$categories = $this->em->getRepository(AnnCategories::class);
// liste des categories
$categories_list = $categories->getCategoriesList(true);
$categories_list[0] = 'Liste des catégories';
ksort($categories_list);
// formualire de recherche
$this->getRechercheAnnonce($request, $categories_list);
// si le formulaire est validé on insere l'enregistrement
if ($this->context['formAsideSearch']->isSubmitted() || isset($_GET['page']) || isset($area)) {
$regions = $em->getRepository(Bigregions::class);
// recuperation de variable mot clés
$keywords = $this->context['formAsideSearch']->get('keywords_annonces')->getData();
if (empty($keywords) && isset($_GET['keywords_annonces'])) {
$keywords = $_GET['keywords_annonces'];
}
// pour la vue
if (!empty($keywords)) {
$this->view->keywords = $keywords;
}
$idcategorie = $this->context['formAsideSearch']->get('idcategorie')->getData();
if (empty($idcategorie) && isset($_GET['idcategorie'])) {
$idcategorie = $_GET['idcategorie'];
}
// date debut
$datestart = $this->context['formAsideSearch']->get('datestart')->getData();
if (empty($datestart) && isset($_GET['datestart'])) {
$datestart = $_GET['datestart'];
}
// pour la vue
if (!empty($datestart)) {
$this->view->datestart = $annonces->getFormeDate($datestart, $GLOBALS['format_date']['fr']);
}
// date fin
$dateend = $this->context['formAsideSearch']->get('dateend')->getData();
if (empty($dateend) && isset($_GET['dateend'])) {
$dateend = $_GET['dateend'];
}
// pour la vue
if (!empty($dateend)) {
$this->view->dateend = $annonces->getFormeDate($dateend, $GLOBALS['format_date']['fr']);
}
// region
if (!isset($area)) {
$area = $this->context['formAsideSearch']->get('area')->getData();
}
if (empty($area) && isset($_GET['area'])) {
$area = $_GET['area'];
}
// pour la vue
if (!empty($area)) {
$this->view->area = $regions->getRegionName($area);
}
// code postal
$cp = $this->context['formAsideSearch']->get('cp')->getData();
if (empty($cp) && isset($_GET['cp'])) {
$cp = trim($_GET['cp']);
}
// pour la vue
if (!empty($cp)) {
$this->view->cp = $cp;
}
// ordre de tri
$tri = $this->context['formAsideSearch']->get('tri')->getData();
if (empty($tri) && isset($_GET['tri'])) {
$tri = $_GET['tri'];
}
if (empty($tri)) {
$tri = 'dateinsert';
}
// pour la vue
if (!empty($tri)) {
$this->view->tri = $tri;
}
// nombre de résultats par page
$nbpagelimit = $this->context['formAsideSearch']->get('nbpagelimit')->getData();
if (empty($nbpagelimit) && isset($_GET['nbpagelimit'])) {
$nbpagelimit = $_GET['nbpagelimit'];
$pagerOptions['perPage'] = $nbpagelimit;
} else {
$pagerOptions['perPage'] = $nbpagelimit;
}
$nbpage_array = array('20' => '20', '40' => '40', '60' => '60', '80' => '80');
// si pas dans le maxi/mini
if (empty($nbpagelimit) || !array_key_exists($nbpagelimit, $nbpage_array)) {
$pagerOptions['perPage'] = 20;
}
// requete normale
$sql_normal = 'SELECT a.idannonce,a.sujet,a.dateinsert,a.description,a.lieu,a.cp,c.idcategorie,c.url_clean,e.login';
// compter les resultats
$sql_count = 'SELECT COUNT(DISTINCT(a.idannonce)';
// init var
$sql = null;
// recherche
if (isset($_REQUEST['description']) && $_REQUEST['description'] == 1) {
$fields = 'a.sujet,a.description';
} else {
$fields = 'a.sujet';
}
// si mots clés
if (!empty($keywords)) {
$keywords = htmlspecialchars($keywords, ENT_COMPAT);
$keywords = trim($keywords);
$sql_normal .= ', MATCH(' . $fields . ') AGAINST (\'' . $annonces->escape($keywords) . '\') AS cpt';
$sql_count .= ', MATCH(' . $fields . ') AGAINST (\'' . $annonces->escape($keywords) . '\')';
}
// sql count suite
$sql_count .= ') as total ';
// from
$sql .= ' FROM ' . $annonces->__table . ' a
INNER JOIN ' . $categories->__table . ' c ON a.idcategorie=c.idcategorie
LEFT OUTER JOIN extranetusers e ON a.idextranetuser=e.idextranetuser';
// conditions
$sql .= ' WHERE a.online=1 AND a.valid=1 AND a.attente=0';
// recherche dans une catégorie
if (!empty($idcategorie)) {
$sql .= ' AND a.idcategorie=' . $idcategorie;
}
// on match directement
if (!empty($keywords)) {
$sql .= ' AND MATCH(' . $fields . ') AGAINST (\'' . $annonces->escape($keywords) . '\' IN BOOLEAN MODE) ';
}
// recherche par code postal ???
if (!empty($cp) && is_numeric($cp)) {
$cplen = strlen($cp);
if ($cplen >= 2 && $cplen < 5) {
$sql .= ' AND LEFT(LTRIM(a.cp),' . $cplen . ') = \'' . $annonces->escape($cp) . '\' ';
} else {
$sql .= ' AND a.cp =\'' . $annonces->escape($cp) . '\' ';
}
} elseif (!empty($area) && is_numeric($area)) {
// recherche par region (retouver les départements)
$sql .= ' AND ' . $regions->getZipCode($area, 'a', 'cp', null, 'pays');
}
// recherche avec la date
if (!empty($datestart)) {
$tabdatestart = explode('/', $datestart);
$start_year = (int)$tabdatestart[2];
$start_month = (int)$tabdatestart[1];
$start_day = (int)$tabdatestart[0];
if (checkdate((int)$start_month, (int)$start_day, (int)$start_year)) $datestart = $start_year . '-' . $start_month . '-' . $start_day;
}
if (!empty($dateend)) {
$tabdateend = explode('/', $dateend);
$end_year = (int)$tabdateend[2];
$end_month = (int)$tabdateend[1];
$end_day = (int)$tabdateend[0];
if (checkdate((int)$end_month, (int)$end_day, (int)$end_year)) $dateend = $end_year . '-' . $end_month . '-' . $end_day;
}
// recherche par date
if (!empty($datestart) && !empty($dateend)) {
// remettre en timestamp
$sql .= ' AND (a.dateinsert BETWEEN (\'' . $datestart . '\') AND (\'' . $dateend . '\'))';
}
// ordre de tri
if (!empty($tri)) {
if ($tri == 'titre') {
$sql_order = ' ORDER BY a.sujet,cpt';
}
if ($tri == 'dateinsert') {
$sql_order = ' ORDER BY a.dateinsert DESC';
}
if ($tri == 'localisation') {
$sql_order = ' ORDER BY a.cp,ctp';
}
if ($tri == 'pertinence') {
$sql_order = ' ORDER BY cpt';
}
}
//echo $sql_count.$sql;
// nombre d'enregistrement
$totalItems = $annonces->queryOne($sql_count . $sql);
if (!empty($totalItems) && $totalItems > 0) {
// tpl
$this->view->result = true;
$pagerOptions['totalItems'] = $totalItems;
$this->perPage = 20;
// pagination
$this->view->pagination = $this->getPagination($totalItems);
//limite
$limit = $annonces->dbLimit($this->perPage, $this->getLimitStart());
// executer la requete
//echo $sql_normal.$sql.$sql_order.$limit; // debug
$annonces->query($sql_normal . $sql . $sql_order . $limit);
$annonces_list = array();
$color = null;
// liste annonces
while ($annonces->fetch()) {
$ann = $annonces->getInfosAnnonceRow();
$idannonce = $ann['idannonce'];
$annonces_list[$idannonce] = $ann;
}
// passer les annonces au templates
$this->view->annonces = $annonces_list;
// liens du pager
// $paged_data['links'] = str_replace('annonces/recherche/index.php', '', $paged_data['links']);
}
}
// titre de la page
$title_page = 'Rechercher une annonce - Les petites annonces du théâtre et du spectacle';
// fil d'arianne
$this->view->locate = array('/annonces/' => 'Les petites annonces',
'' => 'Rechercher des annonces');
$this->rub_courante = 'annonces';
// style css
$this->view->style_more = array('rubrique', 'annonces');
// jquery
$this->view->jquery_cal = 'datepicker';
$asides = new asides();
$asides->load('annonce_reseau');
$asides->load('annonce_aside');
$this->view->aside = $asides->view($this->view);
return $this->view('annonces/recherche.html.twig');
}
private function getFormulaireContacterAnnonceur($request = null, $TheatreMail)
{
$annonce = $this->view->annonce;
$this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
// formulaire pour contacter un annonceur
$this->context['formFactory']->add('contact_nom', TextType::class, [
'label' => 'Votre nom',
'attr' => [
'size' => '30',
'id' => 'contact_nom'
],
'constraints' => [
new NotBlank([
'message' => 'Votre nom : veuillez préciser votre nom'
]),
new Length([
'max' => 60,
'maxMessage' => 'Votre nom : votre nom ne doit pas faire plus de 60 caractères',
])
],
]);
$this->context['formFactory']->add('contact_email', TextType::class, [
'label' => 'Votre adresse de courriel',
'attr' => [
'size' => '40',
'id' => 'contact_email'
],
// Votre adresse de courriel : votre adresse de courriel semble incorrect
'constraints' => [
new NotBlank([
'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
]),
new Email([
'message' => 'Votre adresse de courriel : votre adresse de courriel semble incorrect'
])
],
]);
$this->context['formFactory']->add('contact_message', TextareaType::class, [
'label' => 'Votre message',
'attr' => [
'cols' => '95',
'rows' => '20',
'id' => 'contact_message'
],
'constraints' => [
new NotBlank([
'message' => 'Votre message : veuillez préciser le texte de votre message'
])
],
]);
$this->context['formFactory']->add('contact_validation', SubmitType::class, [
'label' => utf8_encode(html_entity_decode('Envoyez votre message')),
'attr' => [
'class' => 'boutform'
]
]);
$this->context['formFactory']->add('copie_message', CheckboxType::class, [
'label' => 'M\'envoyer une copie de ma réponse par courriel',
'required' => false,
'attr' => [
'class' => 'checkbox'
]
]);
// captcha
if (!$this->getUser() instanceof Extranetusers) {
$this->context['formFactory']->add('recaptcha', RecaptchaType::class, [
'mapped' => false,
'empty_data' => '1',
'constraints' => [
new Recaptcha([
'request' => $request
])
]
]);
} else {
// 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
// $copie_message_extranetuser_value = 'Enregistrer ma réponse dans mon compte <em>mon théâtre</em> <a href="/montheatre/">' . $this->getUser()->getLogin() . '</a>';
$this->context['formFactory']->add('copie_message_extranetuser', CheckboxType::class, [
// 'label' => $copie_message_extranetuser_value,
'attr' => [
'checked' => 'checked',
'class' => 'checkbox'
]
]);
$this->context['view']->infos_user = $this->getUser();
}
$this->context['form'] = $this->context['formFactory']->getForm();
$this->context['form']->handleRequest($request);
if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
// email de la réponse
$contact_email = $this->context['form']->get('contact_email')->getData();
$contact_nom = $this->context['form']->get('contact_nom')->getData();
$contact_message = $this->context['form']->get('contact_message')->getData();
// envoi du message
$TheatreMail->setDestinataire($annonce['email']); // destinataire
$TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
$TheatreMail->setReplyTo($contact_email); // répondre à
$TheatreMail->setSubject('Réponse à votre annonce ' . $annonce['idannonce'] . ' sur theatre-contemporain.net');
$params_tr = array(
'num_annonce' => $annonce['idannonce'],
'sujet_annonce' => $annonce['sujet'],
'lien_annonce' => $GLOBALS['url_module'] . $annonce['url_clean'],
'contact_nom' => $contact_nom,
'contact_email' => $contact_email,
'contact_message' => $contact_message,
);
$TheatreMail->prepare('emails/message_contact_annonce.html.twig', $params_tr);
try {
$TheatreMail->send();
$this->view->reponse['ok'] = 'Votre message a bien été envoyé à l\'annonceur.';
$this->context['view']->contact_ok = true;
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$this->view->error['no'] = $this->context['tr']->trans('error_generique_sendmessage');
}
// si demandé, envoi d'une copie du message par mail au lecteur/répondeur
$copie_message = $this->context['form']->get('copie_message')->getData();
if ($copie_message == 1) {
$TheatreMail->setDestinataire($contact_email); // destinataire
$TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
$TheatreMail->setReplyTo($contact_email); // répondre à
$TheatreMail->setSubject('Votre réponse à l\'annonce ' . $annonce['idannonce'] . ' sur theatre-contemporain.net');
$params_tr = array(
'num_annonce' => $annonce['idannonce'],
'sujet_annonce' => $annonce['sujet'],
'lien_annonce' => $GLOBALS['url_module'] . $annonce['url_clean'],
'contact_nom' => $contact_nom,
'contact_email' => $contact_email,
'contact_message' => $contact_message
);
$TheatreMail->prepare('emails/message_contact_annonce_copie.html.twig', $params_tr);
try {
$TheatreMail->send();
$this->view->reponse['ok_copie'] = 'Une copie de votre réponse vous a été envoyée.';
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$this->view->error['no_copie'] = $this->context['tr']->trans('error_generique_sendmessage');
}
}
// enregistrement de la réponse demandée par l'annonceur ou par l'extranetuser
$copie_message_extranetuser = 0;
if ($this->context['form']->has('copie_message_extranetuser')) {
$copie_message_extranetuser = $this->context['form']->get('copie_message_extranetuser')->getData();
}
// uniquement si l'annonceur à le choix d'enregistrer les réponses !
if ($annonce['copie_reponse'] == 1 || !empty($copie_message_extranetuser)) {
$ann_reponses = $this->em->getRepository(AnnReponses::class);
// reponse
$reponse_values = array(
'sujet_annonce' => $annonce['sujet'],
'reponse' => $contact_message,
'idannonce' => $annonce['idannonce'],
'annonceur_view' => $annonce['copie_reponse'],
'lecteur_nom' => $contact_nom,
'lecteur_email' => $contact_email,
);
// enregistrer le lecteur si c'est un extranetuser
if ($this->getUser() instanceof Extranetusers) {
$reponse_values['idextranetuser'] = $this->getUser()->getIdextranetuser();
// le lecteur veux voir sa réponse
if ($copie_message_extranetuser) {
$reponse_values['lecteur_view'] = $copie_message_extranetuser;
}
}
$ann_reponses->saveReponse($reponse_values);
// TODO : envoyer un mail à technique@ si erreur
}
} else {
if ($this->getUser() instanceof Extranetusers) {
$this->context['form']->get('contact_email')->setData($this->getUser()->getEmail());
$this->context['form']->get('contact_nom')->setData($this->getUser()->getFirstname() . ' ' . $this->getUser()->getLastname());
}
}
//On envoie à la vue, le formulaire.
$this->context['view']->form_contact_annonceur = $this->context['form']->createView();
}
private function getFormulaireSignalement($request = null, $TheatreMail = null)
{
$this->context['formFactory'] = $this->get('form.factory')->createBuilder(FormType::class, null, [
'attr' => [
'id' => 'masterform'
]
]);
// formulaire pour signaler un pb
$this->context['formFactory']->add('signaler_nom', TextType::class, [
'label' => 'Votre nom',
'attr' => [
'size' => '30'
],
'constraints' => [
new NotBlank([
'message' => 'Votre nom : veuillez préciser votre nom'
]),
new Length([
'max' => 60,
'maxMessage' => 'Votre nom : votre nom ne doit pas faire plus de 60 caractères',
])
],
]);
$this->context['formFactory']->add('signaler_email', TextType::class, [
'label' => 'Votre adresse de courriel',
'attr' => [
'size' => '40'
],
'constraints' => [
new NotBlank([
'message' => 'Votre adresse de courriel : veuillez préciser votre adresse de courriel'
]),
new Email([
'message' => 'Votre adresse de courriel : votre adresse de courriel semble incorrect'
])
]
]);
$this->context['formFactory']->add('signaler_message', TextareaType::class, [
'label' => 'Motif du signalement',
'attr' => [
'cols' => '110',
'rows' => '20'
],
'constraints' => [
new NotBlank([
'message' => 'Motif : merci de préciser la raison de ce signalement'
]),
]
]);
$this->context['formFactory']->add('signaler_validation', SubmitType::class, [
'label' => utf8_encode(html_entity_decode('Envoyez votre message')),
'attr' => [
'class' => 'boutform'
]
]);
// captcha si pas loggué
if (!$this->getUser() instanceof Extranetusers) {
if ($this->getParameter('captcha_active')) {
$this->context['formFactory']->add('recaptcha', RecaptchaType::class, [
'mapped' => false,
'empty_data' => '1',
'constraints' => [
new Recaptcha([
'request' => $request
])
]
]);
}
}
$this->context['form'] = $this->context['formFactory']->getForm();
$this->context['form']->handleRequest($request);
if ($this->context['form']->isSubmitted() && $this->context['form']->isValid()) {
// supprimer les tags html
$signaler_nom = $this->context['form']->get('signaler_nom')->getData();
$signaler_message = $this->context['form']->get('signaler_message')->getData();
$signaler_email = $this->context['form']->get('signaler_email')->getData();
// envoi du message
$TheatreMail->setDestinataire($_ENV['CONTACT_MAIL']); // destinataire
$TheatreMail->setExpediteur($_ENV['CONTACT_MAIL']); // expediteur et return-path
$TheatreMail->setReplyTo($signaler_email); // répondre à
$TheatreMail->setSubject('Annonce signalée sur theatre-contemporain.net');
$params_tr = array(
'lien_annonce' => $GLOBALS['url_module'] . $this->view->annonce['url_clean'],
'signaler_nom' => $signaler_nom,
'signaler_email' => $signaler_email,
'signaler_message' => $signaler_message
);
$TheatreMail->prepare('emails/message_signaler_annonce.html.twig', $params_tr, 'emails/message_signaler_annonce.txt.twig');
try {
$TheatreMail->send();
$this->view->reponse['ok'] = 'Votre message a bien été envoyé.';
$this->context['view']->signaler_ok = true;
} catch (\Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($e->getTraceAsString());
$this->view->error['no'] = $this->context['tr']->trans('error_generique_sendmessage');
}
}
//On envoie à la vue, le formulaire.
$this->context['view']->form = $this->context['form']->createView();
}
public function getRechercheAnnonce($request = null, $categories_list = [])
{
$regions = $this->em->getRepository(Bigregions::class);
$formAsideSearch = $this->get('form.factory')->createNamedBuilder('', FormType::class);
// element de recherche
// formulaire de saisie
$formAsideSearch->add('keywords_annonces', TextType::class, [
'label' => 'Mots clés',
'required' => false,
'attr' => [
'size' => '35',
'id' => 'keywords_annonces'
]
]);
$formAsideSearch->add('idcategorie', ChoiceType::class, [
'label' => 'Catégorie',
'placeholder' => 'Liste des catégories',
'choices' => array_flip($categories_list),
'required' => false,
'attr' => [
'id' => 'idcategorie'
]
]);
$formAsideSearch->add('datestart', TextType::class, [
'label' => 'Entre',
'required' => false,
'attr' => [
'size' => '10',
'id' => 'datestart',
'placeholder' => 'Début'
]
]);
$formAsideSearch->add('dateend', TextType::class, [
'label' => 'et',
'required' => false,
'attr' => [
'size' => '10',
'id' => 'dateend',
'placeholder' => 'Fin'
]
]);
$formAsideSearch->add('area', ChoiceType::class, [
'label' => 'Région',
'placeholder' => 'par région',
'required' => false,
'choices' => array_flip($regions->getArea()),
'attr' => [
'class' => 'select_language',
'id' => 'area'
]
]);
$formAsideSearch->add('cp', TextType::class, [
'label' => 'Code postal',
'required' => false,
'attr' => [
'size' => 10,
'id' => 'cp'
]
]);
$formAsideSearch->add('validation', SubmitType::class, [
'label' => 'Recherche',
'attr' => [
'class' => 'boutform'
]
]);
// nombre de resultat pas page
$nbpage_array = array('20' => '20', '40' => '40', '60' => '60', '80' => '80');
$formAsideSearch->add('nbpagelimit', ChoiceType::class, [
'label' => 'Résultats par page',
'choices' => $nbpage_array
]);
// criteres de tri
$tri_array = array(
'dateinsert' => 'Date de publication',
'titre' => 'Titre',
'cp' => 'Code postal');
$formAsideSearch->add('tri', ChoiceType::class, [
'label' => 'Trier par',
'required' => false,
'choices' => array_flip($tri_array)
]);
// sur le titre ou sur titre+description
$formAsideSearch->add('description', CheckboxType::class, [
'label' => 'Rechercher aussi le descriptif',
'required' => false,
'attr' => [
'class' => 'checkbox'
]
]);
$this->context['formAsideSearch'] = $formAsideSearch;
$this->getCommonSearchView($request);
}
}