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

ins*_*ere 19 css class input formbuilder symfony

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

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

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

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

 {{ form_widget(form) }}
Run Code Online (Sandbox Code Playgroud)

所以,我在想,我怎么能在某处为l添加一个css类:

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

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

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

任何帮助都会很棒,

非常感谢,Philipp

Pap*_*ppa 44

你可以这样做:

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


Vis*_*avì 29

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

fields.html.twigResources/views/FormBundle中创建一个文件,并定义表格行的格式,例如:

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

如果只想自定义某个字段,例如fieldName表单的字段formName,请自定义行:

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

编辑:仅自定义字段:

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

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

{% form_theme form 'MyBundle:Form:fields.html.twig' %}
Run Code Online (Sandbox Code Playgroud)

这在食谱中有详细解释


muk*_*ulu 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 %}
Run Code Online (Sandbox Code Playgroud)

通过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) }}
Run Code Online (Sandbox Code Playgroud)

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'] %}
Run Code Online (Sandbox Code Playgroud)

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

全球形式主题


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

枝条

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

# app/config/config.yml
  twig:
    form:
      resources:
        - 'AcmeTaskBundle:Form:fields.html.twig'
Run Code Online (Sandbox Code Playgroud)

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