<?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\Article;
use App\Entity\Event;
use App\Entity\QuestionAnswer;
use App\Entity\Structure;
use App\Entity\Tag;
use App\Form\RechercheType;
class TagController extends AbstractController
{
/**
* @Route("/tags", name="tagsList")
*/
public function tagsList(Request $request)
{
/* // -> rendered in template
$searchForm = $this->createForm(RechercheType::class); // cf. https://symfony.com/doc/current/form/without_class.html
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$term = $searchForm->getData()["term"];
// $term = $request->request->get('recherche')["term"]; // fonctionne aussi
// dump($searchForm->getData()); dump($request->request->get('recherche')["term"]); exit;
return $this->redirect($this->generateUrl('showTagBySlug', ['slug' => $term]));
}
*/
$tagRepository = $this->getDoctrine()->getRepository(Tag::class);
$tags = $tagRepository->findAllOrdered();
return $this->render('tag/list.html.twig', [
'tags' => $tags,
// 'searchForm' => $searchForm->createView(),
]);
}
/**
* @Route("/tag/autocomp_tag/", name="autocomp_tag")
*/
public function autocompleteTag(Request $request) {
$q = $request->query->get('term'); // use "term" instead of "q" for jquery-ui
$autocompleteResults = $this->getDoctrine()->getRepository(Tag::class)->findLikeName($q);
// dump($autocompleteResults);exit;
$tagNames = [];
foreach ($autocompleteResults as $tag) {
$tagNames[] = ["label" => $tag->getName(), "value" => $tag->getSlug()];
}
$response = new JsonResponse();
$response->setData([
'items' => $tagNames
]);
return $response;
}
/**
* @Route("/tag/show-form", name="showTagForm")
*/
public function showTagForm(Request $request)
{
$searchForm = $this->createForm(RechercheType::class, null, [
'action' => $this->generateUrl('showTagFormResult'),
]);
// cf. https://symfony.com/doc/current/form/without_class.html
// cf. https://symfony.com/doc/current/forms.html#changing-the-action-and-http-method
return $this->render('tag/showForm.html.twig', [
'searchForm' => $searchForm->createView(),
]);
}
/**
* @Route("/tag/show-form-result", name="showTagFormResult")
*/
public function showTagFormResult(Request $request)
{
$term = $request->request->get('recherche')["term"];
if($term) {
$tagRepository = $this->getDoctrine()->getRepository(Tag::class);
$tag = $tagRepository->findOneBySlug($term);
if($tag) {
return $this->redirect($this->generateUrl('showTagBySlug', ['slug' => $term]));
} else {
$errorMsg = 'Pas de mot-clé correspondant à "' . $term . '" !';
}
} else {
$errorMsg = 'Vous n\'avez pas défini de terme!';
}
$this->addFlash(
'error-popup',
$errorMsg
);
$referer = $request->headers->get('referer');
if ($referer != null) {
return $this->redirect($referer);
} else {
return $this->redirect($this->generateUrl('home'));
}
}
/**
* @Route("/tag/{id}", name="showTag", requirements={"id"="\d+"})
*/
public function showTag($id)
{
$tag = $this->getDoctrine()->getRepository(Tag::class)->find($id);
if (!$tag) {
throw $this->createNotFoundException('Pas de tag avec l\'id ' . $id . '.');
}
$slug = $tag->getSlug();
if($slug && $slug !== "") {
return $this->redirect($this->generateUrl('showTagBySlug', ['slug' => $slug]));
} else {
$entities = $this->_getEntitiesForTag($tag);
extract($entities);
$events = []; // on ne veut pas les évènements...
return $this->render('tag/show.html.twig', [
'tag' => $tag,
'articles' => $articles,
'events' => $events,
'questionAnswers' => $questionAnswers,
'structures' => $structures
]);
}
}
/**
* @Route("/tag/{slug}", name="showTagBySlug")
* @param bool $listWithThumbnails si on veut afficher une liste d'images, sinon liste textuelle
*/
public function showTagBySlug($slug, $listWithThumbnails = true)
{
$tagRepository = $this->getDoctrine()->getRepository(Tag::class);
$tag = $tagRepository->findOneBySlug($slug);
if ($tag) {
$entities = $this->_getEntitiesForTag($tag);
extract($entities);
} else {
// throw $this->createNotFoundException('Pas de tag avec le slug ' . $slug . '.');
$tag = null;
$articles = [];
$events = [];
$questionAnswers = [];
$structures = [];
}
return $this->render('tag/show.html.twig', [
'listWithThumbnails' => $listWithThumbnails,
'slug' => $slug,
'tag' => $tag,
'articles' => $articles,
'events' => $events,
'questionAnswers' => $questionAnswers,
'structures' => $structures
]);
}
/**
* @param Tag $tag
* @return array $entities ["articles", "events", "questionAnswers", "structures"]
*/
private function _getEntitiesForTag($tag) {
$articleRepository = $this->getDoctrine()->getRepository(Article::class);
$eventRepository = $this->getDoctrine()->getRepository(Event::class);
$questionAnswerRepository = $this->getDoctrine()->getRepository(QuestionAnswer::class);
$structureRepository = $this->getDoctrine()->getRepository(Structure::class);
$articles = [];
// on ne veut pas les articles...
// $articlesByTag = $articleRepository->findAllByTag($tag);
// foreach ($articlesByTag as $article) {
// if( ! isset($articles[$article->getId()]) ) $articles[$article->getId()] = $article;
// }
$events = [];
// on ne veut pas les évènements...
// $eventsByTag = $eventRepository->findAllByTag($tag);
// foreach ($eventsByTag as $event) {
// if( ! isset($events[$event->getId()]) ) $events[$event->getId()] = $event;
// }
$questionAnswers = [];
$questionAnswersByTag = $questionAnswerRepository->findAllByTag($tag);
foreach ($questionAnswersByTag as $questionAnswer) {
if( ! isset($questionAnswers[$questionAnswer->getId()]) ) $questionAnswers[$questionAnswer->getId()] = $questionAnswer;
}
$structures = [];
$structuresByTag = $structureRepository->findAllByTag($tag);
foreach ($structuresByTag as $structure) {
if( ! isset($structures[$structure->getId()]) ) $structures[$structure->getId()] = $structure;
}
$entities = [
"articles" => $articles,
"events" => $events,
"questionAnswers" => $questionAnswers,
"structures" => $structures
];
return $entities;
}
}