symfony3 formularios

debemos tener:
una clase -> que representa los datos a mapear en el formulario
src/AppBundle/Model/Entity/Contacto.php
una clase formulario -> en donde se mapean los campos de la clase src/AppBundle/Form/ContactoType.php



Si tenemos en Contacto.php los campos nombre y email,

en ContactoType (extends AbstractType) deberiamos tener algo asi:

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('nombre', TextType::class, array(
                    'required' => false
                ))
                ->add('email', EmailType::class, array(
                    'required' => false
                ))
                ->add('save', SubmitType::class, array('label' => 'Enviar'))
        ;
    }
nota: al indicar que el campo email es del tipo EmailType le agregamos una validacion html5 al campo en tiempo real, antes de enviar los datos.

Para hacer uso de este formulario desde el controller:

class ContactoController extends Controller {

    /**
     * @Route("/contacto", name="contacto.index")
     */
    public function indexAction() {
        $contacto = new Contacto();

        $form = $this->createForm(ContactoType::class, $contacto);

        return $this->render('contacto/form.html.twig', [
                    'form' => $form->createView(),
        ]);
    }

para mostrar el formulario en la vista:

{{ form_start(form, {'action': path('contacto.guardar')}) }}
                    <div class="form-group {% if not form.nombre.vars.valid %}has-error{% endif %}">
                        {{ form_label(form.nombre, null, {'label_attr': {'class': 'col-sm-2 control-label'}}) }}
                        <div class="col-sm-5">
                            {{ form_widget(form.nombre, {'attr': {'class': 'form-control'}}) }}
                        </div>
                        <div style="color: red">{{ form_errors(form.nombre) }}</div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-5">
                            {{ form_widget(form.save, {'attr': {'class': 'btn btn-primary', 'role': 'button'}}) }}
                        </div>
                    </div>
{{ form_end(form) }}


en el Controller para manipular los datos del formulario (para guardarlos por ejemplo o mostrarlos)

    /**
     * @Route("/contacto/guardar", name="contacto.guardar")
     */
    public function guardarAction(Request $request) {
        $contacto = new Contacto();
        $form = $this->createForm(ContactoType::class, $contacto);

        $form->handleRequest($request);

        if ($form->isValid()) {
            // success!
            return $this->render('contacto/ok.html.twig', [
                        'form' => $form->createView(),
                        'contacto' => $contacto,
                        'titulo' => 'Sus datos enviado son los siguientes:',]);
        } else {
            // failure!
            $this->addFlash('error', 'Hay errores en el formulario, favor revisar los datos!');
            return $this->render('contacto/form.html.twig', [
                        'form' => $form->createView(),
                        'titulo' => 'Formulario con Errores',]);
        }
    }

nota: como los datos ya estan en 'contacto' si se quiere mostrar los datos enviados correctamente, se debe mandar como parametro este objeto:

<tr>
                                <td>{{ form_label(form.nombre) }}</td>
                                <td>{{ contacto.nombre }}</td>
</tr>



No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

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