7

我的项目要求我在保留数据库结构的同时重建大型系统的功能(出于历史计费原因)。我从 Symfony 2.0.x 开始,并开始升级到 Symfony 2.1.2。

以前,我可以使用点表示法在 Twig 中直接访问单选组的(multiple = false,expanded = 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”的“现有”方法不存在

我尝试了各种可能性,包括 .get() 和迭代 .choices() [最终给了我无法使用 form_widget() 输出的 ChoiceView 对象]。我尝试制作一个自定义类型,其中包含一个单选按钮和相关的设置字段,但是由于元素名称的创建方式,我不能让它们相互排斥。我还尝试制作一个表示选项和关联字段的更复杂的类型,但再次无法访问和呈现类型模板中的特定选择。

理想情况下,我希望 API 中有一些我只是忽略的东西,并且可以找到/替换并让它工作。否则,将不胜感激有关(或指向)对 Symfony 更友好的方法的建议。

4

2 回答 2

3

我遇到过类似的情况并以这种方式解决了它:

<li>
    {{ form_widget(form.myRadioField.children[0]) }}
</li>
<li>
    {{ form_widget(form.myRadioField.children[1]) }}
</li>

这绝不是干净、可重用、最佳实践的代码,但它确实有效。

于 2013-01-13T21:00:38.360 回答
0

您是否尝试过类似的方法:

<ul>
    <li>
        {{ form_widget(form['settings_group']['existing']) }}
        [ .. dropdown ..]
    </li>
    <li>
        {{ form_widget(form['settings_group']['override']) }}
        [ .. text input .. ]
    </li>
</ul>
于 2012-10-07T20:13:37.807 回答