form_enctype(form) 只要有一个字段是文件上传,那么它就会义务的设置为 enctype="multipart/form-data";
form_errors(form) 渲染任何整个form的任何错误信息(特定字段的错误,会显示在每个字段的下面一行)。
form_row(form.dueDate) 默认情况下,为给定的字段在一个div中渲染一个文本标签,任何错误,和HTML表单部件。
form_rest(form) 渲染没有指出的其余任何字段,通常在表单的末尾调用它防止遗忘或者渲染一些你不愿意手动设置的隐藏字段。它同时还能为我们提供CSRF保护。
大部分工作是由form_row帮助方法类完成的,它默认在一个div中为每个字段渲染显示标签,错误信息和HTML表单部件。
注意,你可以通过form.vars.value 来访问你当前是表当数据:
Twig格式:
{{ form.vars.value.task }}
PHP代码格式:
<?php echo $view['form']->get('value')->getTask() ?>
手工渲染每一个表单字段
form_row帮助器能让你很快的渲染你表单中的每一个字段,并且每一行可以被自定义化。但是生活不总是那么简单的,你也可能要手动的渲染每一个字段。
Twig格式:
{{ 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> {{ form_rest(form) }}
PHP代码格式:
<?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> <?php echo $view['form']->rest($form) ?>
如果自动生成显示标签不准确,那么你可以显式的指定它:
Twig格式:
{{ form_label(form.task, 'Task Description') }}
PHP代码格式:
<?php echo $view['form']->label($form['task'], 'Task Description') ?>
一些字段类型有一些额外的渲染选项可以传入widget,一个常用的选项为attr,它允许你修改表单元素的属性。下面的示例将添加task_field class到渲染的文本输入字段:
Twig格式:
{{ form_widget(form.task, {'attr': {'class':'task_field'} }) }}
PHP代码格式:
<?php echo $view['form']->widget($form['task'], array( 'attr' => array('class' => 'task_field'), )) ?>
如果你想手工渲染表单字段,你可以单独访问每个字段的值,比如id,name和label,这里我们获取id
Twig格式:
{{ form.task.vars.id }}
PHP代码格式:
<?php echo $form['task']->get('id') ?>
需要获取表单字段名称属性你需要使用full_name值:
Twig格式:
{{ form.task.vars.full_name }}
PHP代码格式:
<?php echo $form['task']->get('full_name') ?>
创建表单类
正如你看到的,一个表单可以直接在controller类中被创建和使用。然而,一个更好的做法是在一个单独的PHP类中创建表单。它可以被重用到你应用程序的任何地方。创建一个新类来保存生成task表单的逻辑:
// src/Acme/TaskBundle/Form/Type/TaskType.php namespace Acme\TaskBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; class TaskType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder->add('task'); $builder->add('dueDate', null, array('widget' => 'single_text')); } public function getName() { return 'task'; } }
这个新类包含了所有创建一个task表单所需要的内容,注意getName()方法将返回一个该表单类型的唯一标识,用于快速创建该表单。
// src/Acme/TaskBundle/Controller/DefaultController.php // 在类上添加这个新的引用语句 use Acme\TaskBundle\Form\Type\TaskType; public function newAction() { $task = // ... $form = $this->createForm(new TaskType(), $task); // ... }
设置data_class
每个表单都需要知道它底层保存数据的类名称,(比如Acme\TaskBundle\Entity\Task)。通常情况下,是根据createForm方法的第二个参数来猜测的。以后,当你开始嵌入表单时,这个可能就不怎么充分了,所以,通常一个好的方法是通过添加下面代码到你的表单类型类来显式的指定data_class 选项。
public function getDefaultOptions(array $options) { return array( 'data_class' => 'Acme\TaskBundle\Entity\Task', ); }
当然,这种做法也不总是必须的。