ccc

Mostrando entradas con la etiqueta Symfony CRUD Relacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Symfony CRUD Relacional. Mostrar todas las entradas

Symfony CRUD con formularios de campos que tiren de otras tablas: Vistas

listarCineastas.html.twig:
{% extends 'edcBundle::viewEDC.html.twig' %}

{% block body %}
    {{ parent() }}
    <h1>Listado de cineastas</h1>
     {% for flashMessage in app.session.flashbag.get('mensaje') %}
        <span class="alert-success">
            {{ flashMessage }}
            <hr />
        </span>
    {% endfor %}
    <hr />
    <table class="table table-bordered">
        <tbody>
     
            <th>Nombre</th>
           
        </tbody>
           {% for dato in datos %}
        <tr>
            <td>{{dato.nombre}}</td>
            <td>
                  <a href="{{ path('editCineasta', {'id':dato.id}) }}" title="Editar">Editar</a>
                -
                <a onclick="return eliminarCineasta({{ dato.id }},'{{ dato.nombre }}');" href="{{ path('delCineasta', {'id':dato.id}) }}" title="Eliminar">Eliminar</a>
            </td>
        </tr>
        {% endfor %}
    </table>
   
    <script>
    function eliminarCineasta(idCineasta, nombre) {
        if (confirm("¿Estás seguro de querer eliminar el cineasta "+nombre+"?"))
            return true;
        else
            return false;
    }
    </script>
 {% endblock %}

listarPeliculas.html.twig:
{% extends 'edcBundle::viewEDC.html.twig' %}

{% block body %}
    {{ parent() }}
    {{ dump(arrDatos) }}
    <hr>
    {{ dump(arrCineastas) }}
    <hr>
    <h1>Listado de películas</h1>
     {% for flashMessage in app.session.flashbag.get('mensaje') %}
        <span class="alert-success">
            {{ flashMessage }}
            <hr />
        </span>
    {% endfor %}

    <hr />
    <table class="table table-bordered">
        <tbody>
            <th>Título</th>
            <th>Año</th>
            <th>Director</th>
             <th>Actor 1</th>
              <th>Actor 2</th>
              <th></th>
        </tbody>
           {% for dato in arrDatos %}
        <tr>
            <td>{{dato.titulo}}</td>
            <td>{{dato.anno}}</td>
            <td>{{ arrCineastas[dato.id].nomDirector }}</td>
            <td>{{ arrCineastas[dato.id].nomActor1 }}</td>
            <td>{{ arrCineastas[dato.id].nomActor2 }}</td>
            <td>
                <a href="{{ path('editPelicula', {'id':dato.id}) }}" title="Editar">Editar</a>
                -
                <a onclick="return eliminarPel({{ dato.id }},'{{ dato.titulo }}');" href="{{ path('delPelicula', {'id':dato.id}) }}" title="Eliminar">Eliminar</a>
            </td>
        </tr>
        {% endfor %}
    </table>
   
    <script>
    function eliminarPel(idPelicula, titulo) {
        if (confirm("¿Estás seguro de querer eliminar la película "+titulo+"?"))
            return true;
        else
            return false;
    }
    </script>
{% endblock %}

viewEDC.html.twig (Se guarda en la raiz de views):
{# esta va a ser la vista standard que heredaran las otras vistas #}
{% extends "::base.html.twig" %}

{% block stylesheets %}
    <link href="{{ asset('bundles/peliculas/css/css_edc.css') }}" rel="stylesheet" />
    <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
{% endblock %}

{% block body %}
    <ol class="breadcrumb">
        <li><a href="{{ path('addCineasta') }}">Añadir cineasta</a></li>
        <li><a href="{{ path('listarCineastas') }}">Listar cineastas</a></li>
        <li><a href="{{ path('addPelicula') }}">Añadir película</a></li>
        <li><a href="{{ path('listarPeliculas') }}">Listar películas</a></li>
    
    </ol>
{% endblock %}

Symfony CRUD con formularios de campos que tiren de otras tablas: Formularios

CineastasType.php:
<?php
namespace edcBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class cineastasType extends AbstractType
{
 /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    // Como el Form de cineastas no tiene combos que tiren de otras tablas a esta función se
    // la llama tanto para Add como para Edit
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nombre')
            ->add('guardar', 'submit')
        ;
    }
   
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'edcBundle\Entity\cineastas'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'edcbundle_cineastas';
    }
}

peliculasType.php:
<?php
namespace edcBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Doctrine\ORM\EntityRepository;

class peliculasType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    // Como el Form de peliculas TIENE combos que tiren de otras tablas (cineastas) a esta función se
    // la llama solo cuando vayamos a Add
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
            ->add('titulo')
            ->add('anno')
            ->add('idDirector', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    }
            ))
            ->add('idActor1', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    }))
            ->add('idActor2', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    }))
            ->add('guardar', 'submit')
        ;
    }
   
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'edcBundle\Entity\peliculas'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'edcbundle_peliculas';
    }
}

