我正在尝试开发一个赌注网页。我有一个实体“Apuesta”(赌注)和一个实体“Partido”(匹配)。 “Apuesta”有一个Partido(在attr $ Partidos中)和getter getPartidos()的集合,它们返回集合。 “Partido”有一个类型(0或1),它根据此值指定其形式的字段。
我想要的是将“Partido”表单包含在“Apuesta”表单中,但我希望“Partido”知道自己根据$ Type值呈现自己的表单。显然,“Apuesta”是在他自己的“Partidos”数据库中创建的。
我的代码是:
class ApuestaForm extends AbstractType{
public function buildForm(FormBuilder $builder, array $options)
{
$p = $builder->getData()->getPartidos();
$builder->add('Jornada')
->add('Partidos', 'collection', array('type' => new PartidoForm()));
}
public function getName(){
return 'ApuestaForm';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'A\ApuestaBundle\Entity\Apuesta',
);
}
}
#
class PartidoForm extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
**$tipo;
//$partido = $builder->getData();
//$tipo = $partido->getTipo();
$builder->add('Local')
->add('Visitante')
->add('Tipo')
->add('Jornada');
if ($tipo == 1){
$builder->add('some field 1')
}
else{
$builder->add('some field 2')
}
}
public function getName(){
return 'PartidoForm';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'A\ApuestaBundle\Entity\Partido',
);
}
}
这样,“Apuesta”自动呈现他自己的“Partidos”,每个“Partido”应该知道他的$ Type是1还是0.问题是$ builder-> getData()没有得到“Partido”实体,但也是null。
我认为这样做的另一种方式是使用实体参数“Partido”进行构造,但问题是“Apuesta”表单呈现“Partido”的集合,因此我无法传递单个对象“Partido”,也是一个集合。
我尽量不使用Form事件,因为它是一个非常简单的Form。
非常感谢!
答案 0 :(得分:0)
要将参数传递给表单,您必须执行以下操作:
class PartidoForm extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
// $tipo;
$tipo = $options['tipo']; // <<---- Get "tipo" from the options array
//$partido = $builder->getData();
//$tipo = $partido->getTipo();
$builder->add('Local')
->add('Visitante')
->add('Tipo')
->add('Jornada');
if ($tipo == 1){
$builder->add('some field 1')
}
else{
$builder->add('some field 2')
}
}
public function getName(){
return 'PartidoForm';
}
public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'A\ApuestaBundle\Entity\Partido',
'tipo' => null,** // Set a default null value, or whatever value you want as default
);
}
}
现在,Partido表单类型接受参数tipo,所以当你调用它时......
public function buildForm(FormBuilder $builder, array $options)
{
$p = $builder->getData()->getPartidos();
$builder->add('Jornada')
->add('Partidos', 'collection', array(
'type' => new PartidoForm()
'options' => array('tipo' => 1)
)
);
}
当然你可以在Jornada实体中做同样的事情来从控制器中获取一个选项(从options数组中获取它,并且不要忘记将它添加为选项)。
如果要在控制器中传递参数,请使用以下内容:
$form = $this->createForm(new JornadaType(), $jornada, array('tipo' => $tipo));