Hacer consultas y conseguir el usuario dentro de un formulario de Symfony3

Hoy vamos a ver como hacer consultas y conseguir el usuario dentro de un formulario de Symfony3.

Cuando necesitamos más personalización y conseguir por ejemplo un desplegable con una serie de opciones salidas de la base de datos más allá de lo que nos ofrece por defecto Symfony3 en un formulario, es interesante lo que haremos ahora.

Vamos a ver como conseguir el usuario dentro de un formulario de Symfony3 y además como usar el query builder dentro de la clase del formulario.

Por un lado cuando creamos el formulario en la acción del controlador, le vamos a pasar un array con un indice llamado user y cuyo contenido sea el usuario logueado en mi caso.

$private_message = new PrivateMessage();
$form = $this->createForm(PrivateMessageType::class,$private_message, array('user' => $this->getUser()));

En la clase del formulario usaremos EntityType::class y query builder que por defecto permitirá hacer consultas con la entidad que le indiquemos al campo.

Si queremos que nos permita hacer cualquier tipo de consulta y casi cualquier cosa y nos devuelva los resultados que necesitamos, tendremos que utilizar el repositorio de la entidad y crear ahí un método.

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class PrivateMessageType extends AbstractType
{


    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    	$user = $options['user'];

        /**
         En choice_label mostramos los datos del objeto que nos devuelve query_builder que a su vez está
         llamando a un método que está en el repositorio
        **/
        $builder
         	->add('receiver', EntityType::class,
                            array(
				"class" => "BackendBundle:User",
				"choice_label" => function ($user) {
			        return $user->getName()." ".$user->getSurname()." - ".$user->getNick();
			    },
			    'query_builder' => function ($er) use($user) {

			        return $er->getRealUsers($user);
			    },
				"label" => "Para:",
				"attr" =>array("class" => "form-control")
			))
            ->add('message', TextareaType::class, array(
				"label" => "Mensaje",
				"required"=>"required", 
				"attr" =>array(
					"class" => "form-control spacing-input"
					)
				))
            ->add('file', FileType::class,array(
				"label" => "Archivo",
				"attr" =>array("class" => "form-control spacing-input"),
				"data_class" => null,
				"required" => false
			))
			->add('image', FileType::class,array(
				"label" => "Imagen",
				"attr" =>array("class" => "form-control spacing-input"),
				"data_class" => null,
				"required" => false
			))
			->add('Enviar', SubmitType::class, array("attr" =>array(
				"class" => "form-submit btn btn-success",
			)))
        ;
    }
    
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'BackendBundle\Entity\PrivateMessage',
            'user' => null
        ));
    }
}

Pues con esto ya sabemos hacer consultas y conseguir el usuario dentro de un formulario de Symfony3.

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post