7

I have the following entity relations:

  • A Customer has one-to-many Address
  • An Address has many-to-one County and many-to-one City
  • A County has one-to-many City.

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!

3 Answers 3

8

in symfony3 :

$builder->add('example', CollectionType::class, array(
    'entry_type'   => ExampleType::class,
    'entry_options'  => array(
        'my_custom_option'  => true),
));
Sign up to request clarification or add additional context in comments.

Comments

4

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);
    },
}

1 Comment

This solution is deprecated in Symfony 2.7 and can't be possible in 3.0. You can't pass parameters in Class formType now, but you can do it by inserting nex element in $options : stackoverflow.com/a/34035653/1338420
3

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)

1 Comment

This "options" option works also for custom defined types, extending AbstractType. Thanks for the clue!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.