<?php
namespace App\Controller\Forum;
use App\Entity\Forum;
use App\EntityManager\ForumManager;
use App\Form\Forum\SearchForumType;
use App\Model\SearchForum;
use App\Security\Voter\ForumVoter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class ForumController
* @package App\Controller\Forum
* @Route("/forum")
*/
class ForumController extends AbstractController
{
/**
* @var ForumManager
*/
protected $forumManager;
public function __construct(ForumManager $forumManager)
{
$this->forumManager = $forumManager;
}
/**
* @Route("", name="forum_index")
* @Template()
*/
public function index()
{
$categories = $this->forumManager->getIndexList();
return [
'categories' => $categories,
];
}
/**
* @Route("/{id<\d+>}", name="forum_view")
* @IsGranted(ForumVoter::VIEW, subject="forum")
* @Template()
*/
public function view(Forum $forum)
{
$this->forumManager->updateLastVisit($forum);
$topics = $this->forumManager->getTopicList($forum);
$mods = $this->forumManager->getModList($forum);
return [
'forum' => $forum,
'topics' => $topics,
'forumModerators' => $mods,
];
}
/**
* @Route("/tracked", name="forum_topic_view_tracked")
* @Template()
*/
public function viewTracked()
{
$topics = $this->forumManager->getTrackedTopicList();
return [
'topics' => $topics,
];
}
/**
* @Route("/search", name="forum_search")
* @Template()
*/
public function search(Request $request)
{
$searchObject = new SearchForum();
if (!is_null($forum = $request->query->get('forum'))) {
$forum = $this->getDoctrine()->getRepository(Forum::class)->find($forum);
if ($forum instanceof Forum) {
$searchObject->setForum($forum);
}
}
if (!is_null($author = $request->query->get('author'))) {
$searchObject->setAuthor($author);
}
$searchForm = $this->createForm(
SearchForumType::class,
$searchObject,
[
'action' => $this->generateUrl('forum_search_results'),
'method' => Request::METHOD_GET,
]
);
return [
'form' => $searchForm->createView(),
];
}
/**
* @Route("/search_results", name="forum_search_results")
* @Template()
*/
public function searchResults(Request $request)
{
$searchObject = new SearchForum();
$searchForm = $this->createForm(SearchForumType::class, $searchObject, ['method' => Request::METHOD_GET]);
$searchForm->handleRequest($request);
if ($searchForm->isSubmitted() && $searchForm->isValid()) {
$results = $this->forumManager->search($searchObject);
return $this->render(
'forum/forum/search_results.html.twig',
[
'results' => $results,
'searchObject' => $searchObject,
]
);
}
return $this->redirectToRoute('forum_search');
}
}