Zend-Form组件包含以下几个对象:

1、Elements:包含了name和attributes,

2、Fieldsets:继承自elements,但允许包含其他fieldset和elements,

3、Forms:继承自Fieldsets。提供数据和对象绑定,并组合了InputFilters。数据绑定由zend-hydrator实现。

  为了更好的利用view layer,zend-form也聚合了大量与form有关的view helpers。

  最低限度的每一个element和fieldset都需要一个名字。

  大多数情况下,你还需要提供一些属性来指示view层如何渲染这些元素。

  Zend-form里面的工厂通常用来创建elements,fieldsets,forms和相关的输入过滤(input filter)。工厂可以简化表单的创建。

与form相关的代码可能会跨越几个区域:form定义,输入过滤定义,领域模型类,一个或更多地hydrator实现。(hydrator用来数组和对象之间的转换,序列化)

Zend\Form\Annotation\AnnotationBuilder可以用来创建各种你需要的对象(上面跨越的几个区域)

  Forms是元素和自定义字段(fieldsets)的聚合,最低限度的每一个元素和自定义字段都需要一个名字。更多地情况下,可以提供一些属性来告诉view层如何渲染(比如隐藏的表单)。

  使用工厂直接创建InputFilter,对表单输入过滤。

执行表单验证是通过向setData()提供一个数组数据,然后调用isValid方法。如果你想更加的简化工作,可以将一个对象绑定到表单上。一旦成功验证,将从被验证的值填充?

一般性步骤(比较冗余)

  1.   /*创建元素,*/
  2. $name = new Element('name');
  3.   /*设置标签*/
  4. $name->setLabel('Your name');
  5.   /*设置元素的各种属性。。。*/
  6. $name->setAttributes(['type' => 'text',]);
  7.   /*创建表单,*/
  8. $form = new Form('contact');
  9.  
  10.   /*将元素添加到表单里面。*/
  11. $form->add($name);
  12.  
  13.   /*创建某个元素的Input,*/
  14. $nameInput = new Input('name');
  15.  
  16.   /*创建inputfilter,*/
  17. $inputFilter = new InputFilter();
  18.  
  19.   /*添加input到inputfilter。*/
  20. $inputFilter->add($nameinput);
  21.  
  22.   /*把inputfilter连接到表单。*/
  23. $form->add($inputFilter);

通过工厂创建

  你可以通过工厂一次性创建整个表单和input filter。如果你想将自己的表单保存为纯配置,这种方法very nice。将配置信息传给工厂即可。

  步骤如下:

  1、创建工厂对象(Zend\Form\Factory)

    调用createForm方法,使用配置信息创建Form对象。 。。。

默认的Form实现时基于工厂的。这意味着你可以定义自己的表单。

验证表单:

表单验证需要三个步骤:

  1. /*1、表单必需被一个input filter连接。*/
  2. $yourform->setInputFilter(new yourformFilter());
  3.  
  4. /*2、你必须将需要验证的数据注入到表单中。*/
  5. $data = $request->getPost();
  6. $data = $request->getQuery();
  7. $yourform->setData($data);
  8.  
  9. /*3、验证表单。*/
  10.  
  11. /*4、如果数据验证无效,你将会获取到错误消息。*/
  12. if ($form->isValid()) {
  13. $validateData = $form->getData();
  14. }else {
  15. $messages = $form->getMessages();
  16. }

指示给Input Filter:

有时候你想在创建元素的同时创建inputfilter。

How TO:

元素需要实现Zend\InputFilter\InputProviderInterface,这里面定义了getInputSpecification()方法。返回的数据会被input filter工厂使用来创建一个input

对于fieldset必须实现Zend\InputFilter\InputFilterProviderInterface,这里面定义了getInputFilterSpecification()方法。必须为input filter返回配置。

绑定一个对象:https://docs.zendframework.com/zend-form/quick-start/#binding-an-object

当你绑定一个对象到表单时会发生以下行为:

1、Hydrator调用extract(),返回的值构成所有元素的值属性。如果表单包含嵌套fieldset,那么表单会递归的解析出值。

