symfony formularios formType

vamos a usar nuestra entidades employee, para crear un formulario de creacion de empleados:

nos audaremos de el sgt comando de consola:

php app/console doctrine:generate:form AppBundle:Employee --no-interaction

esto generará el archivo appBundle/Form/EmployeeForm.php

al archivo generado le vamos a tocar la parte para que se pueda mostrar el conjunto de roles como checkboxes

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EmployeeType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('name')->add('address')->add('dni')->add(
    'rolesCollection', 'entity',
    [
    'class' => 'AppBundle\Entity\Role',
    'property' => 'name',
    'multiple' => TRUE,
    'expanded' => TRUE,
    'label' => 'Roles',
    ]
    );
    }
   
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Employee'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'appbundle_employee';
    }


}


si expanded es False, los roles se mostrarán en un combobox

las validaciones se definen en los atributos de la entidad

en configureOptions...el array con la key data_class define la relacion con la entidad.

ahora ya podemos crear el action en el controller para llamar al template que contendrá el formulario,
en este mismo action vamos a manejar el submit que se hará desde el formulario.
el formulario no tiene un action definido por lo que el evento submit llamará al mismo action.




/**
* @Route("/new-employee")
*/
public function newemployeeAction(Request $request)
{
$form = $this->createForm(EmployeeType::class);
// only handles data on POST
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//dump($form->getData());die;
$employee = $form->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($employee);
$em->flush();
$this->addFlash('success', 'Empleado creado!');
return $this->redirectToRoute('admin_employee_list');
}
return $this->render('admin/employee/new.html.twig', [
'employeeForm' => $form->createView()
]);
}
crear
en app/Resources/views/admin/empolyee/new.htm.twig

{% extends 'base.html.twig' %}
{% block body %}
    <div class="container">
        <div class="row">
            <div class="col-xs-12">
                <h1>Nuevo Empleado</h1>
                {{ form_start(employeeForm) }}
                    {{ form_widget(employeeForm) }}
                    <button type="submit" class="btn btn-primary">Guardar</button>
                {{ form_end(employeeForm) }}
            </div>
        </div>
    </div>
{% endblock %}

para mostrar el mensaje flash, editamos el archivo base.html.twig

....
<body>
        {% for msg in app.session.flashBag.get('success') %}
                <div class="alert alert-success">
                    {{ msg }}
                </div>
        {% endfor %}
....

para que el formulario tenga un mejor aspecto vamos a habilitar bootstrap en config.yml


twig:
   form:
        resources: ['bootstrap_3_horizontal_layout.html.twig']

No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable