我想从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' ) )
–
我想这可能是更加有用,因为我只需要做出一个地方的变化。
那么怎么会这样做,也许我想错了。
任何帮助将是巨大的,
非常感谢,菲利普
类字段的是你的应用程序的表示层的一部分,所以最好创建表单树枝主题:
创建文件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' %}
这是在深入解释食谱
你可以像下面这样做:
class SystemNotificationType extends AbstractType {
public function buildForm(FormBuilder $builder, array $options) {
$builder->add('subject', 'text', array(
'label' => 'Subject',
'attr' => array(
'class' => 'c4')
)
);
}
}
形式主题化
如何形式呈现每个部分都可以定制。 你可以自由地改变每个表单“行”是如何呈现,改变用于渲染错误,甚至是自定义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模板内的任何块用于全局定义形式输出。