peliculasEditType.php:
<?php
namespace edcBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Doctrine\ORM\EntityRepository;

class peliculasEditType extends AbstractType
{
    // El constructor es necesario a la hora de modificar para establecer el data en los combos
    public function __construct($em) {
        $this->em = $em;
    }
   
    public function setSelected($campo, $idSelect) {
        switch($campo) {
            case 'idDirector':$this->idDirectorSelect = $idSelect;
                        break;
            case 'idActor1':$this->idActor1Select = $idSelect;
                        break;
            case 'idActor2':$this->idActor2Select = $idSelect;
                        break;
        }
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    // Como el Form de peliculas TIENE combos que tiren de otras tablas (cineastas) a esta función se
    // la llama solo cuando vayamos a Edit
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder
            ->add('titulo')
            ->add('anno')
            ->add('idDirector', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    },
                'data' => $this->em->getReference("edcBundle:cineastas",$this->idDirectorSelect)
            ))
            ->add('idActor1', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    },
                'data' => $this->em->getReference("edcBundle:cineastas",$this->idActor1Select)
           
            ))
            ->add('idActor2', 'entity', array(
                'class' => 'edcBundle:cineastas',
                'property' => 'nombre',
                'query_builder' => function (EntityRepository $er) {
                                        return $er->createQueryBuilder('c')
                                        ->orderBy('c.nombre', 'ASC');
                    },
                'data' => $this->em->getReference("edcBundle:cineastas",$this->idActor2Select)
            ))
            ->add('guardar', 'submit')
        ;
    }
   
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'edcBundle\Entity\peliculas'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'edcbundle_peliculas';
    }
}

Symfony CRUD con formularios de campos que tiren de otras tablas: Routing y Controller

En el routing:
addCineasta:
    path:     /peliculas/addCineasta
    defaults: { _controller: edcBundle:Default:addCineasta }
addPelicula:
    path:     /peliculas/addPelicula
    defaults: { _controller: edcBundle:Default:addPelicula }
delCineasta:
    path:     /peliculas/delCineasta/{id}
    defaults: { _controller: edcBundle:Default:delCineasta }
delPelicula:
    path:     /peliculas/delPelicula/{id}
    defaults: { _controller: edcBundle:Default:delPelicula }
editCineasta:
    path:     /peliculas/editCineasta/{id}
    defaults: { _controller: edcBundle:Default:editCineasta }
editPelicula:
    path:     /peliculas/editPelicula/{id}
    defaults: { _controller: edcBundle:Default:editPelicula }
listarCineastas:
    path:     /peliculas/listarCineastas
    defaults: { _controller: edcBundle:Default:listarCineastas }
listarPeliculas:
    path:     /peliculas/listarPeliculas
    defaults: { _controller: edcBundle:Default:listarPeliculas }

En el defaultController:
<?php
namespace edcBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use edcBundle\Entity\cineastas;
use edcBundle\Form\cineastasType;
use edcBundle\Entity\peliculas;
use edcBundle\Form\peliculasType;
use edcBundle\Form\peliculasEditType;

