私のプロジェクトでは、データベース構造を維持しながら大規模システムの機能を再構築する必要があります (これまでの課金上の理由から)。Symfony 2.0.x から始めて、Symfony 2.1.2 へのアップグレード プロセスを開始しました。
以前は、ドット表記を使用して Twig のラジオ グループ (複数 = false、展開 = true) の個々のオプションに直接アクセスできました。たとえば、私のフォームでは、次のような要素を定義しました。
$builder->add('settings_group', 'choice', array(
'choices' => array(
'existing' => 'A pre-existing setting group',
'override' => 'Specify an override instead'
),
'multiple' => false, 'expanded' => true,
'property_path' => false
)
);
私の Twig テンプレートでは、マークアップは次のようになりました。
<ul>
<li>
{{ form_widget(form.settings_group.existing) }}
[ .. dropdown ..]
</li>
<li>
{{ form_widget(form.settings_group.override) }}
[ .. text input .. ]
</li>
</ul>
「既存」または「オーバーライド」のラジオボタンは、エンティティが保存されたときにどのフィールドが永続化され、どのフィールドがリセットされるかを決定するため、私が必要としていたことに対して完全に機能しました。具体的には、ラジオボタンを手動で分離し、次のラジオボタンの前に他のさまざまなフォームフィールドを出力したいため、問題が発生します。これは、既存の機能とデータベースに基づいて、このシステムのさまざまな形で繰り返されるパターンです。
Symfony 2.1 にアップグレードすると、これができなくなり、エラーが発生します。
オブジェクト "Symfony\Component\Form\FormView" のメソッド "existing" が存在しません
.get() や .choices() の繰り返しなど、さまざまな可能性を試しました [これにより、form_widget() を使用して出力できない ChoiceView オブジェクトが得られます]。1 つのラジオ ボタンと関連する設定フィールドをカプセル化するカスタム タイプを作成しようとしましたが、要素名の作成方法が原因で、それらを相互に排他的にすることはできません。また、オプションと関連フィールドの両方を表すより複雑なタイプを作成しようとしましたが、タイプのテンプレートで特定の選択肢にアクセスしてレンダリングすることができませんでした。
理想的には、私が単に見落としていて、見つけて置き換えて機能させることができる API の何かを望んでいます。それ以外の場合は、これを行うためのより Symfony に適したアプローチに関するアドバイス (またはリンク) をいただければ幸いです。