2、当isValid()被调用时,如果setData()还没被调用。表单使用Hydrator从对象中解析出值来。然后使用这些值进行验证。也就是使用对象里的数据给表单赋值。

3、如果isValid()验证成功了,Hydrator将会被传入有效的值来绑定object。

4、如果对象实现了Zend\InputFilter\InputFilterAwareInterface,那对象包含的input filter会被用来替换form所包含的input filter。

  对象帮定到表单的时候,使用getData默认返回的是对象。使用FormInterface::VALUES_AS_ARRAY标志可以返回关联数组。

关于视图方面:

  form组件包含一系列的view helpers。这些帮助函数接受各种form对象,通过内省生成markup。一般来讲,他们会检查特性,但特殊情况下,他们也许会查找其他属性和被组合的对象。

  在准备渲染之前,你一般需要调用prepare()。该方法会确保内省已经完成,并确嵌套在fieldsets和集合里的元素以数组标记的形式生成名字。如scoped[array][notation]

zend-form笔记的更多相关文章

  1. asp.net Core MVC + form validation + ajax form 笔记

    asp.net Core MVC 有特别处理form,controller可以自己处理model的验证,最大的优势是写form时可以少写代码 先了解tag helper ,这东西就是element上的 ...

  2. Forms and actions

    Forms and actions Adding new albums We can now code up the functionality to add new albums. There ar ...

  3. Database and models

    Database and models The database Now that we have the Album module set up with controller action met ...

  4. Making Use of Forms and Fieldsets

    Making Use of Forms and Fieldsets So far all we have done is read data from the database. In a real- ...

  5. 解决ZF2_PATH environment

    本方法基于:ZendFramework 2.1.4版本在WIN7下构建,其他版本的安装方式相差不大. 操作之前您需要搭建好PHP运行环境,保证PHP版本不低于PHP 5.3.3,并且去http://f ...

  6. ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器

    <?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ p ...

  7. How to generate entities from database schema using doctrine-orm-module

    1.安装好doctrine,在composer.json中添加如下 "require": { "php": "^5.6 || ^7.0", ...

  8. [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

随机推荐

  1. thinkphp3.1 缓存配置设置读取

    以下黄字是我用的代码: //设置缓存名为zgg,内容为zongguagua,有效时间60秒 cache('zgg',"zongguagua",60); //读取缓存 if(cach ...

  2. xv6 gdb

    The "remote" target does not support "run". https://sourceware.org/gdb/onlinedoc ...

  3. 《Kinect应用开发实战》读书笔记---干货集合

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45029841 作者:ca ...

  4. 基于 Android NDK 的学习之旅-----JNI LOG 打印

    程序都是调出来的. 下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log 1.Android 应用层 MainActivity.java 主要功能代码 a)       ...

  5. Mybatis中sql语句中的in查询,一定要判断null的情况

    不严谨的写法,可能会报错:in (),这种情况不符合mysql的语法. select from loanwhere LOAN_ID in <foreach item="item&quo ...

  6. [Angular] @ContentChildren and QueryList

    We have looked at @ContentChild in article(http://www.cnblogs.com/Answer1215/p/6414657.html). Now le ...

  7. MapReduce 编程 系列九 Reducer数目

    本篇介绍怎样控制reduce的数目.前面观察结果文件,都会发现通常是以part-r-00000 形式出现多个文件,事实上这个reducer的数目有关系.reducer数目多,结果文件数目就多. 在初始 ...

  8. 高并发測试工具webbench

    1.简单介绍 webbench最多能够模拟3万个并发连接去測试server的负载能力.编译和配置简单,仅基于TCP协议上对server进行測试. Webbench也是开放源代码.从代码上看,每一个cl ...

  9. 【33.33%】【codeforces 608C】Chain Reaction

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  10. 征服OA 飞鱼工作流程的在线培训课程(两)HTML形成基于

    表HTML的重要作用,等效混凝土框架建筑的行,于div在此之前流行.是否所有形式的世界.在角色表页面主要是针对页面布局和定位.通过整合人才规划表设计出合理的页面布局. 当然.更重要的是,存在是表示数据 ...