0

文字列エンティティ プロパティを持つ Symfony2 アプリがあります。他のプロパティの値に応じて、この文字列は別のエンティティの ID、日付、またはランダムな文字列を表すことができます。

私の問題は、プロパティが別のエンティティの ID を表す場合です。私の関連付けられたフォームは (おそらく) 文字列ではなくエンティティを取得することを想定しているため、フォーム フィールド (この場合は利用可能なエンティティのドロップダウン) はデータベースに保存されている値を適切に反映していません。リスト内のアイテム。

プロパティの値がエンティティ ID であることをフォームに理解させるにはどうすればよいですか (そうである場合)。

4

1 に答える 1

0

まず、データベースが間違った方法で設計されていることです。文字列プロパティは常に文字列である必要があり、日付プロパティは常に日付である必要があり、関係プロパティは常に関係である必要があります。これは混乱を防ぐだけでなく、パフォーマンスを向上させます (適切なプロパティがエンティティとして定義されている場合、symfony はパフォーマンスの高い結合クエリを生成し、プロキシ クラスを使用するため)。

あなたの場合、解決策があります。任意のオプションをフォーム タイプ クラスに渡し、さまざまなフィールド セットを動的に構築できます。

SomeController.php:

public function someAction()
{

    $propertyType = array();

    // put here your conditions to determine property type
    if (property is string)
    {
        $propertyType['type'] = 'string';
    }
    else if (property is datetime)
    {
        $propertyType['type'] = 'datetime';
    }
    else if (property is entity)
    {
        $propertyType['type'] = 'entity';
        $propertyType['class'] = '\Acme\DemoBundle\Entity\Something';
    }

    $form = $this->createForm(new SomeFormType(), $someData, array('propertyType' => $propertyType));
}

SomeFormType.php:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setRequired(array(
        'propertyType',
    ));
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $array = array('required' => true, 'label' => 'Your label');
    if ($options['propertyType']['type'] == 'entity'
        $array['class'] = $options['propertyType']['class']

    $builder
        ->add('title', $options['propertyType']['type'], $array)
    ;
}
于 2013-06-23T15:33:51.627 に答える