src/Controller/Frontend/EinsendungController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Application\Content\ContentFrontendData;
  4. use App\Application\Content\ContentService;
  5. use App\Application\Einsendung\EinsendungService;
  6. use App\Entity\Einsendung\Leserbrief;
  7. use App\Entity\Einsendung\Nachruf;
  8. use App\Entity\Einsendung\Todesanzeige;
  9. use App\Entity\Einsendung\Vereinsbeitrag;
  10. use App\Form\Einsendung\LeserbriefType;
  11. use App\Form\Einsendung\NachrufType;
  12. use App\Form\Einsendung\TodesanzeigeType;
  13. use App\Form\Einsendung\VereinsbeitragType;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\Filesystem\Filesystem;
  17. use Symfony\Component\Finder\Finder;
  18. use Symfony\Component\HttpFoundation\File\UploadedFile;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpKernel\KernelInterface;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Validator\Constraints\Image;
  25. use Symfony\Component\Validator\Validator\ValidatorInterface;
  26. #[Route(path: '/einsendungen')]
  27. class EinsendungController extends AbstractController
  28. {
  29. #[Route(path: '/', name: 'fe.page_einsendungen')]
  30. public function einsendungen(ContentService $contentService): Response
  31. {
  32. $content = $contentService->getContentByCode('EINSENDUNGEN', new ContentFrontendData(), true);
  33. return $this->render('frontend/page/page-template.html.twig', [
  34. 'h1_title' => 'Einsendungen',
  35. 'content' => $content,
  36. ]);
  37. }
  38. #[Route(path: '/einsendung-ok', name: 'fe.einsendung_ok')]
  39. public function meldenOk(): Response
  40. {
  41. return $this->render('frontend/einsendung/einsendung-ok.html.twig');
  42. }
  43. #[Route(path: '/leserbrief', name: 'fe.einsendung_leserbrief')]
  44. public function leserbrief(
  45. Request $request,
  46. EinsendungService $einsendungService
  47. ): Response {
  48. $leserbrief = new Leserbrief();
  49. $form = $this->createForm(LeserbriefType::class, $leserbrief);
  50. $form->handleRequest($request);
  51. // dump($form->getData());
  52. if ($form->isSubmitted() && $form->isValid()) {
  53. $einsendungService->sendLeserbrief($leserbrief);
  54. return $this->redirectToRoute('fe.einsendung_ok');
  55. }
  56. return $this->render('frontend/einsendung/einsendung.html.twig', [
  57. 'entity' => $leserbrief,
  58. 'form' => $form->createView(),
  59. 'template' => 'leserbrief.html.twig',
  60. ]);
  61. }
  62. #[Route(path: '/vereinsbeitrag', name: 'fe.einsendung_vereinsbeitrag')]
  63. public function vereinsbeitrag(
  64. Request $request,
  65. EinsendungService $einsendungService
  66. ): Response {
  67. $vereinsbeitrag = new Vereinsbeitrag();
  68. $form = $this->createForm(VereinsbeitragType::class, $vereinsbeitrag);
  69. $form->handleRequest($request);
  70. if ($form->isSubmitted() && $form->isValid()) {
  71. $einsendungService->sendVereinsbeitrag($vereinsbeitrag);
  72. return $this->redirectToRoute('fe.einsendung_ok');
  73. }
  74. return $this->render('frontend/einsendung/einsendung.html.twig', [
  75. 'entity' => $vereinsbeitrag,
  76. 'form' => $form->createView(),
  77. 'template' => 'vereinsbeitrag.html.twig',
  78. ]);
  79. }
  80. #[Route(path: '/todesanzeige', name: 'fe.einsendung_todesanzeigen')]
  81. public function todesanzeige(
  82. Request $request,
  83. EinsendungService $einsendungService
  84. ): Response {
  85. $todesanzeige = new Todesanzeige();
  86. $form = $this->createForm(TodesanzeigeType::class, $todesanzeige);
  87. $form->handleRequest($request);
  88. if ($form->isSubmitted() && $form->isValid()) {
  89. $einsendungService->sendTodesanzeige($todesanzeige);
  90. return $this->redirectToRoute('fe.einsendung_ok');
  91. }
  92. return $this->render('frontend/einsendung/einsendung.html.twig', [
  93. 'entity' => $todesanzeige,
  94. 'form' => $form->createView(),
  95. 'template' => 'todesanzeige.html.twig',
  96. ]);
  97. }
  98. #[Route(path: '/nachruf', name: 'fe.einsendung_nachruf')]
  99. public function nachruf(
  100. Request $request,
  101. EinsendungService $einsendungService
  102. ): Response {
  103. $nachruf = new Nachruf();
  104. $form = $this->createForm(NachrufType::class, $nachruf);
  105. $form->handleRequest($request);
  106. if ($form->isSubmitted() && $form->isValid()) {
  107. $einsendungService->sendNachruf($nachruf);
  108. return $this->redirectToRoute('fe.einsendung_ok');
  109. }
  110. return $this->render('frontend/einsendung/einsendung.html.twig', [
  111. 'entity' => $nachruf,
  112. 'form' => $form->createView(),
  113. 'template' => 'nachruf.html.twig',
  114. ]);
  115. }
  116. #[Route(path: '/fileupload/{action}', name: 'fe.einsendung_jqueryfileupload')]
  117. public function jqueryFileUpload(Request $request, $action, LoggerInterface $logger, ValidatorInterface $validator, KernelInterface $kernel): JsonResponse
  118. {
  119. if (!$action) {
  120. throw new \InvalidArgumentException('Action nicht definiert! Benötigt zur korrekten Ablage des hochgeladenen Files auf dem Server.');
  121. }
  122. $return_ = [
  123. 'success' => null,
  124. 'msg' => '',
  125. 'uploadedFileWebPath' => null,
  126. 'requestQueryParams' => $request->query->all(), // Alle URL Übergabeparameter zurückgeben zur möglichen Hilfe und Weiterverwendung in Frontend
  127. ];
  128. try {
  129. /**
  130. * @var UploadedFile $uploadedFile
  131. */
  132. foreach ($request->files as $uploadedFile) {
  133. switch ($action) {
  134. case 'IMAGE_FRONTEND':
  135. $uuid = $request->query->get('uuid');
  136. $formGroupId = $request->query->get('formGroupId');
  137. if (!$uuid) {
  138. throw new \InvalidArgumentException('URL Parameter "uuid" leer oder nicht vorhanden!');
  139. }
  140. // Validierung Bildupload
  141. $violations = $validator->validate($uploadedFile, [
  142. new Image(['maxSize' => '5Mi', 'maxWidth' => 5120, 'mimeTypes' => ['image/jpeg', 'image/png', 'image/gif']]), // 5120 als Schutz
  143. ]);
  144. if (0 !== count($violations)) {
  145. $return_['success'] = false;
  146. foreach ($violations as $violation) {
  147. $return_['msg'] .= $violation->getMessage();
  148. }
  149. } else {
  150. $saveDirPath = $kernel->getProjectDir().'/var/data/public/einsendung/images';
  151. // directory protection/security for overloading: delete all images bevor
  152. $fs = new Filesystem();
  153. if ($fs->exists($saveDirPath)) {
  154. // Lösche Dateien mit derselben UID. Gibt Probleme wenn mehrere Files
  155. // $finder = new Finder();
  156. // $finder->files()->in($saveDirPath)->name('*'.$uuid.'*');
  157. // foreach ($finder as $file) {
  158. // $fs->remove($file->getPathname());
  159. // }
  160. // Lösche alle Dateien die älter als 1 Stunde
  161. $finder = new Finder();
  162. $finder->files()->in($saveDirPath)->date('before 1 hour ago');
  163. foreach ($finder as $file) {
  164. $fs->remove($file->getPathname());
  165. }
  166. }
  167. // end
  168. // Erstelle neuen "sauberen", fixen Filename
  169. $newFileName = $uuid.'-'.mt_rand(1000, 9999).'.'.$uploadedFile->getClientOriginalExtension();
  170. $webPathToFile = $request->getBasePath().'/data/einsendung/images/'.$newFileName;
  171. // Datei in Projektverzeichnis speichern
  172. $uploadedFile->move($saveDirPath, $newFileName);
  173. // Webpath zum hochgeladenen File
  174. $return_['filename'] = $newFileName;
  175. $return_['success'] = true;
  176. $return_['uploadedFileWebPath'] = $webPathToFile;
  177. }
  178. break;
  179. default:
  180. throw new \InvalidArgumentException('File-Action "'.$action.'" nicht definiert oder ungültig!');
  181. }
  182. }
  183. } catch (\InvalidArgumentException $e) {
  184. $return_['success'] = false;
  185. $return_['msg'] = $e->getMessage();
  186. } catch (\Exception $e) {
  187. $logger->critical($e->getMessage());
  188. $return_['success'] = false;
  189. $return_['msg'] = 'Es ist ein Fehler beim Dateiupload passiert. Bitte versuchen Sie es noch einmal.';
  190. }
  191. return new JsonResponse($return_);
  192. }
  193. }