Symfony2框架学习笔记之表单用法详解(2)

注意,表单系统已经足够聪明,它们能够通过像getTask()和setTask()方法来访问Task类中受保护的属性task。除非一个是公共属性,否则必须有一个getter和setter方法被定义来用于表单组件从这些属性中获取和保持数据。对于布尔型的属性,你可以使用一个”isser"方法(比如 isPublished())替代getter方法(getPublished())。

处理表单提交

表单系统的第二个任务就是传递用户提交的数据回到一个对象的属性中。要做到这一点,用户提交的数据必须绑定到表单才行。添加如下代码到你的Controller类:

//... public function newAction(Request $request) { //只是创建一个新的$task对象(不需要假数据) $task = new Task(); $form= $this->createFormBuilder($task) ->add('task','text') ->add('dueDate','date') ->getForm(); if($request->getMethod() == "POST"){ $form->bindRequest($request); if($form->isValid()){ //执行一些行为,比如保持task到数据库 return $this->redirect($this->generateUrl('task_success')); } } //... }

现在,当表单被提交时,Controller可以绑定被提交的数据到表单,表单会把数据传回$task对象的task和dueDate属性。这些都在bindRequest()方法中完成。只要bindRequest()方法被调用,提交的数据就会立刻被传输到底层对象。不管数据是否被真正的校验通过。

controller一般会遵循一个通用的模式来处理表单,它有三个可能的途径:

1.当在浏览器初始加载一个页面时,请求方法是GET,表单处理仅仅是创建和渲染。

2.当用户提交带有不合法数据的表单(方法为POST)时,表单会并绑定然后渲染,这时候显示所有校验错误。

3.当用户提交的表单带有的数据均合法时,表单绑定并且在页面跳转之前你有机会去使用数据去执行一些业务逻辑活动,比如持久化它到数据库)。

表单校验

在前面我们提到了,如何提交一个带有合法数据和非法数据的表单。在Symfony2中,校验是在底层对象上进行的。换句话说,form表单合法与否不重要,主要看在表单提交数据以后,底层对象比如$task对象是否合法。调用$form->isvalid() 是一个询问底层对象是否获得合法数据的快捷方式。

校验是通过添加一些列规则(约束)到一个类来完成的。我们给Task类添加规则和约束,使它的task属性不能为空,duDate字段不能空并且是一个合法的DateTime对象。

YAML格式:

# Acme/TaskBundle/Resources/config/validation.yml Acme\TaskBundle\Entity\Task: properties: task: - NotBlank: ~ dueDate: - NotBlank: ~ - Type: \DateTime

在Task类中声明格式:

// Acme/TaskBundle/Entity/Task.php use Symfony\Component\Validator\Constraints as Assert; class Task { /** * @Assert\NotBlank() */ public $task; /** * @Assert\NotBlank() * @Assert\Type("\DateTime") */ protected $dueDate; }

XML格式:

<!-- Acme/TaskBundle/Resources/config/validation.xml --> <class> <property> <constraint /> </property> <property> <constraint /> <constraint> <value>\DateTime</value> </constraint> </property> </class>

PHP代码格式:

// Acme/TaskBundle/Entity/Task.php use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Type; class Task { // ... public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('task', new NotBlank()); $metadata->addPropertyConstraint('dueDate', new NotBlank()); $metadata->addPropertyConstraint('dueDate', new Type('\DateTime')); } }

就是这样了,如果你现在再提交包含非法数据的表单,你将会看到相应的错误被打印在表单上。

HTML5 校验

作为HTML5,许多浏览器都加强了客户端某些校验约束。最常用的校验活动是在一个必须的字段上渲染一个required属性。对于支持HTML5的浏览器来说,如果用户此时提交一个空字段到表单时,浏览器会显示提示信息。生成的表单广泛吸收了这些新内容的优点,通过添加一些HTML属性来监控校验。客户端校验可以通过添加novalidate属性到form标签或者formnovalidate 到提交标签而关闭。这对你想检查服务端校验规则时非常有用。

校验分组

如果你的对象想从校验组中受益,你需要指定你的表单使用哪个校验组。

$form = $this->createFormBuilder($users, array( 'validation_groups' => array('registration'), ))->add(...) ;

如果你创建表单类,你需要添加羡慕的getDefaultOptions()方法:

public function getDefaultOptions(array $options) { return array( 'validation_groups' => array('registration') ); }

在这两种情况下,只有registration 校验组将被用于校验底层对象。

内建字段类型

Symfony标准版含有大量的字段类型,它们几乎涵盖了所有通用表单的字段和数据类型。

文本字段:
text
textarea
email
integer
money
number
password
percent
search
url

选择字段:
choice
entity
country
language
locale
timezone

日期和时间字段:
date
datetime
time
birthday

其它字段:
checkbox
file
radio

字段组:
collection
repeated

隐藏字段:
hidden
csrf

基础字段:
field
form

当然,你也可以定义自己的字段类型。

字段类型选项

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/92c5f09968c3c828156dc572610ddac4.html