如果自定义条件匹配,则从实体表单字段中删除实体

时间:2015-05-13 08:49:15

标签: forms symfony entity

我有一个取消订阅表单,其中第一个字段是实体字段,获取我的UnsubscribeType实体:

$builder
    ->add('type', 'entity', array(
        'class' => 'Evo\SubscriptionBundle\Entity\UnsubscribeType',
        'property' => 'name',
        'label' => 'Choose process type',
        'empty_value'   => 'Choose an option',
        'empty_data' => null,
        'label_attr' => array(
            'class' => 'control-label',
        ),
        'attr' => array(
            'class' => 'form-control',
        ),
    ))

此集合包含2个实体,#1和#2。如果关于authed用户的自定义测试失败,我想从select字段中删除实体#2。

假设我要测试$this->getUser()->getCustomField()。如果是false,那么我想从包含我的UnsubscribeType实体的选择字段中删除实体#2。

知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

也许您可以从控制器向表单构建器传递测试结果,然后使用'property' => 'name''choices => // fetch entity #1 here

所以,像这样

public function buildForm(FormBuilderInterface $builder, array $options)
{
    if($options['customField'] === TRUE)
    {
        $builder
            ->add('type', 'entity', array(
               'class' => 'Evo\SubscriptionBundle\Entity\UnsubscribeType',
               'property' => 'name',
               // ..
        ;
    }
    else
    {
        $builder
            ->add('type', 'entity', array(
               'class' => 'Evo\SubscriptionBundle\Entity\UnsubscribeType',
               'choices' => $options['customField'],
               // ..
        ;
    }
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    // ..

    $resolver->setRequired(array(
        'customField'
    ));
}

在你的控制器中:

$form = $this->get('form.factory')->create(new EntryType(), $entry, array(
        'customField' => $this->getUser()->getCustomField()
));

getCustomField()返回true或要填充选择字段的实体(或实体集合)。我的解决方案将涉及更改getCustomField方法,但不知道是否适合。