每一个字段类型都有一定数量的选项用于配置。比如,dueDate字段当前被渲染成3个选择框。而日期字段可以被配置渲染成一个单一的文本框,用户可以输入字符串作为日期。
->add('dueData','data', array('widget' = 'single_text'))
required选项:
最常用到的选项是required选项,它可以应用于任何字段。默认情况下它被设置为true。这就意味着支持HTML5的浏览器会使用客户端校验来判断字段是否为空。如果你不想让它发生,或者把在你的字段上把required选项设置为false,或者关闭HTML5校验。设置required为true并不意味着服务端校验被应用。换句话说,如果用户提交一个空数值到该字段,它将接受这个控制除非你使用Symfony的NotBlank或者NotNull校验约束。也就是说,required选项是很好,但是服务端校验还是要继续用。
label选项:
表单字段可以使用label选项设置显示字符标签,可以应用于任何字段:
->add('dueDate', 'date',array( 'widget' =>'single_text', 'label' => 'Due Date', ))
字段类型猜测:
现在你已经添加了校验元数据到Task类,Symfony早已经了解一点关于你的字段了。如果你允许,Symfony可以猜到你的字段数据类型并为你设置它。在下面的例子中,Symfony可以根据校验规则猜测到task字段是一个标准的text字段,dueDate是date字段。
public function newAction() { $task = new Task(); $form = $this->createFormBuilder($task) ->add('task') ->add('dueDate', null, array('widget' => 'single_text')) ->getForm(); }
当你省略了add方法的第二个参数(或者你输入null)时,Symfony的猜测能力就起作用了。如果你输入一个选项数组作为第三个参数(比如上面的dueDate),那么这些选项会成为Symfony猜测的依据。如果你的表单使用了指定的校验数组,字段类型猜测器将还是要考虑所有的校验规则来综合猜测你的字段类型。
字段类型可选项猜测
除了猜测字段类型,Symfony还能是这猜测一些可选项字段值。当这些可选项被设置时,字段将会被渲染到特定HTML属性中,让HTML5客户端来提供校验。
然而,它们不会在服务端生成相应的校验规则。尽管你需要手动的在服务端添加这些规则,但是这些字段类型选项还是能根据这些信息猜测到。
required: required规则可以在校验规则或者Doctrine元数据的基础上猜测到。这当你的客户端校验将自动匹配你的校验规则时很有用。
max_length: 如果字段是一些列文本字段,那么max_length选项可以从校验规则或者Doctrine元数据中猜到。
如果你喜欢改变一个猜到的数值,你可以通过在可选项数组中传递该选项来重写它。
->add('task',null, array('max_length'=>4))
在模板中渲染表单
到目前为止,我们已经看了一个完整的表单是如何通过一行代码被渲染的。当然,你通常需要更加灵活的渲染方式:
Twig格式:
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} <form action="{{ path('task_new') }}" method="post" {{ form_enctype(form) }}> {{ form_errors(form) }} {{ form_row(form.task) }} {{ form_row(form.dueDate) }} {{ form_rest(form) }} <input type="submit" /> </form>
PHP代码格式:
<!-- // src/Acme/TaskBundle/Resources/views/Default/newAction.html.php --> <form action="<?php echo $view['router']->generate('task_new') ?>" method="post" <?php echo $view['form']->enctype($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']->rest($form) ?> <input type="submit" /> </form>
让我们看看这组代码的详细: