Mr. 14
Mr. 14

Reputation: 9528

Symfony2 passing values to collection form type

I have the following entity relations:

So, in my CustomerType, I have

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ...
        ->add('addresss', 'collection', array(
            'label' => 'customer.address',
            'type' => new AddressType(),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
        ))
    ;
}

And in my AddressType, I have

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ...
        ->add('city', 'entity', array(
            'class' => 'MyCustomerBundle:City',
            'query_builder' => function(CityRepository $cr) use ($options) {
                return $cr->getCityQB($options['county']);
            },
            'property' => 'city',
            'empty_value' => '',
        ))
    ;
}

My goal is to only display the set of cities for their corresponding county. I can get the values into CustomerType from $options but how can I pass down the values to AddressType? So that each address gets its corresponding county to look up the cities?

Any help would be appreciated. Thanks!

Upvotes: 7

Views: 10592

Answers (3)

Themer
Themer

Reputation: 659

in symfony3 :

$builder->add('example', CollectionType::class, array(
    'entry_type'   => ExampleType::class,
    'entry_options'  => array(
        'my_custom_option'  => true),
));

Upvotes: 8

JhovaniC
JhovaniC

Reputation: 304

I think you could use the 'options' option of the collection type. It's better than using the constructor in case you want to reuse the form elsewhere.

Symfony Form Reference: Collection Type

But remember to define the variable in your setDefaultOptions method. (Both forms must have it)

Upvotes: 3

Andy.Diaz
Andy.Diaz

Reputation: 3277

Use the constructor in AddressType, its works for me..

CustomerType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ...
        ->add('addresss', 'collection', array(
            'label' => 'customer.address',
            'type' => new AddressType($your_variable),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
        ))
    ;
}

AddressType:

private $your_variable;

public function __construct($variable)
{
    $this->your_variable= $variable;
}
...
public function buildForm(FormBuilderInterface $builder, array $options){
    $your_variable = $this->your_variable;
    'query_builder' => function(CityRepository $cr) use ($your_variable) {
        return $cr->getCityQB($your_variable);
    },
}

Upvotes: 4

Related Questions