Symfony2框架学习笔记之表单用法详解
|
本文实例讲述了Symfony2框架表单用法。分享给大家供大家参考,具体如下: 对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务。Symfony2集成了一个Form组件,让处理表单变的容易起来。在这一节里,我们将 从基础开始创建一个复杂的表单,学习表单类库中最重要的内容。 Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它。 创建一个简单的表单:假设你要创建一个应用程序的todo列表,需要显示一些任务。因为你的用户需要编辑和创建任务,所以你需要创建一个表单。在你开始之前,首先来看通用的Task类,用来表示和存储一个单一任务的数据: task;
}
public function setTask($task)
{
$this->task = $task;
}
public function getDueDate()
{
return $this->dueDate;
}
public function setDueDate(DateTime $dueDate = null)
{
$this->dueDate = $dueDate;
}
}
如果你是按照我们提供的示例编码,那么你需要先创建一个AcmeTaskBundle: 该类是一个普通的PHP对象类,因为他们没有任何Symfony或者其它类库引用。非常简单的一个PHP对象类,它直接解决的是你程序中表现task的数据。当然,在本节的最后,你将能够通过HTML表单提交一个Task实例数据,校验它的数值,并把它持久化到数据库。 创建一个Form现在已经创建了一个Task类,下一步就是创建和渲染一个真正的HTML表单了。在symfony2中,它是通过创建一个表单对象并渲染到模板的。现在,可以从controller内部处理form。 setTask('Write a blog post');
$task->setDueDate(new DateTime('tomorrow'));
$form = $this->createFormBuilder($task)
->add('task','text')
->add('dueDate','date')
->getForm();
return $this->render('AcmeTaskBundle:Default:new.html.twig',array(
'form' =>$form->createView(),));
}
上面的示例显示了如何直接在Controller中创建一个表单,为了可以让表单重用你完全可以在一个单独的类文件中创建表单。 因为Symfony2通过一个表单生成器“form builder"来创建表单对象,所以你可以使用很少的代码就能完成创建表单任务。表单生成器的目的是让你能编写简单的表单创建方法,让它来负责繁重的创建任务。 在这个示例中,你已经添加了两个字段到你的表单,一个是task一个是dueDate。它们关联到Task类的task和dueDate属性。你已经为它们分别指定了类型(比如,text,date等),由这些类型来决定为这些字段生成什么样的HTML表单标签。 Symfony2 拥有许多内建的类型,接下来我们将简单的介绍。 渲染一个表单表单创建以后,下一步就是渲染它。这是通过传递一个特定的表单”view"对象(就是上例中的 $form->createView()返回的view对象)到你的模板并通过一些列的表单帮助函数来实现的。 Twig格式:
{{ form_widget(form) }}
PHP代码格式: generate('task_new') ?>" method="post" enctype($form) ?> > widget($form) ?>在这里假设你已经创建了一个名叫task_new的路由指向AcmeTaskBundle:Default:new Controller。 就是这些了,通过打印form_widget(form),表单中的每个字段都会被渲染出来。同时还有一个文本标签和错误信息。是不是很简单,不过现在它还不够灵活。通常情况下,我们渴望单独渲染表单中的每一个字段,这样我们可以更好的控制表单的样式。我们会在在模板中渲染表单一节介绍。 在继续下去之前,我们注意到,为什么我们渲染出来的task输入框中有一个来自$task对象的属性值“Write a blog post"。这是表单的第一个工作:从一个对象中获取数据并把它转换为合适的格式渲染到一个HTML表单中。 注意,表单系统已经足够聪明,它们能够通过像getTask()和setTask()方法来访问Task类中受保护的属性task。除非一个是公共属性,否则必须有一个getter和setter方法被定义来用于表单组件从这些属性中获取和保持数据。对于布尔型的属性,你可以使用一个”isser"方法(比如 isPublished())替代getter方法(getPublished())。 处理表单提交表单系统的第二个任务就是传递用户提交的数据回到一个对象的属性中。要做到这一点,用户提交的数据必须绑定到表单才行。添加如下代码到你的Controller类: createFormBuilder($task)
->add('task','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格式: 在Task类中声明格式: XML格式: PHP代码格式: addPropertyConstraint('task',new NotBlank());
$metadata->addPropertyConstraint('dueDate',new Type('DateTime'));
}
}
就是这样了,如果你现在再提交包含非法数据的表单,你将会看到相应的错误被打印在表单上。 HTML5 校验作为HTML5,许多浏览器都加强了客户端某些校验约束。最常用的校验活动是在一个必须的字段上渲染一个required属性。对于支持HTML5的浏览器来说,如果用户此时提交一个空字段到表单时,浏览器会显示提示信息。生成的表单广泛吸收了这些新内容的优点,通过添加一些HTML属性来监控校验。客户端校验可以通过添加novalidate属性到form标签或者formnovalidate 到提交标签而关闭。这对你想检查服务端校验规则时非常有用。 校验分组如果你的对象想从校验组中受益,你需要指定你的表单使用哪个校验组。 createFormBuilder($users,array( 'validation_groups' => array('registration'),))->add(...) ;如果你创建表单类,你需要添加羡慕的getDefaultOptions()方法: 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 当然,你也可以定义自己的字段类型。 字段类型选项(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
