【发布时间】:2015-08-17 05:20:52
【问题描述】:
我发现唯一可行的方法是在表单类型的 buildForm 方法中添加模型转换器,如下所示:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new IssueToNumberTransformer($entityManager);
$builder->add(
$builder->create('issue', 'text')->addModelTransformer($transformer)
);
}
但是我有一个表单域,当另一个表单域具有有效值时会显示,所以我宁愿在FormEvent::PRE_SET_DATA 事件中创建表单域。
1。一种错误的方式
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder) {
/** @var $order \VMSP\OrderBundle\Entity\OrderInterface */
$order = $event->getData();
$form = $event->getForm();
/** @var $serviceType \VMSP\StoreBundle\Entity\ServiceType */
$serviceType = $order->getServiceType();
//only home service needs user's address
if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
//won't work
$form->add(
$builder->create('address','hidden')
->addModelTransformer($this->addressTransformer),
array(
'label' => 'vmsp_order.contact.form.address',
)
);
}
}
有人建议
$form->add(
$builder->create('address', 'hidden')
->addModelTransformer($this->addressTransformer),
array( 'label' => 'vmsp_order.contact.form.address')
);
不幸的是,它抛出了这个错误:
给定类型为“字符串、整数或 Symfony\Component\Form\FormInterface”、“Symfony\Component\Form\FormBuilder”的预期参数
2。另一个错误的方式
if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
$form->add(
'address',
'hidden',
array('label' => 'vmsp_order.contact.form.address')
);
$form->get('address')
->getConfig()
->addModelTransformer($this->addressTransformer);
}
出现错误:
一旦将构建器转换为 FormConfigInterface 实例,就无法再访问 FormConfigBuilder 方法。
我在上面列出了两种错误的方式,因为我发现很多帖子都说这些方式是正确的,当然,它们不是。这篇文章和symfony2-form-events-and-model-transformers 是同一个问题,但这个答案不是我需要的,所以我的问题是,有什么方法可以在某个表单字段的表单事件中添加模型转换器?
【问题讨论】: