Symfony2的 - FormBuilder - 一类添加到外地输入(Symfony2 - F

2019-07-29 22:05发布

我想从Symfony2的内添加一个类特定输入或标签字段。

我可以做这样的事情在中枝杈我的表格:

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

工作正常。 但是,我必须设置为每个表单模板。 而我必须把它分解到尽可能小的输出电平。 其实我是想用:

 {{ form_widget(form) }}

所以,我在想,我怎么会在添加CSS类为l的地方:

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

我想这可能是更加有用,因为我只需要做出一个地方的变化。

那么怎么会这样做,也许我想错了。

任何帮助将是巨大的,

非常感谢,菲利普

Answer 1:

类字段的是你的应用程序的表示层的一部分,所以最好创建表单树枝主题:

创建文件fields.html.twigResources/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' %}

这是在深入解释食谱



Answer 2:

你可以像下面这样做:

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


Answer 3:

形式主题化


如何形式呈现每个部分都可以定制。 你可以自由地改变每个表单“行”是如何呈现,改变用于渲染错误,甚至是自定义textarea标签应该如何呈现的标记。 没有什么是禁地,并且不同的定制可以在不同的地方使用。

Symfony的使用模板来渲染每一个表格的每一部分,如标签标签,输入标签,错误消息和其他一切。

在枝条,每种形式“片段”是通过嫩枝块表示。 要自定义表单如何呈现的任何部分,你只需要覆盖适当的块。

在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标签(在小枝)“进口”,在给定的模板中定义的片段,并绘制表格时使用它们。 换句话说,当form_row功能将在后面这个模板调用时,它会使用form_row块从您的自定义主题(而不是默认的form_row块附带Symfony的)。

您的自定义主题不必重写所有的块。 当渲染这是不是在你的自定义主题覆盖的块中,主题引擎将回落到全球主题(在包级别定义)。

如果提供了几个自定义主题,他们将在列出的顺序进行搜索回落至全球主题之前。

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

{# 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助手(以桂枝)“进口”自定义表单片段逼到这种形式。 你也可以告诉Symfony的跨整个项目导入表单自定义。

枝条

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

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

现在fields.html.twig模板内的任何块用于全局定义形式输出。



文章来源: Symfony2 - FormBuilder - add a class to the field and input