1

我正在尝试开发一个投注网页。我有一个实体“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”实体,但也是一个空值。

我认为这样做的另一种方法是使用实​​体参数“Partido”进行构造,但问题是“Apuesta”表单呈现“Partido”的集合,所以我不能传递单个对象“Partido” ,也是一个集合。

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

非常感谢!

4

1 回答 1

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 实体中执行相同的操作以从控制器中获取选项(从选项数组中获取它,并且不要忘记将其添加为选项)。

如果要在控制器中传递参数,请使用以下内容:

$form = $this->createForm(new JornadaType(), $jornada, array('tipo' => $tipo));
于 2013-03-04T15:45:07.623 回答