Enviar parametros a un FormType desde el Controller

El truco de hoy consiste en enviar información a un formulario desde un controlador. En mi caso el problema que tengo es el siguiente:

Tengo un formulario en el que los valores de un campo select (ChoiceType) los recojo de un servicio de una API Rest y se los tengo que enviar al formType para rellenar los valores(choices) de un campo de tipo ChoiceType.

La forma de hacerlo seria la siguiente:

Controller
$form = $this->createForm(ResumeCartType::class, $resumeCart, array(
    'pickupTime' => $timetablePickup->getPickup(),
    'deliveryTime' => $timetableDelivery->getDelivery()
));

En mi caso le envio 2 parametros (pickupTime y deliveryTime) cuyos valores son de tipo ArrayCollection con la informacion. Despues habria que recogerlos en el formulario de la siguiente forma:

FormType(ResumeCartType)
class ResumeCartType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
 $resolver->setDefaults(array(
 'data_class' => 'Appbundle\Model\ResumeCart',
 'pickupTime' => null,
 'deliveryTime' => null
 ));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
    /** @var ArrayCollection $pickupRanges */
    $pickupRanges = $options['pickupTime'];

    //Operaciones para formar el array asociativo para 
    //el campo ChoiceType
    $pickupValues = array();
    /** @var Range $range */
    foreach ($pickupRanges as $range) {
        array_push($pickupValues, array($range->getTimeSlotCode() => $range->getTimeSlotCode()));
    }

    /** @var ArrayCollection $deliveryRanges */
    $deliveryRanges = $options['deliveryTime'];    
    $builder
            ...//Otros campos de tu modelo
            ->add('time_pickup', ChoiceType::class, array(
                'choices' => $pickupValues,
                'expanded' => true,
                'multiple' => false,
                'required' => true
            ))
}

Lo primero es definir esos parametros en el metodo configureOptions() y despues podemos recogerlos usando el parametro $options[‘clave’], hacer lo que necesitemos y despues pasarselo al campo que necesitemos. En mi caso recibo un ArrayCollection que tengo que transformar a un array simple asociativo(clave => valor) para pasarselo al ChoiceType ya que este objeto necesita ese formato para formar correctamente el elemento <select> en la vista.

De esta forma tan simple, podemos enviarle los parametros que necesitemos a nuestros formularios. Existen muchas mas formas, incluso recuperando datos de una Entidad usando traits, pero eso ya viene muy bien explicado en la documentacion oficial de Symfony.

Espero que os sirva y si teneis sugerencias, no dudeis en postearlas. Seguro que hay muchas mas formas de hacer estas cositas, y incluso mejores supongo, pero esta es la mas sencilla que he encontrado.

Un saludo SymfonyDevs ¡¡

Edito:

Existe otra opcion oficial en Symfony que desconocia hasta ayer que soluciona esto sin recorrer la coleccion manualmente. En nuestro FormType debemos indicarle el choice_label y choice_value y Symfony lo hace solo por nosotros.

->add('incident_type_code', ChoiceType::class, array(
    'label' => 'Tipo de Incidencia',
    'choices' => $options['incident_types'],
    'choice_label' => 'name',
    'choice_value' => 'code',
    'placeholder' => '',
    'attr' => array(
        'class' => 'form-control incident-type-code',
    ),
    'required' => true
))

De esa forma nos ahorramos el bucle y seguimos fieles a Symfomy.

Saludos ‘¡

Anuncios

Un comentario en “Enviar parametros a un FormType desde el Controller

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s