表单的每一部分渲染都是可以被自定义个性化的。你可以自由的改变每一个表单行的渲染,改变渲染错误的标志,更或者是textarea标签应该怎样显示等。没有任何限制,不同的个性化设置能用到不同的区域。
Symfony使用模板渲染每一个或者部分表单,比如label标签,input标签,错误信息以及任何其它内容。在Twig中,每个表单片段会被一个Twig block来渲染。要个性化渲染表单,你只需要重写相应的block即可。在PHP模板中,它是通过单独的模板文件来渲染表单片段的,所以你需要通过编写新的模板来替代旧的模板即可。在理解了它们是怎么工作的之后,让我们来个性化form_row片段并添加一个class属性到包裹每一表单行的div元素。首先创建一个新模板文件用于存放新的标志:
Twig格式:
{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #} {% block field_row %} {% spaceless %} <div> {{ form_label(form) }} {{ form_errors(form) }} {{ form_widget(form) }} </div> {% endspaceless %} {% endblock field_row %}
PHP代码格式:
<!-- src/Acme/TaskBundle/Resources/views/Form/field_row.html.php --> <div> <?php echo $view['form']->label($form, $label) ?> <?php echo $view['form']->errors($form) ?> <?php echo $view['form']->widget($form, $parameters) ?> </div>
field_row表单片段会在通过form_row函数渲染大部分的表单字段时使用。 要告诉你的表单组件使用你的新的field_row片段,需要添加下面的内容到你渲染该表单的模板顶部:
Twig格式:
{# 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 ...>
PHP代码格式:
<!-- src/Acme/TaskBundle/Resources/views/Default/new.html.php --> <?php $view['form']->setTheme($form, array('AcmeTaskBundle:Form')) ?> <?php $view['form']->setTheme($form, array('AcmeTaskBundle:Form', 'AcmeTaskBundle:Form')) ?> <form ...>
其中的form_theme 标签导入前面定义的片段。换句话说,当form_row函数在模板中被调用后,它将从你的自定义主题中使用field_row 块(替代Symfony已有的field_row block)。你的个性化主题不必重写所有的块。当渲染一个你没有重写过的块时,主题引起会找全局的主题(定义在bundle级的主题)使用。
在拥有多个个性化主题的情况下,它会在使用全局主题之前查找定制列表。要个性化你表单的任何部分,你只需要重写相关的片段即可。
表单片段命名
在symfony中,表单的每一部分都会被渲染,HTML表单元素,错误消息,显示标签等这些都是被定义在基础主题里的。它组成了一个Twig的块集合和一个PHP模板集合。
在Twig中,每个需要的块都被定义到一个单独的模板文件中(form_dive_layout.html.twig),它们被保存在Twig Bridge里。在这个文件中,你可以看到渲染一个表单多需要的每一个block和默认的字段类型。
在PHP模板中,片段是单独的模板文件。 默认情况下它们位于框架bundle的Resources/views/Form 目录下。每个偏度名称都遵循相同的基本模式,用一个下划线(_)分为两部分,比如:
field_row 用于form_row渲染大部分的字段
textarea_widget 用于form_widget渲染一个textarea字段类型
field_errors 用于form_errors渲染一个字段的错误信息
每个片段都命名都遵循:type_part 模式。type部分对应被渲染的字段类型(比如textarea,checkbox,date等),而part部分对应着是什么被渲染(比如label,widget,errors等)
默认情况下,有4种可能的表单part被用来渲染:
label 渲染字段的标签 如field_label
widget 渲染字段的HTML表示 如field_widget
errors 渲染字段的错误信息 如field_errors
row 渲染字段的整个行(包括label,widget和errors) 如 filed_row
还有其它3个part类型,分别是rows,rest和enctype,不过这三个一般不会用到。
通过知道字段类型(比如:textarea)和你想渲染那一部分(比如:widget),你可以创建一个你需要重写的片段名称(比如:textarea_widget).
模板片段继承