1

在我的项目中,我有一个抽象实体,我们称之为 Parent,以及两个子实体:ChildA 和 ChildB,它们扩展了 Parent 类。我正在使用学说和单表策略, ChildA 和 ChildB 是相似的。这部分工作正常,现在我的问题出在表格上。

我想要一个可用于创建其中一个类(ChildA 或 ChildB)的实体的表单,因此我希望在表单中有第一个字段来选择用户想要创建的实体类型,并且显示该类的字段(是否只有一个不同的字段,我正在使用 javascript 根据所选类显示/隐藏字段)

为此,我创建了一个包含 ChildA 和 ChildB 的所有字段以及用于选择类型的字段的表单,我的想法是在控制器中检查类型,然后根据选定的内容创建与 ChildA 或 ChildB 关联的特定表单键入,并将其与从主窗体接收到的值绑定,但这里的问题是如何在此窗体中显示错误

任何人都有解决这个问题的好方法?

4

1 回答 1

1

我认为你这样做很困难。
对于这个问题,我将创建 2 个表单(FormChildA,FormChildB),并相应地关联字段。
因为无论如何您都在使用 javascript,所以只需使用选项呈现页面并使用 ajax 获取表单:

<div id="select-type">
    <button value="child_a" type="button">Select ChildA</button>
    <button value="child_b" type="button">Select ChildB</button>
</div>
<div id="form-container"></div>
<script>
    $('#select-type button').on('click', function(event) {
        event.preventDefault();
        $.get('path/to/get_ajax_form', {type: $(this).val()}, function(data) {
            $('#form-container').html(data);
        });
    });
</script>

创建一个 Controller 方法来检索表单:

public function getAjaxFormAction()
{
    $type = $this->get('request')->query->get('type');
    switch( $type ) {
        case 'child_a':
            $form = $this->createForm(new FormChildA, new ChildA);
            break;
        case 'child_b':
            $form = $this->createForm(new FormChildB, new ChildB);
            break;
    }

    return $this->render('AcmeBundle:Forms:_type_form.html.twig', array(
       'form' => $form->createView(),
       'type' => $type,
    ));
}

为每个表单添加一个带有表单类型值的隐藏字段,
这样您就可以用一种方法验证这些表单(与检索它们的方式相同)。

这使得单独修改和验证每个表单变得更加容易!

于 2013-01-18T15:46:19.697 回答