从Twig中的ChoiceType元素直接访问特定选项

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”对象的方法“existing”不存在
我尝试过各种可能性,包括.get()和迭代.choices() [这最终给我不能使用form_widget()输出的ChoiceView对象]。我尝试制作一个自定义类型,封装一个单选按钮加上相关的设置字段,但由于元素名称的创建方式,我无法使它们相互排斥。我还尝试制作一个更复杂的类型,表示两个选项和相关字段,但再次无法访问和渲染类型模板中的特定选项。
理想情况下,我希望在API中找到我简单地忽略并且可以找到/替换并使其工作的东西。否则,建议或指向更适合Symfony的方法的链接将不胜感激。
2个回答

3
我曾经遇到类似的情况,并通过以下方式解决:
<li>
    {{ form_widget(form.myRadioField.children[0]) }}
</li>
<li>
    {{ form_widget(form.myRadioField.children[1]) }}
</li>

这并不是干净、可重用、最佳实践的代码,但它可以工作。


啊!这确实有效,而我尝试的其他方法都不行……但正如你所说,它并不可重用……你有没有找到另一种方法? - matt
是的,实际上Twig提供了一种覆盖任何表单部分布局的方法。即使是针对一个特定的字段。您应该利用这个可能性来自定义它。 - i.am.michiel

0

你尝试过类似这样的东西吗:

<ul>
    <li>
        {{ form_widget(form['settings_group']['existing']) }}
        [ .. dropdown ..]
    </li>
    <li>
        {{ form_widget(form['settings_group']['override']) }}
        [ .. text input .. ]
    </li>
</ul>

嗨,我很有希望。虽然接近成功,但还差一点。我收到了以下提示:类型为“Symfony\Component\Form\FormView”的对象(具有ArrayAccess)中的键“existing”不存在... - Endre B.
一个想法:你是否使用Twig的{{ dump(<var_name>) }}来打印对象内容以调试代码?稍后我会更仔细地看一下你想要实现什么。 - Rui Carvalho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接