【问题标题】:(Symfony\Form) prevent form fields from being generated automaticly(Symfony\Form) 防止自动生成表单字段
【发布时间】:2015-09-15 11:36:22
【问题描述】:

我有一个树枝模板。它遍历表单集合 (form.MeteringCodes)。问题是,我只需要显示一个字段的值,当我不明确使用“form_row(...)”时,symfony 会在表单末尾自动生成该字段

    {{ form_start(form) }}
...
            <tbody>
                {% for metCode in form.MeteringCodes %}
                    {{ form_row(metCode.id) }}
                <tr>
                    <td>{{ metCode.desc.vars.value }} {# <-- Here is the pure value #}</td>
                    <td>{{ form_row(metCode.sdesc) }}</td>
                    <td style="width:20%;">{{ form_row(metCode.type) }}</td>
                    <td style="width:15%;">{{ form_row(metCode.state) }}</td>
                </tr>
                {% endfor %}
             </tbody>
...
        {{ form_end(form) }}

我看到了两种方式。一种是禁用这种“自动生成”行为。第二个可能是如果我只是从原始对象本身获取值,而不将其定义为字段(如果可能的话)。

集合类型本身:

class MeteringCodeType extends \Symfony\Component\Form\AbstractType
{
    public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options)
    {
        $builder->add('id', 'hidden');
        $builder->add('desc', 'text', ['label' => false, 'disabled' => true]);
        $builder->add('sdesc', 'text', ['label' => false]);
        $builder->add('type', 'choice', ['choices'  => array('L' => '...', 'D' => '...', 'N' => '...'), 'label' => false]);
        $builder->add('state', 'text', ['label' => false]);
    }

    public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'app\models\MeteringCode',
        ));
    }

    public function getName()
    {
        return 'MeteringCode';
    }
}

我不想使用隐藏字段之类的解决方法。

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    不错的方法@Sergey Bratenkov 我希望它以只读模式显示文本字段,因为我的字段是实体字段。这是我用的

    <input type="text" value="{{ formulario.vars.value.getJuego() }}" readonly="readonly"/>
    
    {% do formulario.juego.setRendered %}
    

    使用 setRendered 功能,您可以告诉 twig 在使用 form_start 后自动停止渲染字段。

    【讨论】:

      【解决方案2】:

      您可以将附加参数传递给form_end() 调用:

      {{ form_end(form, {'render_rest': false}) }}
      

      希望这会有所帮助...

      【讨论】:

      • 这不是最好的选择。这将导致 crf 令牌未呈现,并且您对 xss 的保护被禁用。最好编写一个新的表单类(src/Form/xxxType),您只需添加您需要的一个字段。或者让您当前的表单类更加动态。
      • 没错,但有什么替代方法(除了使表单动态化)?
      • 您仍然可以使用 {{ form_widget(form._token) }} 呈现 CSRF 令牌,但正如 @Frankbeen 建议的那样,最好编写一个新的表单类。
      【解决方案3】:

      谢谢大家。我找到了解决方案。 我从表单本身中删除了该字段,并通过原始对象的 getter 访问该值。另一个好处是该字段根本不需要渲染。

      {{metCode.vars.value.getDesc() }}

      【讨论】:

        猜你喜欢
        • 2019-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-08-31
        • 2015-08-18
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        相关资源
        最近更新 更多