4

我想更换:

{{ form_errors(form.name) }}
{{ form_widget(form.name, { 'attr': {'placeholder': 'Nom'} }) }}

经过:

{{ form.name|field('Nom') }}

我怎么能那样做?我试图在 Twig 扩展中做到这一点,但我无权访问 form_widget 函数。

编辑:我可以用form.name属性(包括父表单)来做到这一点,但我会重复 symfony 代码,这将是一个非常丑陋的大黑客

4

1 回答 1

2

如果您要求我将 attr 移至您的表单类,则更有意义:

class SomeForm extends AbstractType {
      //.....
      $builder->add('name', 'text', array('attr' => array('placeholder'=>'Nom')));
}

由于我猜您需要为某些字段进行一些自定义渲染,因此您可以检查:

http://symfony.com/doc/2.0/cookbook/form/form_customization.html#how-to-customize-an-individual-field

您还可以创建一个新类型并按照此处的说明对其进行自定义:

http://symfony.com/doc/2.0/cookbook/form/form_customization.html#what-are-form-themes

你甚至可以改变默认的渲染方式,并让 symfony 使用字段的标签字符串默认渲染你的占位符标签(全局启用表单主题的细节在上面引用的链接中介绍):

{% block text_widget %}
    {% set type = type|default('text') %}
    <input type="text" {{ block('widget_attributes') }} value="{{ value }}" />
{% endblock field_widget %}

{% block widget_attributes %}
  {% spaceless %}
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} placeholder="{{ label|trans }}"
  {% endspaceless %}
{% endblock widget_attributes %}

{% block form_row %}
  {% spaceless %}
    <div class="my-class">
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
  {% endspaceless %}
{% endblock form_row %}

因此,您将使用 symfony 提供的主题将自己限制在一个 form_row(form.name) 中。Symfony 的方法在我看来“非常”干/死。希望能帮助到你。

于 2013-02-25T10:54:44.460 回答