21

我想为Symfony应用程序中的某些输入或标签元素添加一个类。

我可以在 Twig 级别的表单中执行以下操作:

<div class="row">
    {{ form_label(form.subject) }}
    {{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }}
</div>

这工作正常。但是我必须手动为每个表单设置和写出整个模板。我实际上想使用:

{{ form_widget(form) }}

所以,我在想,我怎么能在以下位置为标签或输入添加 CSS 类FormType

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('subject', 'text', array(
            'label' => 'Subject'
        ));

我认为这可能更有用,因为您可以在一个地方配置整个表单。

如何才能做到这一点?也许我想错了。

4

3 回答 3

49

你可以这样做:

class SystemNotificationType extends AbstractType {
    public function buildForm(FormBuilder $builder, array $options) {
        $builder->add('subject', 'text', array( 
            'label'  => 'Subject',
            'attr'   =>  array(
                'class'   => 'c4')
            )
        );
    }
}
于 2012-06-14T15:47:38.953 回答
32

字段的类是应用程序表示层的一部分,因此最好为您的表单创建一个树枝主题:

fields.html.twig在Bundle 中创建一个文件Resources/views/Form并定义表单行的格式,例如:

{% block field_row %}
<div class="row">
    {{ form_errors(form) }}
    {{ form_label(form) }}
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock field_row %}

如果您只想自定义某些字段,例如fieldNameform的字段formName,请自定义行:

{% block _formName_fieldName_row %}
<div class="row">
    {{ form_label(form) }}
    {{ form_errors(form) }}
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }}
</div>
{% endblock %}

编辑:仅自定义字段:

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

然后在您希望它使用此主题的所有表单模板中添加:

{% form_theme form 'MyBundle:Form:fields.html.twig' %}

这在食谱中有详细解释

于 2012-06-16T14:23:03.673 回答
6

表单主题


表单呈现方式的每个部分都可以自定义。您可以自由更改每个表单“行”的呈现方式,更改用于呈现错误的标记,甚至自定义 textarea 标记的呈现方式。没有什么是禁止的,并且可以在不同的地方使用不同的自定义。

Symfony 使用模板来呈现表单的每个部分,例如标签标签、输入标签、错误消息和其他所有内容。

在 Twig 中,每个表单“片段”都由一个 Twig 块表示。要自定义表单呈现方式的任何部分,您只需要覆盖适当的块。

在 PHP 中,每个表单“片段”都是通过单独的模板文件呈现的。要自定义表单呈现方式的任何部分,您只需要通过创建一个新模板来覆盖现有模板。

要了解其工作原理,请自定义 form_row 片段并将类属性添加到围绕每一行的 div 元素。为此,请创建一个新的模板文件来存储新的标记:

{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #}
{% block form_row %}
{% spaceless %}
<div class="form_row">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}

当通过 form_row 函数呈现大多数字段时,使用 form_row 表单片段。要告诉表单组件使用上面定义的新 form_row 片段,请将以下内容添加到呈现表单的模板顶部:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig'
'AcmeTaskBundle:Form:fields2.html.twig' %}
{{ form(form) }}

form_theme 标记(在 Twig 中)“导入”给定模板中定义的片段,并在呈现表单时使用它们。换句话说,当稍后在此模板中调用 form_row 函数时,它将使用自定义主题中的 form_row 块(而不是 Symfony 附带的默认 form_row 块)。

您的自定义主题不必覆盖所有块。渲染自定义主题中未覆盖的块时,主题引擎将回退到全局主题(在包级别定义)。

如果提供了多个自定义主题,则将按列出的顺序搜索它们,然后再返回到全局主题。

要自定义表单的任何部分,您只需要覆盖适当的片段。确切知道要覆盖哪个块或文件是下一节的主题。

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}

{% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %}

{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig',
'AcmeTaskBundle:Form:fields2.html.twig'] %}

有关更多信息,请参阅如何Symfony 食谱中自定义渲染

全局表单主题


在上面的示例中,您使用 form_theme 助手(在 Twig 中)将自定义表单片段“导入”到该表单中。你也可以告诉 Symfony 在你的整个项目中导入自定义表单。

枝条

要在所有模板中自动包含之前创建的 fields.html.twig 模板中的自定义块,请修改您的应用程序配置文件:

# app/config/config.yml
  twig:
    form:
      resources:
        - 'AcmeTaskBundle:Form:fields.html.twig'

fields.html.twig 模板中的任何块现在都用于全局定义表单输出。

于 2013-08-01T21:55:21.543 回答