Propagar parametros custom de un FormType a un FormType Embebido

Al hilo del mi ultimo post acerca de pasar parametros custom a un FormType desde un controlador, para por ejemplo rellenar un select con valores que vienen de otro sitio, me a surgido la duda siguiente:

¿Es posible propagar ese campo custom a un formulario embebido dentro del mismo FormType? Es decir, imaginad que tenemos un FormType con una serie de campos y dentro de ese FormType tenemos otro FormType con otros campos el cual un de ellos tambien se rellena con información externa.

Ejemplo:

CreateIncidentType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $incidentType = $options['incident_type'];
    $incidentTypesOptions = array('' => '');
    /** @var IncidentType $item */
    foreach ($incidentType as $item) {
     $incidentTypesOptions[$item->getName()] = $item->getCode();
    }

    $builder
         ...OTROS CAMPOS
         ->add('visit_delivery', VisitType::class, array(
              'label' => 'Visita de Entrega',
              'incident_type' => $incidentType,
              'attr' => array(
                     'class' => 'form-control visit-delivery hide'
               ),
              'label_attr' => array(
                    'class' => 'hide'
              )
     ));
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => CreateIncident::class,
        'incident_type' => null
    ));
}

He marcado en color las cosas a tener en cuenta. En mi caso VisitType es un formulario embebido dentro del CreateIncidentType y que tb recibe un parametro custom. Para ello, hacemos exactamente lo mismo que antes:

VisitType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $incidentType = $options['incident_type']; 
    $builder
        ->add('visit_type_code', ChoiceType::class, array(
             'label' => 'Tipo',
             'choices' => $incidentType,
             'attr' => array(
                  'class' => 'form-control visit-type-code',
             ),
             'required' => true
         ));
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Visit::class,
        'incident_type' => null
    ));
}

De esa forma, hemos “propagado” el parametro que recibe el formtype inicial hacia el formulario embebido para usarlo dentro de el.

Por cierto, recordad que en el controller cuando creais el Form teneis que hacerlo asi:

$incidentModel = new CreateIncident();
$incidentForm = $this->createForm(CreateIncidentType::class, $incidentModel, array(
 'incident_type' => $incidentTypes
));

Espero que os sirva de ayuda o os de una idea de como enfocarlo.

Si te a gustado, ya sabes retuit, comparte y comenta ¡¡

Saludos Devs ¡¡¡

Anuncios

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