2
votes

I've got a form in Symfony2 that's not connected to any entity. It has a child form, of which 1..n instances can be added dynamically on the front-end.

$builder
    //car data
        ->add('cars', 'collection', array(
            'label' => ' ',
            'type' => new CarLeasingType(),
            'allow_add' => true,
            'prototype' => true,
        ))

The parent form has it's validation to validate other fields that are in the form.

public function getDefaultOptions(array $options)
{
    $collectionConstraint = new Collection(array(
        'fields' => array(
            //some fields an their validation
        ),
        'allowExtraFields' => true,
    ));

    return array('validation_constraint' => $collectionConstraint);
}

The child form (of type CarLeasingType) has it's own validation. My problem now has two levels:

  • I had to set 'allowExtraFields' to true in parent form validation constraint, otherwise I got a message like The fields 0, 1 were not expected
  • The validation constraint in the child form is not executed at all.

To explain why the cars fields from the subform are identified as 0 and 1 here is the JavaScript function I use to generate the subform dynamically from the data-prototype attribute:

function add_dynamic_field(holderId) {
    var collectionHolder = $('#' + holderId);
    if (0 === collectionHolder.length) return false;
    var prototype = collectionHolder.attr('data-prototype');
    form = prototype.replace(/<label class=" required">\$\$name\$\$<\/label>/, '');
    form = form.replace(/\$\$name\$\$/g, collectionHolder.children().length);
    collectionHolder.append(form);
}

How can I validate also each of the subforms added dynamically?

1

1 Answers

1
votes

Perhaps something along these lines might help:

public function somexAction()
{

    //get objects through the $form object

    //get validator service
    $validator = $this->get('validator');

    //validate objects manually
    foreach object as obj
       $errors = $validator->validate($obj);
    if (count($errors) > 0) {
        //...
    } else {
        //....
    }
}

Basically, it means taking advantage of the validator service.

Taken from http://symfony.com/doc/current/book/validation.html

For more info on the validator methods/etc., check out the api.