Symfony2 - FormBuilder - 在字段和输入中添加一个类

时间:2012-06-14 13:59:25

标签: css class input symfony formbuilder

我想在symfony2中为某些输入或标签字段添加一个类。

我可以在Twig中以我的形式做这样的事情:

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

哪个工作正常。但我必须为每个表单设置模板。我必须将其分解为可能的最小输出水平。我其实想用:

 {{ form_widget(form) }}

所以,我在想,我怎么能在以下的地方为l添加一个css类:

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

我认为这可能更有用,因为我只需要在一个地方进行更改。

那怎么可能这样做,或者我想错了路。

任何帮助都会很棒,

非常感谢, 菲利普

3 个答案:

答案 0 :(得分:44)

你可以这样做:

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

答案 1 :(得分:28)

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

在Bundle的fields.html.twig中创建一个文件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 %}

如果您只想自定义某个字段,例如fieldName格式的字段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' %}

这在the cookbook

中有详细解释

答案 2 :(得分:6)

形式主题


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

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

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

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

要了解其工作原理,请自定义form_row片段并将class属性添加到围绕每行的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 cookbook

中的如何自定义呈现

全球形式主题


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

<强>枝条

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

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

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