<?php
namespace App\Controller;
use App\Entity\Resource;
use App\Form\ResourceType;
use App\Annotation\CmsAdminDash;
use App\Annotation\CmsComponent;
use App\Entity\ResourceCategory;
use App\Repository\ResourceRepository;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/takeflight/resource')]
class ResourceController extends AbstractController
{
/**
* @CmsAdminDash("Resources", active=true, routeName="app_resource_index",icon="fa fa-file-text-o", menuPosition=10, parentRouteName="control_resource_category_index")
*/
#[Route('/', name: 'app_resource_index', methods: ['GET'])]
public function index(ResourceRepository $resourceRepository): Response
{
return $this->render('resource/index.html.twig', [
'resources' => $resourceRepository->findBy(['deleted' => false]),
]);
}
#[Route('/new', name: 'app_resource_new', methods: ['GET', 'POST'])]
public function new(Request $request): Response
{
$resource = new Resource();
$form = $this->createForm(ResourceType::class, $resource);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// REQUIRED IF USING UPLOAD FILE TRAIT
$resource->uploadFile();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($resource);
$entityManager->flush();
return $this->redirectToRoute('app_resource_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('resource/new.html.twig', [
'resource' => $resource,
'form' => $form->createView(),
]);
}
#[Route('/{id}', name: 'app_resource_show', methods: ['GET'])]
public function show(Resource $resource): Response
{
return $this->render('resource/show.html.twig', [
'resource' => $resource,
]);
}
#[Route('/{id}/edit', name: 'app_resource_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Resource $resource): Response
{
$form = $this->createForm(ResourceType::class, $resource);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// REQUIRED IF USING UPLOAD FILE TRAIT
$resource->uploadFile();
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('app_resource_index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('resource/edit.html.twig', [
'resource' => $resource,
'form' => $form->createView(),
]);
}
#[Route('/{id}', name: 'app_resource_delete', methods: ['POST'])]
public function delete(Request $request, Resource $resource): Response
{
if ($this->isCsrfTokenValid('delete'.$resource->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$resource->setActive(false);
$resource->setDeleted(true);
$entityManager->persist($resource);
$entityManager->flush();
$this->addFlash('success', 'Success - Resource deleted');
}
return $this->redirectToRoute('app_resource_index', [], Response::HTTP_SEE_OTHER);
}
/**
* @CmsComponent("Embed Resources", active=true, routeName="embed_resources")
*/
#[Route(path: '/pcgc-resources', name: 'embed_resources')]
public function embedResources(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator): Response
{
$category = null;
$perpage = 12;
$query = $em->createQueryBuilder('e')
->select('e')
->from(Resource::class, 'e')
->where('e.deleted = 0')
->andWhere('e.active = 1')
->orderBy('e.sortOrder', 'ASC');
$categoryIds = $this->sanitiseCategoryIds($request);
if ($categoryIds) {
$query
->andWhere('e.category IN (:categories)')
->setParameter('categories', $categoryIds);
}
$searchParam = $request->query->get('search', null);
if ($searchParam !== null) {
$query
->andWhere('e.title LIKE :search OR e.content LIKE :search OR e.file LIKE :search')
->setParameter('search', '%'.$searchParam.'%')
;
}
$paginatedResources = $paginator->paginate($query, $request->query->getInt('page', 1), $perpage);
return $this->render('@theme/resource/index.html.twig', [
'resources' => $paginatedResources,
'category' => $category,
'categoryIds' => $categoryIds,
'searchParam' => $searchParam,
]);
}
/**
* @CmsComponent("Embed Resources Filters", active=true, routeName="embed_resources_filters")
*/
#[Route(path: '/pcgc-resources-filters', name: 'embed_resources_filters')]
public function embedResourceFilters(Request $request, EntityManagerInterface $em): Response
{
$categoryIds = $this->sanitiseCategoryIds($request);
$searchParam = $request->query->get('search', null);
$categories = $em->getRepository(ResourceCategory::class)->findBy(['deleted' => false, 'active' => true], ['sortOrder' => 'ASC']);
return $this->render('@theme/resource/filters.html.twig', [
'categories' => $categories,
'categoryIds' => $categoryIds,
'searchParam' => $searchParam,
]);
}
private function sanitiseCategoryIds(Request $request): array
{
$categoryIds = $request->query->get('category', []);
// check if categoryIds is an array and only contains numeric values
if (!is_array($categoryIds) || array_filter($categoryIds, 'is_numeric') !== $categoryIds) {
$categoryIds = [];
}
return $categoryIds;
}
}