我想在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' ) )
–
我认为这可能更有用,因为我只需要在一个地方进行更改。
那怎么可能这样做,或者我想错了路。
任何帮助都会很棒,
非常感谢, 菲利普
答案 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' %}
中有详细解释
答案 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模板中的任何块来定义表单输出。