src/Controller/AlbumController.php line 141

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Album;
  4. use App\Entity\Imagen;
  5. use App\Form\AlbumType;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  10. use Symfony\Component\HttpFoundation\File\Exception\FileException;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\String\Slugger\SluggerInterface;
  15. class AlbumController extends AbstractController
  16. {
  17.     private $entityManager;
  18.     //Repositorios
  19.     private $albumRepository;
  20.     private $imagenRepository;
  21.     //Parametros    
  22.     private $urlImagenesAlbum;
  23.     public function __construct(EntityManagerInterface $entityManagerParameterBagInterface $parameterBag)
  24.     {
  25.         //Doctrine
  26.         $this->entityManager $entityManager;
  27.         $this->albumRepository $this->entityManager->getRepository(Album::class);
  28.         $this->imagenRepository $this->entityManager->getRepository(Imagen::class);
  29.         //Parametros
  30.         $this->urlImagenesAlbum $parameterBag->get('imagenes_album_directory');
  31.     }
  32.   
  33.     /**
  34.      * @Route("/album", name="album")
  35.      */
  36.     public function index(): Response
  37.     {
  38.         //Obtengo todas las entidades
  39.         $albums $this->albumRepository->findBy([], ['id' => 'DESC']);
  40.         //Retorno los albums
  41.         return $this->render(
  42.             'Album/index.html.twig',
  43.             [
  44.                 'albums' => $albums,
  45.             ]
  46.         );
  47.     }
  48.     /**
  49.      * Require ROLE_ADMIN for only this controller method.
  50.      * 
  51.      * @Route("/app/albums/Abm", name="album_abm", methods={"GET","HEAD","POST"})
  52.      * 
  53.      * @IsGranted("ROLE_ADMIN")
  54.      */
  55.     //Funcion para editar 
  56.     public function listarAlbumnsAdmin(): Response
  57.     {
  58.         //Obtengo todas las entidades
  59.         $albums =  $this->albumRepository->findBy([], ['id' => 'DESC']);
  60.         //Retorno los albums
  61.         return $this->render(
  62.             'Album/indexAbm.html.twig',
  63.             [
  64.                 'albums' => $albums,
  65.             ]
  66.         );
  67.     }
  68.     /**
  69.      * Require ROLE_ADMIN for only this controller method.
  70.      *
  71.      * @Route("/app/album/nuevo", name="album_nuevo")
  72.      *
  73.      * @IsGranted("ROLE_ADMIN")
  74.      */
  75.     //Funcion para crear 
  76.     public function nuevoAlbum(Request $requestSluggerInterface $slugger): Response
  77.     {
  78.         //Creo  
  79.         $album = new Album();
  80.         //Defino el Formulario
  81.         $form $this->createForm(AlbumType::class, $album);
  82.         //Si se envia el formulario , existe un request
  83.         $form->handleRequest($request);
  84.         //Si se disparo el formulario y es valido
  85.         if ($form->isSubmitted() && $form->isValid()) {
  86.             //Obtengo del formulario
  87.             $album $form->getData();
  88.             //Le doy persistencia a
  89.             $this->entityManager->persist($album);
  90.             //Asiento los cambios en la base de datos
  91.             $this->entityManager->flush();
  92.             //Obtengo las imagenes que subi 
  93.             $imagenesSubidas $form->get('Imagen')->getData();
  94.             //Obtengo la portada
  95.             $portada $form->get('portada')->getData();
  96.             //Si existe portada
  97.             if ($portada) {
  98.                 $this->AlbumAdjuntarImagenPortada($album$portada$slugger);
  99.             }
  100.             //Cargo las Imagenes
  101.             foreach ($imagenesSubidas as $imagenSubida) {
  102.                 $this->AlbumAdjuntarImagen($album$imagenSubida$slugger);
  103.             }
  104.             //Le doy persistencia 
  105.             $this->entityManager->persist($album);
  106.             //Asiento los cambios en la base de datos
  107.             $this->entityManager->flush();
  108.             //Aviso
  109.             $this->addFlash('exito''El Album se creo correctamente');
  110.             //Redirecciono        
  111.             return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
  112.         }
  113.         //Retorno la vista
  114.         return $this->render(
  115.             'Album/nuevo.html.twig',
  116.             [
  117.                 'form' => $form->createView(),
  118.             ]
  119.         );
  120.     }
  121.     /**
  122.      * @Route("/album/ver/{idAlbum}", name="album_ver")
  123.      */
  124.     //Funcion para visualizar 
  125.     public function verAlbum($idAlbum): Response
  126.     {
  127.         //Obtengo la entidad
  128.         $album $this->albumRepository->find($idAlbum);
  129.         //Retorno a la vista
  130.         return $this->render(
  131.             'Album/ver.html.twig',
  132.             [
  133.                 'album' =>  $album,
  134.             ]
  135.         );
  136.     }
  137.     /**
  138.      * Require ROLE_ADMIN for only this controller method.
  139.      * 
  140.      * @Route("/album/editar/{idAlbum}", name="album_editar", methods={"GET","HEAD","POST"})
  141.      * 
  142.      * @IsGranted("ROLE_ADMIN")
  143.      */
  144.     //Funcion para editar una publicacion
  145.     public function editarAlbum($idAlbumRequest $requestSluggerInterface $slugger): Response
  146.     {
  147.         //Obtengo la entidad
  148.         $album $this->albumRepository->find($idAlbum);
  149.         //Defino el Formulario
  150.         $form $this->createForm(AlbumType::class, $album);
  151.         //Si se envia el formulario , existe un request
  152.         $form->handleRequest($request);
  153.         //Si se disparo el formulario y es valido
  154.         if ($form->isSubmitted() && $form->isValid()) {
  155.             //Obtengo la entidad del formulario
  156.             $album $form->getData();
  157.             //Obtengo las imagenes que subi 
  158.             $imagenesSubidas $form->get('Imagen')->getData();
  159.             //Obtengo la portada
  160.             $portada $form->get('portada')->getData();
  161.             //Si existe portada
  162.             if ($portada) {
  163.                 $this->AlbumAdjuntarImagenPortada($album$portada$slugger);
  164.             }
  165.             //Cargo las Imagenes
  166.             foreach ($imagenesSubidas as $imagenSubida) {
  167.                 $this->AlbumAdjuntarImagen($album$imagenSubida$slugger);
  168.             }
  169.             //Le doy persistencia 
  170.             $this->entityManager->persist($album);
  171.             //Asiento los cambios en la base de datos
  172.             $this->entityManager->flush();
  173.             //Aviso
  174.             $this->addFlash('exito''El Album se edito exitosamente');
  175.             //Redirecciono    
  176.             return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
  177.         }
  178.         //Retorno la vista
  179.         return $this->render(
  180.             'Album/editar.html.twig',
  181.             [
  182.                 'form' => $form->createView(),
  183.                 'album' => $album,
  184.             ]
  185.         );
  186.     }
  187.     /**
  188.      * Require ROLE_ADMIN for only this controller method.
  189.      * 
  190.      * @Route("/album/eliminarImagen/{idImagen}", name="album_imagen_eliminar", methods={"GET","HEAD","POST"})
  191.      * 
  192.      * @IsGranted("ROLE_ADMIN")
  193.      */
  194.     //Funcion para eliminar una imagen de una publicacion
  195.     public function eliminarImagenAlbum($idImagen)
  196.     {
  197.         //Obtengo la entidad
  198.         $imagen $this->imagenRepository->find($idImagen);
  199.         //Obtengo 
  200.         $album $imagen->getAlbum();
  201.         //Elimino fisicamente el archivo
  202.         $urlImagen $imagen->getUrl();
  203.         //Elimino la imagen Fisicamente en el FileSistem
  204.         unlink($urlImagen);
  205.         //Elimino logicamente la imagen de la entidad
  206.         $album->removeImagen($imagen);
  207.         //Le doy persistencia 
  208.         $this->entityManager->remove($imagen);
  209.         $this->entityManager->persist($album);
  210.         //Asiento los cambios en la base de datos
  211.         $this->entityManager->flush();
  212.         //Aviso
  213.         $this->addFlash('exito''Se elimino la imagen del Album');
  214.         //Redirecciono        
  215.         return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
  216.     }
  217.     //Funcion para Adjuntar una imagen a una publicacion
  218.     private function AlbumAdjuntarImagen($album$imagenSubidaSluggerInterface $slugger)
  219.     {
  220.         //Si existe la imagen la trabajo para guardarla
  221.         if ($imagenSubida) {
  222.             //Obtengo el Nombre Original de la Imagen para incluir de forma seguro el nombre de archivo en la URL
  223.             $nombreOriginalImagen pathinfo($imagenSubida->getClientOriginalName(), PATHINFO_FILENAME);
  224.             //Es necesario para incluir de forma segura el nombre del archivo como parte de la URL (todo minusculas)
  225.             $nombreSeguroArchivo strtolower($slugger->slug($nombreOriginalImagen));
  226.             //Defino la URL completa de mi imagen subida
  227.             $urlImagen 'img/albums/' $album->getId() . '/' $nombreSeguroArchivo '.' $imagenSubida->guessExtension();
  228.             try {
  229.                 if (file_exists($urlImagen)) {
  230.                     $this->addFlash('aviso''La Imagen "' $nombreSeguroArchivo '" ya se encontraba subida , debe eliminar la anterior para volver a subir una nueva version');
  231.                 } else {
  232.                     //Muevo el archivo al directorio donde los almaceno
  233.                     $imagenSubida->move($this->urlImagenesAlbum "/" $album->getId(), $urlImagen);
  234.                     //Creo la nueva entidad imagen..
  235.                     $imagen = new Imagen();
  236.                     //Asigno los datos a la imagen
  237.                     $imagen->setUrl($urlImagen);
  238.                     $imagen->setAlbum($album);
  239.                     $imagen->setNombre($nombreOriginalImagen);
  240.                     //Inserto mi imagen a la publicacion
  241.                     $album->addImagen($imagen);
  242.                     //Le doy persistencia 
  243.                     $this->entityManager->persist($imagen);
  244.                 }
  245.             } catch (FileException $e) {
  246.                 $this->addFlash('aviso''Error al cargar la imagen');
  247.                 //Redirecciono al listado          
  248.                 return $this->redirectToRoute('album');
  249.             }
  250.             //retorno la publicacion    
  251.             return $album;
  252.         }
  253.     }
  254.     //Funcion para Adjuntar una imagen de portada
  255.     private function AlbumAdjuntarImagenPortada($album$imagenSubidaSluggerInterface $slugger)
  256.     {
  257.         //Si existe la imagen la trabajo para guardarla
  258.         if ($imagenSubida) {
  259.             //Si hay portada vieja debo eliminarla..
  260.             if($album->getPortada()) {
  261.              //Borro primero la imagen anterior..
  262.              $portadaVieja $album->getPortada();
  263.              //Elimino fisicamente el archivo
  264.              $urlImagenPortadaVieja $portadaVieja->getUrl();
  265.              //Elimino la imagen Fisicamente en el FileSistem
  266.              unlink($urlImagenPortadaVieja);
  267.              //Elimino la entidad de la base
  268.              $album->setPortada(null);
  269.              $this->entityManager->remove($portadaVieja);
  270.              $this->entityManager->persist($album);           
  271.              //Asiento los cambios en la base de datos
  272.              $this->entityManager->flush();
  273.             }
  274.             //Obtengo el Nombre Original de la Imagen para incluir de forma seguro el nombre de archivo en la URL
  275.             $nombreOriginalImagen pathinfo($imagenSubida->getClientOriginalName(), PATHINFO_FILENAME);
  276.             //Es necesario para incluir de forma segura el nombre del archivo como parte de la URL (todo minusculas)
  277.             $nombreSeguroArchivo strtolower($slugger->slug($nombreOriginalImagen));
  278.             //Defino la URL completa de mi imagen subida
  279.             $urlImagen 'img/albums/' $album->getId() . '/' $nombreSeguroArchivo '.' $imagenSubida->guessExtension();
  280.             try {
  281.                 if (file_exists($urlImagen)) {
  282.                     $this->addFlash('aviso''La Imagen "' $nombreSeguroArchivo '" ya se encontraba subida , debe eliminar la anterior para volver a subir una nueva version');
  283.                 } else {
  284.                     //Muevo el archivo al directorio donde los almaceno
  285.                     $imagenSubida->move($this->urlImagenesAlbum "/" $album->getId(), $urlImagen);
  286.                     //Creo la nueva entidad imagen..
  287.                     $imagen = new Imagen();
  288.                     //Asigno los datos a la imagen
  289.                     $imagen->setUrl($urlImagen);
  290.                     //$imagen->setAlbum($album);
  291.                     $imagen->setNombre($nombreOriginalImagen);
  292.                     //Inserto mi imagen a la publicacion
  293.                     $album->setPortada($imagen);
  294.                     //Le doy persistencia 
  295.                     $this->entityManager->persist($imagen);
  296.                 }
  297.             } catch (FileException $e) {
  298.                 $this->addFlash('aviso''Error al cargar la imagen de portada');
  299.                 //Redirecciono al listado          
  300.                 return $this->redirectToRoute('album');
  301.             }
  302.             //retorno la publicacion    
  303.             return $album;
  304.         }
  305.     }
  306. }