zoukankan      html  css  js  c++  java
  • zend-form笔记

      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用来数组和对象之间的转换,序列化)

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

      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、创建工厂对象(ZendFormFactory)

        调用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:

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

    对于fieldset必须实现ZendInputFilterInputFilterProviderInterface,这里面定义了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、如果对象实现了ZendInputFilterInputFilterAwareInterface,那对象包含的input filter会被用来替换form所包含的input filter。

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

    关于视图方面:

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

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

  • 相关阅读:
    CruiseControl.NET 三言两语
    在MFC程序中增加控制台
    VS2005 编译Release版本出现清单文件的错误
    内存泄露问题
    软件设计原则
    boost::shared_ptr 分析与实现
    corelDraw 的CDR格式解析
    13. 量词操作符—【LINQ标准查询操作符】
    SQL SERVER执行查询的顺序
    CSLA命令对象的简单封装
  • 原文地址:https://www.cnblogs.com/san-fu-su/p/5716552.html
Copyright © 2011-2022 走看看