<?php
namespace App\Controller;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use App\Entity\Publicacion;
use App\Form\PublicacionType;
use App\Form\PublicacionEditarType;
use App\Form\PublicacionImagenType;
use App\Form\PublicacionArchivoType;
use App\Entity\Imagen;
use App\Entity\Archivo;
class PublicacionController extends AbstractController
{
private $entityManager;
private $repository;
private $imagenRepository;
private $archivoRepository;
private $urlImagenesPublicaciones;
private $urlArchivosPublicaciones;
public function __construct(EntityManagerInterface $entityManager,ParameterBagInterface $parameterBag)
{
//Doctrine
$this->entityManager = $entityManager;
$this->repository = $this->entityManager->getRepository(Publicacion::class);
$this->imagenRepository = $this->entityManager->getRepository(Imagen::class);
$this->archivoRepository = $this->entityManager->getRepository(Archivo::class);
// Acceder a los parĂ¡metros definidos en service.yaml
$this->urlImagenesPublicaciones = $parameterBag->get('imagenes_publicaciones');
$this->urlArchivosPublicaciones = $parameterBag->get('archivos_publicaciones_directory');
}
/**
* Require ROLE_ADMIN for only this controller method.
* @Route("/app/publicacion", name="app_publicacion")
* @IsGranted("ROLE_ADMIN")
*/
public function index(): Response
{
//Obtengo todas las entidades
$publicaciones = $this->repository->findByAllNoticias();
//Retorno la vista
return $this->render(
'Publicacion/index.html.twig',
[
'publicaciones' => $publicaciones,
]
);
}
/**
* @Route("/publicacion/listar", name="app_publicaciones")
*/
//Funcion que lista las publicaciones
public function listarNoticias(): Response
{
//Obtengo todas las entidades
$publicaciones = $this->repository->findBy([], ['id' => 'DESC']);
//Retorno la vista
return $this->render(
'Publicacion/listarPublicaciones.html.twig',
[
'publicaciones' => $publicaciones,
]
);
}
/**
* @Route("/publicacion/ver/{idPublicacion}", name="app_publicacion_ver")
*/
//Funcion para visualizar una publicacion
public function verPublicacion($idPublicacion): Response
{
//Obtengo la entidad
$publicacion = $this->repository->find($idPublicacion);
//Obtengo las ultimas noticias
$ultimasPublicaciones = $this->repository->findByUltimasNoticiasColumna();
//Retorno a la vista
return $this->render(
'Publicacion/verPublicacion.html.twig',
[
'publicacion' => $publicacion,
'ultimasPublicaciones' => $ultimasPublicaciones,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/nueva", name="app_publicacion_nueva")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para crear una nueva publicacion
public function nuevaPublicacion(Request $request, SluggerInterface $slugger): Response
{
//Creo la entidad
$publicacion = new Publicacion();
//Defino el Formulario
$form = $this->createForm(PublicacionType::class, $publicacion);
//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
$publicacion = $form->getData();
//Le doy persistencia a
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('imagenes')->getData();
//Obtengo los archivos que subi
$archivosSubidos = $form->get('archivos')->getData();
//Obtengo la portada
$portada = $form->get('portada')->getData();
//Si existe portada
if ($portada) {
$this->PublicacionAdjuntarImagenPortada($publicacion, $portada, $slugger);
}
//Itero por cada imagen subida
foreach ($imagenesSubidas as $imagenSubida) {
$this->publicacionAdjuntarImagen($publicacion, $imagenSubida, $slugger);
}
//Itero por cada archivo
foreach ($archivosSubidos as $archivoSubido) {
$this->publicacionAdjuntarArchivo($publicacion, $archivoSubido, $slugger);
}
//Fijo el Autor de la publicacion
$autor = $this->get('security.token_storage')->getToken()->getUser();
$autor->addPublicacion($publicacion);
$publicacion->setAutor($autor);
//Le doy persistencia a la imagen
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'La Publicacion se creo exitosamente');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
//Retorno la vista
return $this->render(
'Publicacion/nueva.html.twig',
[
'form' => $form->createView(),
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/editar/{idPublicacion}", name="app_publicacion_editar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function editarPublicacion($idPublicacion, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$publicacion = $this->repository->find($idPublicacion);
//Defino el Formulario
$form = $this->createForm(PublicacionEditarType::class, $publicacion);
//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
$publicacion = $form->getData();
//Obtengo las imagenes que subi
$imagenesSubidas = $form->get('imagenes')->getData();
//Obtengo los archivos que subi
$archivosSubidos = $form->get('archivos')->getData();
//Obtengo la portada
$portada = $form->get('portada')->getData();
//Si existe portada
if ($portada) {
$this->PublicacionAdjuntarImagenPortada($publicacion, $portada, $slugger);
}
//Itero por cada imagen subida
foreach ($imagenesSubidas as $imagenSubida) {
$this->publicacionAdjuntarImagen($publicacion, $imagenSubida, $slugger);
}
//Itero por cada archivo
foreach ($archivosSubidos as $archivoSubido) {
$this->publicacionAdjuntarArchivo($publicacion, $archivoSubido, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'La Publicacion se edito exitosamente');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
//Retorno la vista
return $this->render(
'Publicacion/editar.html.twig',
[
'form' => $form->createView(),
'publicacion' => $publicacion,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/eliminar/{idPublicacion}", name="app_publicacion_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function eliminarPublicacion($idPublicacion, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$publicacion = $this->repository->find($idPublicacion);
//Elimino las imagenes
$this->eliminarImagenesPublicacion($publicacion);
//Elimino los archivos
$this->eliminarArchivosPublicacion($publicacion);
//Le doy persistencia
$this->entityManager->remove($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'La Publicacion se elimino exitosamente');
//Redirecciono
return $this->redirectToRoute('app_publicacion');
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/{idPublicacion}/agregarImagen", name="app_publicacion_imagen_agregar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function agregarImagenPublicacion($idPublicacion, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$publicacion = $this->repository->find($idPublicacion);
//Defino el Formulario
$form = $this->createForm(PublicacionImagenType::class, $publicacion);
//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
$publicacion = $form->getData();
//Obtengo la imagen que subi
$imagenesSubidas = $form->get('imagenes')->getData();
//Itero por cada imagen subida
foreach ($imagenesSubidas as $imagenSubida) {
$this->publicacionAdjuntarImagen($publicacion, $imagenSubida, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'La Publicacion se edito exitosamente');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
//Retorno la vista
return $this->render(
'Publicacion/agregarImagen.html.twig',
[
'form' => $form->createView(),
'publicacion' => $publicacion,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/eliminarImagen/{idImagen}", name="app_publicacion_imagen_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para eliminar una imagen de una publicacion
public function eliminarImagenPublicacion($idImagen)
{
//Obtengo la entidad
$imagen = $this->imagenRepository->find($idImagen);
//Obtengo
$publicacion = $imagen->getPublicacion();
//Elimino fisicamente el archivo
$urlImagen = $imagen->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagen);
//Elimino logicamente la imagen de la entidad
$publicacion->removeImagen($imagen);
//Le doy persistencia
$this->entityManager->remove($imagen);
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se elimino la imagen de la publicacion');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/publicacion/{idPublicacion}/agregarArchivo", name="app_publicacion_archivo_agregar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar una publicacion
public function agregarArchivoPublicacion($idPublicacion, Request $request, SluggerInterface $slugger): Response
{
//Obtengo la entidad
$publicacion = $this->repository->find($idPublicacion);
//Defino el Formulario
$form = $this->createForm(PublicacionArchivoType::class, $publicacion);
//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
$publicacion = $form->getData();
//Obtengo los archivos que subi
$archivosSubidos = $form->get('archivos')->getData();
//Itero por cada imagen subida
foreach ($archivosSubidos as $archivoSubido) {
$this->publicacionAdjuntarArchivo($publicacion, $archivoSubido, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'La Publicacion se edito exitosamente');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
//Retorno la vista
return $this->render(
'publicacion/agregarArchivo.html.twig',
[
'form' => $form->createView(),
'publicacion' => $publicacion,
]
);
}
/**
* Require ROLE_PRENSA for only this controller method.
*
* @Route("/publicacion/eliminarArchivo/{idArchivo}", name="app_publicacion_archivo_eliminar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_PRENSA")
*/
//Funcion para eliminar un archivo de una publicacion
public function eliminarArchivoPublicacion($idArchivo)
{
//Obtengo la entidad
$archivo = $this->archivoRepository->find($idArchivo);
//Obtengo
$publicacion = $archivo->getPublicacion();
//Elimino fisicamente el archivo
$urlArchivo = $archivo->getUrl();
//Elimino Fisicamente en el FileSistem
unlink($urlArchivo);
//Elimino logicamente
$publicacion->removeArchivo($archivo);
//Le doy persistencia
$this->entityManager->remove($archivo);
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'Se elimino el archivo de la publicacion');
//Redirecciono
return $this->redirectToRoute('app_publicacion_ver', array('idPublicacion' => $publicacion->getId()));
}
//Funcion para eliminar las imagenes de una publicacion
private function eliminarImagenesPublicacion($publicacion)
{
//Borro las imagenes de la publicacion
$imagenes = $publicacion->getImagenes();
//Itero sobre todas las imagenes
foreach ($imagenes as $imagen) {
//Elimino fisicamente el archivo
$urlImagen = $imagen->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagen);
//Elimino logicamente la imagen de la entidad
$publicacion->removeImagen($imagen);
$this->entityManager->remove($imagen);
}
//Le doy persistencia
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Retorno la entidad
return $publicacion;
}
//Funcion para eliminar los archivos de una publicacion
private function eliminarArchivosPublicacion($publicacion)
{
//Borro los archivos de la publicacion
$archivos = $publicacion->getArchivos();
//Itero sobre todos los archivos
foreach ($archivos as $archivo) {
//Elimino fisicamente el archivo
$urlArchivo = $archivo->getUrl();
//Elimino Fisicamente en el FileSistem
unlink($urlArchivo);
//Elimino logicamente
$publicacion->removeArchivo($archivo);
$this->entityManager->remove($archivo);
}
//Le doy persistencia
$this->entityManager->persist($publicacion);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Retorno la entidad
return $publicacion;
}
//Funcion para Adjuntar una imagen a una publicacion
private function publicacionAdjuntarImagen($publicacion, $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/publicaciones/' . $publicacion->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->urlImagenesPublicaciones . "/" . $publicacion->getId(), $urlImagen);
//Creo la nueva entidad imagen..
$imagen = new Imagen();
//Asigno los datos a la imagen
$imagen->setUrl($urlImagen);
$imagen->setPublicacion($publicacion);
$imagen->setNombre($nombreOriginalImagen);
//Inserto mi imagen a la publicacion
$publicacion->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('app_publicacion');
}
//retorno la publicacion
return $publicacion;
}
}
//Funcion para Adjuntar Archivos a una Publicacion
private function publicacionAdjuntarArchivo($publicacion, $archivoSubido, SluggerInterface $slugger)
{
//Si existe la imagen la trabajo para guardarla
if ($archivoSubido) {
//Obtengo el Nombre Original de la Imagen para incluir de forma seguro el nombre de archivo en la URL
$nombreOriginalArchivo = pathinfo($archivoSubido->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($nombreOriginalArchivo));
//Defino la URL completa de mi imagen subida
$urlArchivo = 'archivos/publicaciones/' . $publicacion->getId() . '/' . $nombreSeguroArchivo . '.' . $archivoSubido->guessExtension();
try {
//Si el archivo existe, aviso del error
if (file_exists($urlArchivo)) {
$this->addFlash('aviso', 'El archivo "' . $nombreSeguroArchivo . '" ya se encontraba subido , debe eliminar el anterior para volver a subir una nueva version');
} else {
//Muevo el archivo al directorio donde los almaceno
$archivoSubido->move($this->urlArchivosPublicaciones . "/" . $publicacion->getId(), $urlArchivo);
//Creo la nueva entidad..
$archivo = new Archivo();
//Asigno los datos a la imagen
$archivo->setUrl($urlArchivo);
$archivo->setPublicacion($publicacion);
$archivo->setNombre($nombreOriginalArchivo);
//Inserto mi archivo a la publicacion
$publicacion->addArchivo($archivo);
//Le doy persistencia
$this->entityManager->persist($archivo);
}
} catch (FileException $e) {
$this->addFlash('aviso', 'Error al cargar la imagen');
//Redirecciono al listado
return $this->redirectToRoute('app_publicacion');
}
//retorno la publicacion
return $publicacion;
}
}
//Funcion para Adjuntar una imagen a una publicacion
private function PublicacionAdjuntarImagenPortada($publicacion, $imagenSubida, SluggerInterface $slugger)
{
//Si existe la imagen la trabajo para guardarla
if ($imagenSubida) {
//Si hay una portada vieja debo borrarla..
if ($publicacion->getPortada()) {
//Borro primero la imagen anterior..
$portadaVieja = $publicacion->getPortada();
//Elimino fisicamente el archivo
$urlImagenPortadaVieja = $portadaVieja->getUrl();
//Elimino la imagen Fisicamente en el FileSistem
unlink($urlImagenPortadaVieja);
//Elimino la entidad de la base
$publicacion->setPortada(null);
$this->entityManager->remove($portadaVieja);
$this->entityManager->persist($publicacion);
//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/publicaciones/' . $publicacion->getId() . '/portada.' . $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->urlImagenesPublicaciones . "/" . $publicacion->getId(), $urlImagen);
//Creo la nueva entidad imagen..
$imagen = new Imagen();
//Asigno los datos a la imagen
$imagen->setUrl($urlImagen);
$imagen->setNombre($nombreOriginalImagen);
//Inserto mi imagen a la publicacion
$publicacion->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('app_publicacion');
}
//retorno la publicacion
return $publicacion;
}
}
}