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方法。如果你想更加的简化工作,可以将一个对象绑定到表单上。一旦成功验证,将从被验证的值填充?

一般性步骤(比较冗余)

  /*创建元素,*/
$name = new Element('name');
  /*设置标签*/
$name->setLabel('Your name');
  /*设置元素的各种属性。。。*/
$name->setAttributes(['type' => 'text',]);
  /*创建表单,*/
$form = new Form('contact');   /*将元素添加到表单里面。*/
$form->add($name);   /*创建某个元素的Input,*/
$nameInput = new Input('name');   /*创建inputfilter,*/
$inputFilter = new InputFilter();   /*添加input到inputfilter。*/
$inputFilter->add($nameinput);   /*把inputfilter连接到表单。*/
$form->add($inputFilter);

通过工厂创建

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

  步骤如下:

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

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

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

验证表单:

表单验证需要三个步骤:

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

指示给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. Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)

    一.重定位链接时重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码.当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整.同时,链接器需要对已经解 ...

  2. .NET-架构优化实战-底层服务优化

    原文:.NET-架构优化实战-底层服务优化 前言 问题分析 在本系列第一篇文章我们提到,底层问题主要存在以下两点: 代码冗余 时效低 代码冗余 例如: 领奖方法不统一,一次性的写一套,可循环的又写一套 ...

  3. 关于如何在Sublime下安装插件

    安装插件的两种方式 通过Package Control安装 不能安装 手工安装 安装插件的两种方式 在sublime下安装插件有两种方式,一种是通过package control来进行安装,另一种呢就 ...

  4. Momentum(动量/冲量)的理解及应用

    1. 基本概念(Momentum vs SGD) Momentum 用于加速 SGD(随机梯度下降)在某一方向上的搜索以及抑制震荡的发生. GD(gradient descent) θt=θt−1−η ...

  5. 工具类与工具函数 —— NextPrime

    求大于某数的下一个素数: static int NextPrime (int N) { if (N % 2 == 0) ++N; int i; for (; ; N += 2){ for (i = 3 ...

  6. 囚徒困境、价格大战与 iPhone 的价格

    静态/动态,完全/不完全: 完全信息静态博弈: 不完全信息静态博弈: 完全信息动态博弈: 不完全信息动态博弈: 囚徒困境实际上反映了一个深刻的哲学问题:个人利益与集体利益的矛盾.个人为了自己利益的最大 ...

  7. Myeclipse - Web项目转换技巧--处理Java项目、SVN非Web项目问题

    喜欢从业的专注,七分学习的态度. 概述 对于Java调试,使用Eclipse习惯性的使用Junit调试,使用Myeclipse习惯性的将项目转成Web项目在Tomcat或Weblogic中调试,在My ...

  8. WPF随笔(九)--使用路径动画模拟管道流体流向

    原文:WPF随笔(九)--使用路径动画模拟管道流体流向 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/detail ...

  9. ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

    要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...

  10. 学习鸟哥的Linux私房菜笔记(9)——bash1

    一.Shell简介 Shell :命令行解释器,是用户与系统沟通时的媒介 在Unix系统中有各种Shell, Linux采用bash为其默认shell 系统可以使用的shell记录在 /etc/she ...