大声で考えてみましょう。票のコレクションタイプのエンティティバインドフォームを使用する場合は、すべての票をすべての条件にバインドします。
この場合、基準エンティティIDに基づいてフォームの配列をお勧めします。
投票フォームタイプの作成:コントローラで
class VoteType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('answer', ChoiceType::class, array(
'choices' => array(
'Yes' => true,
'No' => false,
)
))
->add('note', TextareaType::class),
->add('criteriaId', HiddenType::class),
->add('vote', SubmitType::class);
...
...
}
- のcriteriasのトラバース取得(リポジトリの例方法にfindAll()メソッド)と基準のエンティティIDに基づいて名前のフォームの配列を作成します。
$ff = $this->get('form.factory');
foreach ($criterias as $criteria) {
$voteForms[] = $ff->createNamedBuilder(
'vote_'.$criteria->getId(),
new VoteType,
array(
'criteriaId' => $criteria->getId()
)
)
->getForm()
->createView();
}
return $this->render(someView, array("voteForms" => $forms));
フォームが送信されると、hidden criteriaIdフィールドによって投票がどの基準に属するかを特定できます。
EDIT - を追加しました:ボタン一つですべてのフォームを送信する方法
'criteriaId' フィールドと '投票' VoteTypeに提出が不要になりました - そう:
class VoteType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('answer', ChoiceType::class, array(
'choices' => array(
'Yes' => true,
'No' => false,
)
))
->add('note', TextareaType::class);
...
...
}
と中をコントローラーはVoteTypesメンバーのフォームを作成するだけです:
$fb = $this->createFormBuilder();
foreach ($criterias as $criteria) {
$fb->add('vote-criteria-'.$criteria->getId(), VoteType::class);
}
$fb->add('submit', SubmitType::class);
$frm = $fb->getForm();
$frm->handleRequest($request);
if ($frm->isSubmitted() && $frm->isValid()) {
// all criteria vote data
$frm->getData();
...
}
return $this->render(someView, array('form' => $frm->createView()));
したがって、Criteriasのリストのみに基づいてチェックボックス(または、...)のリストが必要ですか?または投票に記入するいくつかのプロパティがありますか? –
Criteriasは変更されません。各基準の投票のみ(必須ではありません)。投票には2つのラジオボタンとテキストエリアがあり、メモを記入します。 – wyllyjon