<?php
namespace App\Controller;
use App\Entity\Album;
use App\Entity\Imagen;
use App\Form\AlbumType;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
class AlbumController extends AbstractController
{
private $entityManager;
//Repositorios
private $albumRepository;
private $imagenRepository;
//Parametros
private $urlImagenesAlbum;
public function __construct(EntityManagerInterface $entityManager, ParameterBagInterface $parameterBag)
{
//Doctrine
$this->entityManager = $entityManager;
$this->albumRepository = $this->entityManager->getRepository(Album::class);
$this->imagenRepository = $this->entityManager->getRepository(Imagen::class);
//Parametros
$this->urlImagenesAlbum = $parameterBag->get('imagenes_album_directory');
}
/**
* @Route("/album", name="album")
*/
public function index(): Response
{
//Obtengo todas las entidades
$albums = $this->albumRepository->findBy([], ['id' => 'DESC']);
//Retorno los albums
return $this->render(
'Album/index.html.twig',
[
'albums' => $albums,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/albums/Abm", name="album_abm", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar
public function listarAlbumnsAdmin(): Response
{
//Obtengo todas las entidades
$albums = $this->albumRepository->findBy([], ['id' => 'DESC']);
//Retorno los albums
return $this->render(
'Album/indexAbm.html.twig',
[
'albums' => $albums,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/album/nuevo", name="album_nuevo")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para crear
public function nuevoAlbum(Request $request, SluggerInterface $slugger): Response
{
//Creo
$album = new Album();
//Defino el Formulario
$form = $this->createForm(AlbumType::class, $album);
//Si se envia el formulario , existe un request
$form->handleRequest($request);
//Si se disparo el formulario y es valido
if ($form->isSubmitted() && $form->isValid()) {
//Obtengo del formulario
$album = $form->getData();
//Le doy persistencia a
$this->entityManager->persist($album);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('Imagen')->getData();
//Obtengo la portada
$portada = $form->get('portada')->getData();
//Si existe portada
if ($portada) {
$this->AlbumAdjuntarImagenPortada($album, $portada, $slugger);
}
//Cargo las Imagenes
foreach ($imagenesSubidas as $imagenSubida) {
$this->AlbumAdjuntarImagen($album, $imagenSubida, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($album);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El Album se creo correctamente');
//Redirecciono
return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
}
//Retorno la vista
return $this->render(
'Album/nuevo.html.twig',
[
'form' => $form->createView(),
]
);
}
/**
* @Route("/album/ver/{idAlbum}", name="album_ver")
*/
//Funcion para visualizar
public function verAlbum($idAlbum): Response
{
//Obtengo la entidad
$album = $this->albumRepository->find($idAlbum);
//Retorno a la vista
return $this->render(
'Album/ver.html.twig',
[
'album' => $album,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/album/editar/{idAlbum}", name="album_editar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function editarAlbum($idAlbum, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$album = $this->albumRepository->find($idAlbum);
//Defino el Formulario
$form = $this->createForm(AlbumType::class, $album);
//Si se envia el formulario , existe un request
$form->handleRequest($request);
//Si se disparo el formulario y es valido
if ($form->isSubmitted() && $form->isValid()) {
//Obtengo la entidad del formulario
$album = $form->getData();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('Imagen')->getData();
//Obtengo la portada
$portada = $form->get('portada')->getData();
//Si existe portada
if ($portada) {
$this->AlbumAdjuntarImagenPortada($album, $portada, $slugger);
}
//Cargo las Imagenes
foreach ($imagenesSubidas as $imagenSubida) {
$this->AlbumAdjuntarImagen($album, $imagenSubida, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($album);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El Album se edito exitosamente');
//Redirecciono
return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
}
//Retorno la vista
return $this->render(
'Album/editar.html.twig',
[
'form' => $form->createView(),
'album' => $album,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/album/eliminarImagen/{idImagen}", name="album_imagen_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para eliminar una imagen de una publicacion
public function eliminarImagenAlbum($idImagen)
{
//Obtengo la entidad
$imagen = $this->imagenRepository->find($idImagen);
//Obtengo
$album = $imagen->getAlbum();
//Elimino fisicamente el archivo
$urlImagen = $imagen->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagen);
//Elimino logicamente la imagen de la entidad
$album->removeImagen($imagen);
//Le doy persistencia
$this->entityManager->remove($imagen);
$this->entityManager->persist($album);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se elimino la imagen del Album');
//Redirecciono
return $this->redirectToRoute('album_ver', array('idAlbum' => $album->getId()));
}
//Funcion para Adjuntar una imagen a una publicacion
private function AlbumAdjuntarImagen($album, $imagenSubida, SluggerInterface $slugger)
{
//Si existe la imagen la trabajo para guardarla
if ($imagenSubida) {
//Obtengo el Nombre Original de la Imagen para incluir de forma seguro el nombre de archivo en la URL
$nombreOriginalImagen = pathinfo($imagenSubida->getClientOriginalName(), PATHINFO_FILENAME);
//Es necesario para incluir de forma segura el nombre del archivo como parte de la URL (todo minusculas)
$nombreSeguroArchivo = strtolower($slugger->slug($nombreOriginalImagen));
//Defino la URL completa de mi imagen subida
$urlImagen = 'img/albums/' . $album->getId() . '/' . $nombreSeguroArchivo . '.' . $imagenSubida->guessExtension();
try {
if (file_exists($urlImagen)) {
$this->addFlash('aviso', 'La Imagen "' . $nombreSeguroArchivo . '" ya se encontraba subida , debe eliminar la anterior para volver a subir una nueva version');
} else {
//Muevo el archivo al directorio donde los almaceno
$imagenSubida->move($this->urlImagenesAlbum . "/" . $album->getId(), $urlImagen);
//Creo la nueva entidad imagen..
$imagen = new Imagen();
//Asigno los datos a la imagen
$imagen->setUrl($urlImagen);
$imagen->setAlbum($album);
$imagen->setNombre($nombreOriginalImagen);
//Inserto mi imagen a la publicacion
$album->addImagen($imagen);
//Le doy persistencia
$this->entityManager->persist($imagen);
}
} catch (FileException $e) {
$this->addFlash('aviso', 'Error al cargar la imagen');
//Redirecciono al listado
return $this->redirectToRoute('album');
}
//retorno la publicacion
return $album;
}
}
//Funcion para Adjuntar una imagen de portada
private function AlbumAdjuntarImagenPortada($album, $imagenSubida, SluggerInterface $slugger)
{
//Si existe la imagen la trabajo para guardarla
if ($imagenSubida) {
//Si hay portada vieja debo eliminarla..
if($album->getPortada()) {
//Borro primero la imagen anterior..
$portadaVieja = $album->getPortada();
//Elimino fisicamente el archivo
$urlImagenPortadaVieja = $portadaVieja->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagenPortadaVieja);
//Elimino la entidad de la base
$album->setPortada(null);
$this->entityManager->remove($portadaVieja);
$this->entityManager->persist($album);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
}
//Obtengo el Nombre Original de la Imagen para incluir de forma seguro el nombre de archivo en la URL
$nombreOriginalImagen = pathinfo($imagenSubida->getClientOriginalName(), PATHINFO_FILENAME);
//Es necesario para incluir de forma segura el nombre del archivo como parte de la URL (todo minusculas)
$nombreSeguroArchivo = strtolower($slugger->slug($nombreOriginalImagen));
//Defino la URL completa de mi imagen subida
$urlImagen = 'img/albums/' . $album->getId() . '/' . $nombreSeguroArchivo . '.' . $imagenSubida->guessExtension();
try {
if (file_exists($urlImagen)) {
$this->addFlash('aviso', 'La Imagen "' . $nombreSeguroArchivo . '" ya se encontraba subida , debe eliminar la anterior para volver a subir una nueva version');
} else {
//Muevo el archivo al directorio donde los almaceno
$imagenSubida->move($this->urlImagenesAlbum . "/" . $album->getId(), $urlImagen);
//Creo la nueva entidad imagen..
$imagen = new Imagen();
//Asigno los datos a la imagen
$imagen->setUrl($urlImagen);
//$imagen->setAlbum($album);
$imagen->setNombre($nombreOriginalImagen);
//Inserto mi imagen a la publicacion
$album->setPortada($imagen);
//Le doy persistencia
$this->entityManager->persist($imagen);
}
} catch (FileException $e) {
$this->addFlash('aviso', 'Error al cargar la imagen de portada');
//Redirecciono al listado
return $this->redirectToRoute('album');
}
//retorno la publicacion
return $album;
}
}
}