1

私は賭けのウェブページを開発しようとしています。エンティティ "Apuesta" (賭け) とエンティティ "Partido" (試合) があります。「Apuesta」には、Partido のコレクション (attr $Partidos 内) と、コレクションを返すゲッター 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」は自動的に自身の「Partido」をレンダリングし、各「Partido」は自分の $Type が 1 か 0 かを知る必要があります。問題は、$builder->getData() が「Partido」エンティティを取得しないことです。だけでなく、ヌルでもあります。

私が考えた別の方法は、エンティティ パラメータ「Partido」で構成することでしたが、問題は、「Apuesta」フォームが「Partido」のコレクションをレンダリングするため、単一のオブジェクト「Partido」を渡すことができないことです。 、コレクションでもあります。

非常に単純なフォームであるため、フォームイベントを使用しないようにしました。

どうもありがとう!

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 に答える