<?php
namespace App\Controller;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\InputBag;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\String\Slugger\SluggerInterface;
use App\Entity\Producto;
use App\Entity\Categoria;
use App\Entity\Imagen;
use App\Form\ProductoType;
use App\Form\ProductoCategoriaType;
use App\Form\ProductoCategoriasType;
use App\Entity\Parametro;
use App\Service\ProductoService;
class ProductoController extends AbstractController
{
private $entityManager;
//Servicios
private $productoService;
//Repositorios
private $publicacionRepository;
private $productoRepository;
private $categoriaRepository;
private $parametroRepository;
//Parametros
private $urlImagenes;
public function __construct(EntityManagerInterface $entityManager, ParameterBagInterface $parameterBag, \App\Service\ProductoService $productoService)
{
//Doctrine
$this->entityManager = $entityManager;
$this->productoService = $productoService;
$this->productoRepository = $this->entityManager->getRepository(Producto::class);
$this->categoriaRepository = $this->entityManager->getRepository(Categoria::class);
$this->parametroRepository = $this->entityManager->getRepository(Parametro::class);
//Parametros
$this->urlImagenes = $parameterBag->get('imagenes_directory');
}
/**
* @Route("/producto", name="producto")
*/
public function index(): Response
{
//Obtengo todos los Productos que esten disponibles
$productos = $this->productoRepository->findByActivos();
//Obtengo todas las categorias existentes
$categorias = $this->categoriaRepository->findBy([], ['nombre' => 'ASC']);
//Retorno a la vista
return $this->render(
'Producto/index.html.twig',
[
'productos' => $productos,
'categorias' => $categorias,
]
);
}
/**
* @Route("/productos/categoria/{idCategoria}", name="producto_de_categoria")
*/
public function listarProductosCategorias($idCategoria): Response
{
//Obtengo la categoria del producto
$categoria = $this->categoriaRepository->find($idCategoria);
//Obtengo todos los producto
$productos = $this->productoRepository->findByActivos();
//Obtengo todos los productos de una categoria
$productosCategoria = $categoria->getProductos();
//Defino la coleccion
$productosActivosCategoria = new ArrayCollection();
// Itero sobre los productos de la categoría
foreach ($productosCategoria as $producto) {
// Verifico si el producto está activo
if (in_array($producto, $productos)) {
// Agrego el producto a la nueva colección
$productosActivosCategoria->add($producto);
}
}
//Obtengo todas las categorias existentes
$categorias = $this->categoriaRepository->findBy([], ['nombre' => 'ASC']);
//Retorno a la vista
return $this->render(
'Producto/index.html.twig',
[
'productos' => $productosActivosCategoria,
'categorias' => $categorias,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/gestionProductos", name="producto_abm")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para listar todos los productos disponibles
public function listarProductosAbm(): Response
{
//Obtengo todos los Productos que esten disponibles
$productos = $this->productoRepository->findAll();
//Retorno a la vista
return $this->render(
'Producto/gestionar.html.twig',
[
'productos' => $productos,
]
);
}
/**
* @Route("/producto/ver/{idProducto}", name="producto_ver")
*/
public function verProducto($idProducto): Response
{
//Obtengo el producto a mostrar
$producto = $this->productoRepository->find($idProducto);
//Obtengo la configuracion de ventas
$flagVentas = $this->parametroRepository->find(1);
//Retorno a la vista
return $this->render(
'Producto/ver.html.twig',
[
'producto' => $producto,
'flagVentas' => $flagVentas,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/producto/ver/{idProducto}", name="producto_ver_abm")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para listar todos los productos disponibles
public function verProductoAbm($idProducto): Response
{
//Obtengo el producto a mostrar
$producto = $this->productoRepository->find($idProducto);
//Retorno a la vista
return $this->render(
'Producto/verAbm.html.twig',
[
'producto' => $producto,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/productos/nuevo", name="producto_nuevo")
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para crear un producto
public function nuevoProducto(Request $request, SluggerInterface $slugger): Response
{
//Creo un nuevo Producto
$producto = new Producto();
//Defino el Formulario
$form = $this->createForm(ProductoType::class, $producto);
//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 el producto del formulario
$producto = $form->getData();
//Le doy persistencia
$this->entityManager->persist($producto);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Obtengo la imagen que subi del producto
$imagenSubida = $form->get('imagen')->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->productoService->productoAdjuntarImagenPortada($producto, $portada, $slugger);
}
//Itero por cada imagen subida
foreach ($imagenesSubidas as $imagenSubida) {
$this->productoService->productoAdjuntarImagen($producto, $imagenSubida, $slugger);
}
//Le doy persistencia
$this->entityManager->persist($producto);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('exito', 'El producto se creo correctamente');
//Redirecciono
return $this->redirectToRoute('producto_ver', array('idProducto' => $producto->getId()));
}
//Retorno la vista
return $this->render(
'Producto/nuevo.html.twig',
[
'form' => $form->createView(),
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/productos/editar/{idProducto}", name="producto_editar", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar los datos de un producto
public function editarProducto($idProducto, Request $request, SluggerInterface $slugger): Response
{
//Obtengo el producto seleccionado
$producto = $this->productoRepository->find($idProducto);
//Defino el Formulario
$form = $this->createForm(ProductoType::class, $producto);
//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 el producto del formulario
$producto = $form->getData();
//Obtengo la imagen que subi del producto
$imagenSubida = $form->get('imagen')->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->productoService->productoAdjuntarImagenPortada($producto, $portada, $slugger);
}
//Itero por cada imagen subida
foreach ($imagenesSubidas as $imagenSubida) {
$this->productoService->productoAdjuntarImagen($producto, $imagenSubida, $slugger);
}
//aviso
$this->addFlash('exito', 'Se edito el producto correctamente');
//Le doy persistencia
$this->entityManager->persist($producto);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Redirecciono
return $this->redirectToRoute('producto_ver', array('idProducto' => $producto->getId()));
}
//Redirecciono a la vista
return $this->render(
'Producto/editar.html.twig',
[
'form' => $form->createView(),
'producto' => $producto,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/productos/categorizar/{idProducto}", name="producto_categoria", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
//Funcion para editar los datos de un producto
public function categorizarProducto($idProducto, Request $request, SluggerInterface $slugger): Response
{
//Obtengo el producto seleccionado
$producto = $this->productoRepository->find($idProducto);
//Obtengo las categorias
$categorias = $this->categoriaRepository->findAll();
//Defino el Formulario
$form = $this->createForm(ProductoCategoriaType::class, $producto);
//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 el producto del formulario
$producto = $form->getData();
//Le doy persistencia
$this->entityManager->persist($producto);
//Asiento los cambios en la base de datos
$this->entityManager->flush();
//Aviso
$this->addFlash('aviso', 'Se actualizaron las categorias del Producto ' . $producto->getNombre());
//Redirecciono
return $this->redirectToRoute('producto_ver', array('idProducto' => $producto->getId()));
}
//Redirecciono a la vista
return $this->render(
'Producto/categorizar.html.twig',
[
'form' => $form->createView(),
'producto' => $producto,
]
);
}
/**
* Require ROLE_ADMIN for only this controller method.
*
* @Route("/app/productos/galeria/{idProducto}", name="producto_imagenes", methods={"GET","HEAD","POST"})
*
* @IsGranted("ROLE_ADMIN")
*/
public function editarImagenesProducto($idProducto, Request $request, SluggerInterface $slugger): Response
{
//Obtengo el producto seleccionado
$producto = $this->productoRepository->find($idProducto);
//Redirecciono a la vista
return $this->render(
'Producto/editarImagenes.html.twig',
[
'producto' => $producto,
]
);
}
}