在另一个表单工厂内动态生成表单



我正在尝试开发一个赌博网页。我有一个实体"Apuesta"(下注)和一个实体"Partido"(比赛)。"Apuesta"有一个Partido集合(在attr $Partidos中)和getter getPartidos(), 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' => 'AApuestaBundleEntityApuesta',
        );
    }
}
#
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' => 'AApuestaBundleEntityPartido',
        );
    }
}

这样,一个"Apuesta"自动渲染他自己的"Partido",每个"Partido"应该知道他的$Type是1还是0。问题是$builder->getData()没有得到"Partido"实体,而是一个null。

另一种方法,我认为这样做是做一个结构与实体参数"Partido",但问题是,"Apuesta"表单呈现"Partido"的集合,所以我不能传递一个单一的对象"Partido",但也是一个集合。

我尽量不使用表单事件,因为它是一个非常简单的表单。

非常感谢!

要将参数传递给表单,必须执行以下操作:

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' => 'AApuestaBundleEntityPartido',
        'tipo'     => null,** // Set a default null value, or whatever value you want as default
    );
}

}

现在,Partido Form Type接受参数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)
            )
    );
}

当然,你也可以在jordan实体中做同样的事情,从控制器中获取一个选项(从options数组中获取,不要忘记将其作为一个选项添加)。

如果你想在控制器中传递参数,使用这样的代码:

$form = $this->createForm(new JornadaType(), $jornada, array('tipo' => $tipo));

最新更新