如何去控制表单渲染

3.4 版本
维护中的版本

到目前为止,我们已经看了一个完整的表单是如何通过一行代码被渲染的。当然,你通常需要更加灵活的渲染方式:

1
2
3
4
5
6
7
{# app/Resources/views/default/new.html.twig #}
{{ form_start(form) }}
    {{ form_errors(form) }}
 
    {{ form_row(form.task) }}
    {{ form_row(form.dueDate) }}
{{ form_end(form) }}
1
2
3
4
5
6
7
<!-- app/Resources/views/default/newAction.html.php -->
<?php echo $view['form']->start($form) ?>
    <?php echo $view['form']->errors($form) ?>
 
    <?php echo $view['form']->row($form['task']) ?>
    <?php echo $view['form']->row($form['dueDate']) ?>
<?php echo $view['form']->end($form) ?>

你已经知道form_start()form_end()函数,但是其他功能是做什么的呢?

form_errors(form)

渲染任何整个表单的错误信息(特定字段的错误,会显示在每个字段的下面一行)。

form_row(form.dueDate)

默认情况下,为给定的字段(如,dueDate)在一个div中渲染一个文本标签,错误信息,和HTML表单部件。

大部分工作是由form_row帮助方法类完成的,它默认在一个div中为每个字段渲染显示标签,错误信息和HTML表单部件。在表单主题部分,你将学会如果在form_row定制不同风格。

注意,你可以通过form.vars.value 来访问你的当前数据:

1
{{ form.vars.value.task }}
1
<?php echo $form->vars['value']->getTask() ?>

手动配置每一个字段 

form_row帮助器是伟大的,能让你很快的渲染你表单中的每一个字段(并且每一行可以被自定义化)。但是生活不总是那么简单的,你也可能要手动的渲染每一个字段。下面的代码呈现的样子和你使用form_row呈现的样子是一样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{{ form_start(form) }}
    {{ form_errors(form) }}
 
    <div>
        {{ form_label(form.task) }}
        {{ form_errors(form.task) }}
        {{ form_widget(form.task) }}
    </div>
 
    <div>
        {{ form_label(form.dueDate) }}
        {{ form_errors(form.dueDate) }}
        {{ form_widget(form.dueDate) }}
    </div>
 
    <div>
        {{ form_widget(form.save) }}
    </div>
 
{{ form_end(form) }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php echo $view['form']->start($form) ?>
 
    <?php echo $view['form']->errors($form) ?>
 
    <div>
        <?php echo $view['form']->label($form['task']) ?>
        <?php echo $view['form']->errors($form['task']) ?>
        <?php echo $view['form']->widget($form['task']) ?>
    </div>
 
    <div>
        <?php echo $view['form']->label($form['dueDate']) ?>
        <?php echo $view['form']->errors($form['dueDate']) ?>
        <?php echo $view['form']->widget($form['dueDate']) ?>
    </div>
 
    <div>
        <?php echo $view['form']->widget($form['save']) ?>
    </div>
 
<?php echo $view['form']->end($form) ?>

如果自动生成的label不是你想要的,你可以指定它:

1
{{ form_label(form.task, 'Task Description') }}
1
<?php echo $view['form']->label($form['task'], 'Task Description') ?>

一些字段类型有一些额外的渲染选项可以传入widget,一个常用的选项为attr,它允许你修改表单元素的属性。下面的示例将添加task_field 类到渲染的文本输入字段:

1
{{ form_widget(form.task, {'attr': {'class': 'task_field'}}) }}
1
2
3
<?php echo $view['form']->widget($form['task'], array(
    'attr' => array('class' => 'task_field'),
)) ?>

如果你想手工渲染表单字段,你可以单独访问每个字段的值,比如id,namelabel,这里我们获取id

1
{{ form.task.vars.id }}
1
<?php echo $form['task']->vars['id']?>

需要获取表单字段名称属性你需要使用full_name值:

1
{{ form.task.vars.full_name }}
1
<?php echo $form['task']->vars['full_name'] ?>

Twig模版函数查考 

如果你使用twig,表单渲染功能完整文档在reference。读这篇文章可以了解可用的助手和可以使用的选项。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)