<?php
namespace App\Controller;
use App\Entity\Form;
use App\Entity\AbstractPage;
use App\Entity\ServiceCategory;
use App\Entity\User;
use App\Entity\UserPage;
use App\Entity\UserForm;
use App\Form\FormFactory;
use App\Mail\MailDispatcher;
use App\Mail\MailEvent;
use App\Repository\AboutCategoryRepository;
use App\Repository\FormRepository;
use App\Repository\ServiceCategoryRepository;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Routing\Annotation\Route;
class PageController extends AbstractController
{
/**
* @Route("/{id}/{filename}", name="user_file", requirements={"id": "\d+"})
*
* @param User $user
* @param $filename
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getFile(User $user, $filename)
{
if ($user !== $this->getUser() && !$this->isGranted('ROLE_ADMIN')) {
throw $this->createNotFoundException('Vous n\'avez pas accès à ce fichier');
}
$projectDir = $this->getParameter('kernel.project_dir');
$fileDir = $projectDir .'/files/'.$user->getId().'/'.$filename;
if (!file_exists($fileDir)) {
throw $this->createNotFoundException('Ce fichier n\'existe pas');
}
return $this->file($fileDir, $filename, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/espace-client/formulaire/{id}/{user_id}", name="form", defaults={"user_id" = null}, requirements={"user_id": "\d+"})
*
* @param Form $form
* @param FormFactory $factory
* @param Request $request
*
*
* @return \Symfony\Component\HttpFoundation\Response
* @ParamConverter("user", options={"id" = "user_id"})
*/
public function form(Form $form, FormFactory $factory, Request $request, EntityManagerInterface $entityManager, MailDispatcher $mailDispatcher, User $user = null)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$isAdmin = false;
if (empty($user)) {
$user = $this->getUser();
} else {
$isAdmin = true;
$this->denyAccessUnlessGranted('ROLE_ADMIN');
}
$userForm = $entityManager->getRepository(UserForm::class)
->findOneBy(['user' => $user, 'form' => $form]);
if (empty($userForm)) {
$userForm = new UserForm($user, $form);
$entityManager->persist($userForm);
}
if ($isAdmin) {
$userForm->setChangeViewed(true);
$entityManager->flush();
} else {
$userForm->setChangeViewed(false);
}
$formType = $factory->build($form, $userForm);
$formType->handleRequest($request);
if ($formType->isSubmitted() && $formType->isValid()) {
if($request->isXmlHttpRequest()) {
return $this->json([
'progress' => $userForm->getProgression()
]);
}
foreach ($formType->getData() as $step) {
foreach ($step as $field) {
$entityManager->persist($field);
}
}
$entityManager->flush();
$event = new MailEvent(['user' => $user, 'form' => $form]);
$mailDispatcher->dispatch(MailEvent::FORM_COMPLETED, $event);
}
$form_view = $formType->createView();
return $this->render('page/form.html.twig', ['form' => $form, 'form_view' => $form_view, 'isAdmin' => $isAdmin, 'user' => $user, 'userForm' => $userForm]);
}
/**
* @Route("/espace-client/formulaire/{id}/view/{user_id}", name="form_view", defaults={"user_id" = null})
*
* @param Form $form
* @param FormFactory $factory
* @param Request $request
*
*
* @return \Symfony\Component\HttpFoundation\Response
* @ParamConverter("user", options={"id" = "user_id"})
*/
public function formView(Form $form, FormFactory $factory, Request $request, EntityManagerInterface $entityManager, User $user = null)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$isAdmin = false;
if (empty($user)) {
$user = $this->getUser();
} else {
$isAdmin = true;
$this->denyAccessUnlessGranted('ROLE_ADMIN');
}
$userForm = $entityManager->getRepository(UserForm::class)
->findOneBy(['user' => $user, 'form' => $form]);
if (!$userForm instanceof UserForm) {
throw $this->createNotFoundException();
}
if ($isAdmin) {
$userForm->setChangeViewed(true);
$entityManager->flush();
}
$formType = $factory->build($form, $userForm);
$form_view = $formType->createView();
return $this->render('page/form_view.html.twig', [
'form' => $form,
'form_view' => $form_view, 'isAdmin' => $isAdmin, 'user' => $user, 'userForm' => $userForm]);
}
/**
*
* @ParamConverter("page", options={"repository_method"="findPageByUrl", "map_method_signature"=true})
* @param AbstractPage $page
* @param ServiceCategoryRepository $serviceCategoryRepository
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function index(AbstractPage $page, ServiceCategoryRepository $serviceCategoryRepository, AboutCategoryRepository $aboutCategoryRepository, FormRepository $formRepository)
{
if ($page->getRequireUser()) {
$this->denyAccessUnlessGranted('ROLE_USER');
}
if (!$page->getPublic()) {
throw $this->createNotFoundException('Page non publiée');
}
$data = [
'page' => $page,
'user' => $this->getUser(),
'serviceCategories' => $serviceCategoryRepository->findBy(['public' => true]),
'aboutCategories' => $aboutCategoryRepository->findBy(['public' => true], ['sort' => 'asc']),
'forms' => $formRepository->findBy(['public' => true])
];
return $this->render($page->getTemplate(), $data);
}
}