use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    public function indexAction($name)
    {
        // return $this->render('edcBundle:Default:index.html.twig', array('name' => $name));
    }
   

    // **************************************************
    public function addCineastaAction(Request $request)
    {
        $cineastaAux = new cineastas();
        $form = $this->createForm(new cineastasType(),$cineastaAux);
        $form->handleRequest($request);
   
        if($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($cineastaAux);
            $em->flush();
            $this->get('session')->getFlashBag()->add(
                    'mensaje','Se ha añadido el cineasta correctamente'
            );
            return $this->redirect($this->generateUrl('listarCineastas'));
        }
   
        return $this->render('edcBundle:Default:addCineasta.html.twig',
                array("form"=>$form->createView()));
    }
   
   
   
    // **************************************************
    public function addPeliculaAction(Request $request)
    {
         $peliculaAux = new peliculas();
        $form = $this->createForm(new peliculasType(),$peliculaAux);
        $form->handleRequest($request);
       
        if($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($peliculaAux);
              $em->flush();
            $this->get('session')->getFlashBag()->add(
                    'mensaje','Se ha añadido la película correctamente'
            );
            return $this->redirect($this->generateUrl('listarPeliculas'));
        }
           return $this->render('edcBundle:Default:addPelicula.html.twig',
                array("form"=>$form->createView()));
    }
   
    // *****************************************
    public function delCineastaAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $cineastaAux = $em->getRepository('edcBundle:cineastas')->find($id);
   
        if (!$cineastaAux) {
            throw $this->createNotFoundException(
                    'No existe el cineasta con el valor:'.$id
            );
        }
   
        $em->remove($cineastaAux);
        $em->flush();
        $this->get('session')->getFlashBag()->add(
                'mensaje',
                'Se ha eliminado el cineasta correctamente'
        );
        return $this->redirect($this->generateUrl('listarCineastas'));
    }
   
    // *****************************************
    public function delPeliculaAction($id)
    {
        $em = $this->getDoctrine()->getManager();
        $peliculaAux = $em->getRepository('edcBundle:peliculas')->find($id);
   
        if (!$peliculaAux) {
            throw $this->createNotFoundException(
                    'No existe la película con el valor:'.$id
            );
        }
   
        $em->remove($peliculaAux);
        $em->flush();
        $this->get('session')->getFlashBag()->add(
                'mensaje',
                'Se ha eliminado la película correctamente'
        );
        return $this->redirect($this->generateUrl('listarPeliculas'));
    }
   
    // *******************************************
    public function editCineastaAction($id,Request $request)
    {
        $cineastaAux = new cineastas();
       
        $datos = $this->getDoctrine()
        ->getRepository('edcBundle:cineastas')
        ->find($id);
        if (!$datos) {
            throw $this->createNotFoundException(
                    'No existe el cineasta con el valor:'.$id
            );
        }
       
         $form = $this->createForm(new CineastasType(), $datos);
        $form->handleRequest($request);
       
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            //$em->persist($p);
            $em->flush();
            $this->get('session')->getFlashBag()->add(
                    'mensaje',
                    'Se ha modificado el cineasta correctamente'
            );
            return $this->redirect($this->generateUrl('listarCineastas'));
        }
        return $this->render('edcBundle:Default:editCineasta.html.twig',array("form"=>$form->createView()));
    }
   
    // *******************************************
    public function editPeliculaAction($id,Request $request)
    {
        $peliculaAux = new peliculas();
   
        $datos = $this->getDoctrine()
            ->getRepository('edcBundle:peliculas')
            ->find($id);
        if (!$datos) {
            throw $this->createNotFoundException(
                    'No existe la película con el id:'.$id
            );
        }
       
        $peliculasType = new peliculasEditType($this->getDoctrine()->getManager());
        // Forzar a que en los combos queden seleccionada el item correspondiente
           $peliculasType->setSelected('idDirector', $datos->getIdDirector());
           $peliculasType->setSelected('idActor1', $datos->getIdActor1());
           $peliculasType->setSelected('idActor2', $datos->getIdActor2());
                     
        $form = $this->createForm($peliculasType, $datos);
        $form->handleRequest($request);
   
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
             //$em->persist($p);
            $em->flush();
            $this->get('session')->getFlashBag()->add(
                    'mensaje',
                    'Se ha modificado la película correctamente'
            );
            return $this->redirect($this->generateUrl('listarPeliculas'));
        }
        return $this->render('edcBundle:Default:editPelicula.html.twig',array("form"=>$form->createView()));
    }
   
    // *******************************************
    public function getNombreCineasta($id) {
        $em = $this->getDoctrine()->getManager();
        $cineastaAux = $em->getRepository('edcBundle:cineastas')->find($id);
        return $cineastaAux->getNombre();
    }
   
    // **************************************
    public function listarCineastasAction()
    {
        $datos = $this->getDoctrine()
        /*
         ->getRepository('edcBundle:cineastas')
        ->findAll();
        */
        // Si queremos una SQL más especifica entonces en vez de findAll:
        ->getRepository('edcBundle:cineastas')
        ->createQueryBuilder('c')
        ->where('c.nombre LIKE :nombre1')
        ->orWhere('c.nombre LIKE :nombre2')
        ->andWhere('c.id >0')
        ->setParameter('nombre1', '%a%')
        ->setParameter('nombre2', '%b%')
        ->orderBy('c.nombre', 'ASC')
        ->getQuery()
        ->getResult();
        return $this->render('edcBundle:Default:listarCineastas.html.twig',compact("datos"));
    }
   
    // **************************************
    public function listarPeliculasAction()
    {
        $datos = $this->getDoctrine()
             ->getRepository('edcBundle:peliculas')
            ->findAll();
       
        // Crear array auxiliar para que en los listados muestre los nombres y no los id
        $arrCineastas = array();
        foreach ($datos as $clave => $valor) {
            $idCineasta = $valor->getIdDirector();
            $nomDirector = $this->getNombreCineasta($idCineasta);
            $idCineasta = $valor->getIdActor1();
            $nomActor1 = $this->getNombreCineasta($idCineasta);
            $idCineasta = $valor->getIdActor2();
            $nomActor2 = $this->getNombreCineasta($idCineasta);
           
            $arrAux = array("nomDirector"=>$nomDirector, "nomActor1"=>$nomActor1,"nomActor2"=>$nomActor2);
            $arrCineastas[$valor->getId()] = $arrAux;
        }
 
   
        return $this->render('edcBundle:Default:listarPeliculas.html.twig',
                array("arrDatos"=>$datos, "arrCineastas"=>$arrCineastas));
    }
 }