src/Controller/HomeController.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Feed;
  4. use App\Repository\AfectadoRepository;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  8. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  9. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  10. use Symfony\Component\Form\Extension\Core\Type\TextType;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Dompdf\Dompdf;
  15. use Dompdf\Options;
  16. use Imagick;
  17. use ImagickPixel;
  18. class HomeController extends AbstractController
  19. {
  20.     /**
  21.      * @Route("", name="index")
  22.      */
  23.     public function index(Request $requestEntityManagerInterface $em): Response
  24.     {
  25.         $fb = new Feed();
  26.         $form $this->createCrearForm($fb);
  27.         $form->handleRequest($request);
  28.         if ($form->isSubmitted() && $form->isValid()) {
  29.            
  30.             $em->persist($fb);
  31.             $em->flush();
  32.             $this->addFlash('info''¡Feed enviado correctamente!');
  33.             return $this->render('home/gracias.html.twig', [
  34.                 'form' => $form->createView(),
  35.             ]);
  36.         }
  37.         return $this->render('home/index.html.twig', [
  38.             'form' => $form->createView(),
  39.         ]);
  40.     }
  41.     /**
  42.     * Funcion auxiliar que crea el form para crear una pregunta
  43.     */
  44.     private function createCrearForm(Feed $entity)
  45.     {
  46.         $builder $this->createFormBuilder($entity);
  47.         $builder->setAction($this->generateUrl('index'));
  48.         $builder->setMethod('POST');
  49.         $builder->add('feedback'TextareaType::class, array('required' => true));
  50.         $builder->add('email'EmailType::class, array('required' => true));
  51.         $builder->add('nombre'TextType::class, array('required' => true));
  52.         $builder->add('_token'HiddenType::class,  array('mapped' => false));
  53.         return $builder->getForm();
  54.     }
  55.      /**
  56.      * Genera un informe en PDF para un afectado específico.
  57.      *
  58.      * @param int $id El ID del afectado.
  59.      * @param AfectadoRepository $afectadoRepository Repositorio para buscar datos del afectado.
  60.      * @param Dompdf $dompdf Servicio Dompdf inyectado por el bundle.
  61.      * @return Response
  62.      * 
  63.      * @Route("/{id}/pdf", name="afectado", methods={"GET"})
  64.      */
  65.     public function generarInformePdf(int $idAfectadoRepository $afectadoRepository): Response
  66.     {
  67.         // 1. Buscar al afectado en la base de datos usando el ID de la URL.
  68.         $afectado $afectadoRepository->find($id);
  69.         // 2. Si no se encuentra el afectado, devolver un error 404.
  70.         if (!$afectado) {
  71.             // Esta es la forma estándar en Symfony de devolver un JSON de error 404
  72.             return $this->json(['error' => 'Afectado no encontrado'], Response::HTTP_NOT_FOUND);
  73.         }
  74.         $svgString $this->renderView('pdf/cuerpo_heridas.html.twig', [
  75.             'afectado' => $afectado,
  76.         ]);
  77.         $imagick = new Imagick();
  78.         $imagick->setBackgroundColor(new ImagickPixel('transparent'));
  79.         $imagick->readImageBlob($svgString);
  80.         $imagick->setImageFormat("png32");
  81.         $imagick->resizeImage(300250Imagick::FILTER_LANCZOS1);
  82.         $imagick->setColorspace(Imagick::COLORSPACE_SRGB);
  83.         $pngData $imagick->getImageBlob();
  84.         $bodyMapAsBase64 'data:image/png;base64,' base64_encode($pngData);
  85.         $imagick->clear();
  86.         $imagick->destroy();
  87.         $pdfOptions = new Options();
  88.         $pdfOptions->set('defaultFont''Arial');
  89.         $pdfOptions->isHtml5ParserEnabled(true);
  90.         $pdfOptions->set('enable_remote'true);
  91.         $pdfOptions->set("isPhpEnabled"true);
  92.         $dompdf = new Dompdf($pdfOptions);
  93.         // 4. Renderizar la plantilla Twig a una variable HTML.
  94.         // Usamos renderView() en lugar de render() porque queremos el HTML como string.
  95.        return $html $this->render('pdf/informe_afectado.html.twig', [
  96.             'afectado' => $afectado,
  97.                        'body_map_image_base64' => $bodyMapAsBase64,
  98.         ]);
  99.     }
  100. }