Php Symfony2表单获取表单类型中的数据值
我要修改具有内容值的表单: 我尝试使用“PRE_BIND”事件,但如果表单不是第一次发送,则此操作无效。 我有这个:Php Symfony2表单获取表单类型中的数据值,php,forms,symfony,events,Php,Forms,Symfony,Events,我要修改具有内容值的表单: 我尝试使用“PRE_BIND”事件,但如果表单不是第一次发送,则此操作无效。 我有这个: <?php namespace YOU\CommercantBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormEvent; use Symfony\Compone
<?php
namespace YOU\CommercantBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class LivraisonChoixType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) use ($builder)
{
$form = $event->getForm();
$data = $event->getData();
if ((int)$data['pays'] > 0) {
$form->remove('livreur');
$pays = $data['pays'];
$form->add('livreur','entity',array(
'property' =>'name',
'class' => 'YOUAdminBundle:Livreur',
'label' => 'Livreur :',
'query_builder' => function($er) use ($pays){
return $er->createQueryBuilder('c')
->join('c.pays', 'p')
->andWhere('p.id= :pays')
->addOrderBy('c.name', 'ASC')
->setParameter('pays', $pays);
},
)
);
}
});
$builder
->add('pays','pays',array('label'=>'Destination :'))
->add('livreur','entity',array(
'property' =>'name',
'class' => 'YOUAdminBundle:Livreur',
'label' => 'Livreur :',
'query_builder' => function($er) {
return $er->createQueryBuilder('c')
->join('c.pays', 'p')
->andWhere('p.id= :pays')
->addOrderBy('c.name', 'ASC')
->setParameter('pays', 0);
},
)
)
->add('prix','number',array('required'=>true,'label' => 'Frais :'))
->add('prix2','number',array('required'=>false,'label' => 'Frais en second article :'))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'YOU\CommercantBundle\Entity\LivraisonChoix',
));
}
public function getName()
{
return 'you_commercantbundle_livraisonchoixtype';
}
}
这可能不是最好的答案,但当我想在呈现表单之前为表单赋值时,我会这样做。基本上,我会将表单绑定到这样一个实体:
// First create entity that will bind with form
$someEntityInstance = new myEntity();
$someEntityInstance->setPropertyOne(5);
$someEntityInstance->setPropertyTwo('another value');
// Then bind entity to form
$myForm = $this->createForm(new myFormType, $someEntityInstance);
从表单映射到实体的任何属性都将具有相同的值,在视图中呈现时,将显示该值。虽然如果我在一个表单中表示了多个实体,我会创建一个名为processor的新事物类,该类将属性映射并绑定到表单,该表单还可以更改表单字段值
这是我知道的在呈现表单字段值之前更改表单字段值的最简单方法。表单的预期行为是什么?用户看到表单,输入“支付”,然后提交,得到相同的表单和不同的选择?您在控制器中做什么?查询需要用“pays”输入值更新参数“pays”?您所说的“但如果表单不是第一次发送,这不起作用”是什么意思?当然,在更新字段之前,您必须发送一些请求/提交表单,对吗?当我编辑内容时,数据在这里,但事件未被使用,因为表单未发送…如果没有请求,则无法更新表单。。。它无法自我更新。为什么不通过ajax发送表单呢?
// First create entity that will bind with form
$someEntityInstance = new myEntity();
$someEntityInstance->setPropertyOne(5);
$someEntityInstance->setPropertyTwo('another value');
// Then bind entity to form
$myForm = $this->createForm(new myFormType, $someEntityInstance);