<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\QuestionAnswer;
use App\Entity\Structure;
use App\Entity\Tag;
use App\Entity\Theme;
use Knp\Component\Pager\PaginatorInterface;
class StructureController extends AbstractController
{
/**
* @Route("/structure/{id}", name="showStructure", requirements={"id"="\d+"})
*/
public function showStructure(Request $request, $id)
{
$structure = $this->getDoctrine()->getRepository(Structure::class)->find($id);
if (!$structure) {
throw $this->createNotFoundException('Pas de structure avec l\'id ' . $id . '.');
// the above is just a shortcut for:
// throw new NotFoundHttpException('The product does not exist');
}
if (!$structure->getPublished()) {
$redirectUrl = $this->_notPublished($request);
if($redirectUrl) return $this->redirect($redirectUrl);
}
$slug = $structure->getSlug();
if($slug && $slug !== "") {
return $this->redirect($this->generateUrl('showStructureBySlug', ['slug' => $slug]));
} else {
return $this->render('structure/show.html.twig', [
'structure' => $structure
]);
}
}
/**
* @Route("/structure/{slug}", name="showStructureBySlug")
*/
public function showStructureBySlug(Request $request, $slug)
{
$structure = $this->getDoctrine()->getRepository(Structure::class)->findOneBySlug($slug);
if (!$structure) {
throw $this->createNotFoundException('Pas de structure avec le slug "' . $slug . '".');
}
if (!$structure->getPublished()) {
$redirectUrl = $this->_notPublished($request);
if($redirectUrl) return $this->redirect($redirectUrl);
}
return $this->render('structure/show.html.twig', [
'structure' => $structure
]);
}
/**
* action if entity not published
* @return string $redirectUrl
*/
private function _notPublished($request) {
if(!$this->isGranted('ROLE_ADMIN')) {
$requestUri = $request->getRequestUri();
$baseUrl = $request->getSchemeAndHttpHost();
$this->addFlash(
'error-popup',
'L\'url demandée : "' . $baseUrl . $requestUri . '" n\'existe pas.'
);
$referer = $request->headers->get('referer');
if(null != $referer && substr($referer, 0, strlen($baseUrl)) === $baseUrl) {
// on retourne de là oú l'on vient, si l'on vient de ce site
$redirectUrl = substr($referer, strlen($baseUrl));
} else {
// pas de referer trouvé ou appel depuis site extérieur, on va donc à la home
$redirectUrl = $this->generateUrl('home');
}
} else {
// rôle admin, on laisse consulter
$this->addFlash(
'notice',
'Cette structure n\'est pas publiée. En tant qu\'admin vous pouvez toutefois la voir.'
);
$redirectUrl = null;
}
return $redirectUrl;
}
/**
* @Route("/structure/teasers/{ids}", name="showSearchResult")
* @param string $ids liste d'ids séparées par des tirets
* @param bool $listWithThumbnails si on veut afficher une liste d'images, sinon liste textuelle
*/
public function showSearchResult($ids, $listWithThumbnails = false)
{
$ids = explode("-", $ids); // $ids devient un array d'ids
$structures = [];
foreach ($ids as $id) {
$structure = $this->getDoctrine()->getRepository(Structure::class)->find($id);
if($structure) {
$key = sprintf('%08d', $structure->getPriority()) . "_" . substr($structure->getName(), 0, 20) . "_" . sprintf('%08d', $structure->getId()); // pour ksort par la suite
if(! isset($structures[$key])) $structures[$key] = $structure;
}
}
krsort($structures);
return $this->render('structure/searchResult.html.twig', [
'listWithThumbnails' => $listWithThumbnails,
'structures' => $structures
]);
}
/**
* affiche la liste des structures non géolocalisées
* @Route("/structures/non-geolocalisees", name="listNonGeolocalizedStructures")
*/
public function listNonGeolocalizedStructures(Request $request, PaginatorInterface $paginator, $pageLimit = 30)
{
$title = "Structures non-géolocalisées";
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
// $structures = $structureRepository->findAllUnlocalized();
$pageNb = $request->query->getInt('page', 1);
$structures = $paginator->paginate(
$structureRepository->getAllUnlocalizedQuery(), /* query NOT result */
$pageNb, /*page number*/
$pageLimit /*limit per page*/
);
return $this->render('structure/list.html.twig', [
'structures' => $structures,
'pageNb' => $pageNb,
'pageLimit' => $pageLimit,
'title' => $title
]);
}
/**
* affiche la liste des structures non géolocalisées
* @Route("/structures/geolocalisees", name="listGeolocalizedStructures")
*/
public function listGeolocalizedStructures(Request $request, PaginatorInterface $paginator, $pageLimit = 30)
{
$title = "Structures géolocalisées";
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
// $structures = $structureRepository->findAllLocalized();
$pageNb = $request->query->getInt('page', 1);
$structures = $paginator->paginate(
$structureRepository->getAllLocalizedQuery(), /* query NOT result */
$pageNb, /*page number*/
$pageLimit /*limit per page*/
);
return $this->render('structure/list.html.twig', [
'structures' => $structures,
'pageNb' => $pageNb,
'pageLimit' => $pageLimit,
'title' => $title
]);
}
/**
* affiche la liste des structures par tag ou par theme
* @Route("/structures-by-t/{type}/{slug}", name="listGeolocalizedStructuresByT", requirements={"type"="tag|theme"})
* @return JsonResponse avec la liste des infos necessaires par structure
*/
public function listGeolocalizedStructuresByT($type, $slug = null, $limit = 100)
{
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
if(null == $slug) {
$structures = $structureRepository->findAllLocalized($limit);
} else {
switch ($type) {
case 'tag':
$tagRepository = $this->getDoctrine()->getRepository(Tag::class);
$entity = $tagRepository->findOneBySlug($slug);
break;
case 'theme':
$themeRepository = $this->getDoctrine()->getRepository(Theme::class);
$entity = $themeRepository->findOneBySlug($slug);
break;
}
if(!$entity) throw $this->createNotFoundException('Pas de ' . $type . ' avec le slug "' . $slug . '".');
$structures = $structureRepository->findAllLocalizedByT($entity, $limit);
}
$formattedStructures = $this->_setFormattedStructuresForMap($structures);
$response = new JsonResponse();
$response->setData([
'items' => $formattedStructures
]);
// dump($structures); dump($formattedStructures); dump($response); exit;
return $response;
}
/**
* affiche la liste des structures par tag ou par theme
* @Route("/structures-by-t/{id}", name="setGeolocalizedStructure", requirements={"id"="\d+"})
* @return JsonResponse avec la liste des infos necessaires pour la structure
*/
public function setGeolocalizedStructure($id)
{
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
$structure = $structureRepository->find($id);
if(!$structure) throw $this->createNotFoundException('Pas de structure avec l\'id "' . $id . '".');
$structures = [$structure];
if(! $structure->getLongitude() || ! $structure->getLatitude()) $structures = [];
$formattedStructures = $this->_setFormattedStructuresForMap($structures);
$response = new JsonResponse();
$response->setData([
'items' => $formattedStructures
]);
// dump($structures); dump($formattedStructures); dump($response); exit;
return $response;
}
/**
* sous fonction pour formatter la réponse pour affichage sur carte de la liste des structures
* @return Array $formattedStructures avec la liste des infos necessaires pour la structure
*/
private function _setFormattedStructuresForMap($structures)
{
$formattedStructures = [];
foreach ($structures as $structure) {
if( $structure->getSlug() ) {
$url = $this->generateUrl('showStructureBySlug', ['slug' => $structure->getSlug()]);
} else {
$url = $this->generateUrl('showStructure', ['id' => $structure->getId()]);
}
if( $structure->getAddress() ) {
$town = $structure->getTown() ? " " . $structure->getTown() : "";
$postalCode = $structure->getPostalCode() ? " " . $structure->getPostalCode() : "";
$descr = $structure->getAddress() . $postalCode . $town;
} else {
$descr = $structure->getName();
}
$formattedStructure = [
'long' => $structure->getLongitude(),
'lat' => $structure->getLatitude(),
'title' => $structure->getTitle(),
'subtitle' => $structure->getSubtitle(),
'name' => $structure->getName(),
'descr' => $descr,
'url' => $url
];
$formattedStructures[] = $formattedStructure;
}
return $formattedStructures;
}
/**
* affiche la liste des structures partageant un tag avec la structure donnee
* @Route("/same-structures/{id}/{limit}", name="listSame", requirements={"id"="\d+"})
* @return Structure[]
*/
public function listSame($id, $limit = 10)
{
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
$structure = $structureRepository->find($id);
if(!$structure) throw $this->createNotFoundException('Pas de structure avec l\'id "' . $id . '".');
$tags = $structure->getTags();
$structures = $structureRepository->findBySameTags($tags, $limit, $structure);
$questionAnswerRepository = $this->getDoctrine()->getRepository(QuestionAnswer::class);
$questionAnswers = $questionAnswerRepository->findBySameTags($tags, $limit);
// dump($structures); exit;
return $this->render('structure/listSame.html.twig', [
'structures' => $structures,
'questionAnswers' => $questionAnswers
]);
}
}