0
votes

I have created a complex symfony form with nested collection. When i create my form with data from orm it works :

$categories = $this->getDoctrine()->getRepository('xx:CategoryNutritionProgram')->findAll();
$form = $this->createForm(new CategoryCollectionFormType(), array('categories' => $categories));

CategoryCollectionFormType :

class CategoryCollectionFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('categories', 'collection', array(
        'type' => new CategoryFormType(),
        'cascade_validation' => true,
        'allow_add' => true,
        'by_reference' => false,
        'allow_delete' => true,
        'prototype_name' => '__i__'
    ));
    }

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
    return 'simulator_category_collection';
    }
}

CategoryFormType :

class CategoryFormType extends AbstractType
{

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'hidden');

        $builder->add('nutritionPrograms', 'collection', array(
            'type' => new NutritionProgramFormType(),
            'cascade_validation' => true,
            'allow_add' => true,
            'by_reference' => false,
            'allow_delete' => true,
            'prototype_name' => '__j__'
        ));
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'xx\Entity\CategoryNutritionProgram'
        ));
    }

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'simulator_category';
    }
}

etc ...

But handleRequest() function doesn't work and $data are empty when i submit form. Where is the problem ? my code seems good

$data = array('categories' => array());
$form = $this->createForm(new CategoryCollectionFormType(), $data);
$form->handleRequest($request);

Below the data sent on POST request :

simulator_category_collection[categories][0][name]:cat1
simulator_category_collection[categories][0][nutritionPrograms][0][name]:prog1
simulator_category_collection[categories][0][nutritionPrograms][0][applications][0][name]:app1
simulator_category_collection[categories][0][nutritionPrograms][0][applications][0][product]:1
simulator_category_collection[categories][0][nutritionPrograms][0][applications][0][dose]:5
simulator_category_collection[categories][0][nutritionPrograms][0][applications][0][unit]:5
simulator_category_collection[categories][0][nutritionPrograms][0][applications][1][name]:app2
simulator_category_collection[categories][0][nutritionPrograms][0][applications][1][product]:2
simulator_category_collection[categories][0][nutritionPrograms][0][applications][1][dose]:6
simulator_category_collection[categories][0][nutritionPrograms][0][applications][1][unit]:6
simulator_category_collection[categories][0][nutritionPrograms][1][name]:prog2
simulator_category_collection[categories][0][nutritionPrograms][1][applications][0][name]:app3
simulator_category_collection[categories][0][nutritionPrograms][1][applications][0][product]:3
simulator_category_collection[categories][0][nutritionPrograms][1][applications][0][dose]:7
simulator_category_collection[categories][0][nutritionPrograms][1][applications][0][unit]:7
simulator_category_collection[categories][1][name]:cat2
simulator_category_collection[categories][1][nutritionPrograms][0][name]:prog3
simulator_category_collection[_token]:xxx

Thx for help

1
I think that the name of your fields must be simulator_category instead simulator_category_collection. - Airam
I have tried, it changes nothing. - Mewyn

1 Answers

0
votes

Resolved, instead of trying to get data from orginal object like this :

$data = array('categories' => array());
$form = $this->createForm(new CategoryCollectionFormType(), $data);
$form->handleRequest($request);
// here array $data is empty

I have to use $form->getData() because my array is passed by value