让我们大声思考 - 如果您使用实体绑定表单和集合类型进行投票,它总是会显示您所有将绑定到每个条件的投票。
在这种情况下,我会推荐基于标准实体 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);
...
...
}
在控制器中 - 获取可遍历的条件(例如存储库的方法 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));
提交表单后,您可以通过隐藏的 criteriaId 字段确定投票属于哪个标准。
编辑 - 新增:如何一键提交所有表单
不再需要在 VoteType 中提交的“criteriaId”字段和“投票” - 所以:
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()));