使用 Zend_Form 生成表单 --(手册)

Zend_Form 类用来聚合表单元素,显示组和子表单。它可以在这些条目中执行下列动作:

  • 校验,包括读取错误代码和消息
  • 值聚合,包括组装(populating)条目和从所有条目读取过滤的和未过滤的值
  • 迭代所有条目,按它们键入的顺序或者从每个条目中读取的顺序提示来进行
  • 解析(rendering)整个表单,通过执行定制解析的单个装饰器(decorator)或者迭代(iterating)表单中的所有条目

虽然由 Zend_Form 生成的表单可能复杂,可能最好的用法是做简单的表单,但是对于快速程序开发和生成原型(prototyping),它是最好的。

最基本的事情是实例化一个表单对象:

<?php
// Generic form object:
$form = new Zend_Form();

// Custom form object:
$form = new My_Form()
?>

你可以可选地传递配置参数,它用来设置对象状态以及可能生成新元素:

<?php
// Passing in configuration options:
$form = new Zend_Form($config);
?>

Zend_Form 是可迭代的(iterable),它将按照它们注册的顺序和任何拥有的索引迭代所有元素、显示组和子表单。当你想手动地按适当的顺序解析(render)元素的时候,这个很有用。

Zend_Form 的魔法在于它能够为元素和显示组提供工厂服务(serve as a factory),并且通过装饰器来解析(render)自己。

1.元素(element)

Zend_Form 提供了若干 访问器用来从表单中添加和删除元素。这些可以获得元素对象实例或以工厂模式来为实例化元素对象自己服务。

添加元素的最基本的方法是 addElement()。该方法可以或者带有Zend_Form_Element (或者继承
Zend_Form_Element 的类 )类型对象的参数,或者用于建立新元素的参数- 包括元素类型、名称和任何配置选项。

如一些例子:

<?php
// Using an element instance:
$element = new Zend_Form_Element_Text('foo');
$form->addElement($element);

// Using a factory
//
// Creates an element of type Zend_Form_Element_Text with the
// name of 'foo':
$form->addElement('text', 'foo');

// Pass label option to the element:
$form->addElement('text', 'foo', array('label' => 'Foo:'));
?>

一旦元素被添加到表单,可以用名字来读取。通过使用getElement() 方法或者通过重载(overloading)使元素作为对象属性来访问:

<?php
// getElement():
$foo = $form->getElement('foo');

// As object property:
$foo = $form->foo;
?>
 

偶尔地,你只想生成一个元素并不想把它加到表单上(例如,你想利用众多的用表单注册的插件路径,但稍后把这些对象加到子表单上)。createElement() 方法可以完成这些:

<?php
// $username becomes a Zend_Form_Element_Text object:
$username = $form->createElement('text', 'username');
?>

2. 组装和读取数值

校验表单之后,你一般需要读取它的数值以便执行其它操作,如更新数据库或通知一个 web 服务。你可以通过getValues() 来读取所有元素的值,getValue($name) 可以通过名字来读取一个单个的值:

<?php
// Get all values:
$values = $form->getValues();

// Get only 'foo' element's value:
$value = $form->getValue('foo');
?>

有时候,在解析之前,你想用特定的值来组装表单,可以通过setDefaults()
populate() 方法来完成:

<?php
$form->setDefaults($data);
$form->populate($data);
?>

在另一面,你可能想在组装和校验之前清除一个表单,可使用reset() 方法来完成:

$form->reset();

3.    元数据(Metadata)和属性(Attributes)

虽然表单的有效性基本源于它所包含的元素,但它也可以包含其它元数据,如名称(在 HTML 标记语言中经常用作唯一的 ID)、表单动作和方法、许多元素、组、它所包含的子表单和属性元数据(通常用做为表单标签自己设置 HTML 属性)。

可以使用名字访问器来设置和读取表单的名字:

<?php
// Set the name:
$form->setName('registration');

// Retrieve the name:
$name = $form->getName();
?>

为了设置动作(到表单提交的 url )和方法(提交的方法如‘POST‘ 或 ‘GET‘),使用动作和方法访问器:

<?php
// Set the action and method:
$form->setAction('/user/login')
     ->setMethod('post');
?>

你也可以指定特别使用 enctype 访问器的表单编码类型。Zend_Form 定义了两个常量,Zend_Form::ENCTYPE_URLENCODED
Zend_Form::ENCTYPE_MULTIPART
,分别对应值为 ‘application/x-www-form-urlencoded‘ 和‘multipart/form-data‘; 然而,你可以把它设置为任意的编码类型。

<?php
// Set the action, method, and enctype:
$form->setAction('/user/login')
     ->setMethod('post')
     ->setEnctype(Zend_Form::ENCTYPE_MULTIPART);
?>

设置任意元数据可通过属性访问器来完成。因为在Zend_Form 中重载用于访问元素、显示组和子表单,这是唯一的访问元数据的方法。

<?php
// Setting attributes:
$form->setAttrib('class', 'zend-form')
     ->addAttribs(array(
         'id'       => 'registration',
         'onSubmit' => 'validate(this)',
     ));

// Retrieving attributes:
$class = $form->getAttrib('class');
$attribs = $form->getAttribs();

// Remove an attribute:
$form->removeAttrib('onSubmit');

// Clear all attributes:
$form->clearAttribs();
?>
 

4. 校验

表单的一个基本用例是校验提交的数据。Zend_Form 让你一次性校验整个表单或部分表单,还有对 XmlHttpRequests (AJAX)的自动校验响应。如果提交的数据无效,它有一些方法用来为元素和子表单校验失败而读取各种各样的错误代码和消息。

为了校验整个表单,使用 isValid() 方法:

isValid() 校验每个必需的元素和任何包括在提交的数据中的非必需的元素。

有时候你可能只需要校验数据的一个子集,可以使用isValidPartial($data)

<?php
if (!$form->isValidPartial($data)) {
    // failed validation
}
?>

isValidPartial() 只尝试校验那些数据中匹配的元素,如果某个元素不在数据中,那就跳过。

当为 AJAX 请求校验元素或元素组,你一般要校验表单的一个子集,并想要响应返回到 JSON。用processAjax() 正好:

<?php
$json = $form->processAjax($data);
?>

你可以发送 JSON 响应到客户端。如果表单有效,这将是个布尔true 响应,如果表单无效,则是个包含 key/message 对的 javascript 对象,这里,每个 ‘message‘ 是校验错误消息的数组。

对于校验失败的表单,你可以分别使用
getErrors()
getMessages() 获取错误代码和错误消息:

<?php
$codes = $form->getErrors();
$messages = $form->getMessage();
?>

你可以通过传递元素名为单个元素来获取代码和错误消息;

<?php
$codes = $form->getErrors('username');
$messages = $form->getMessages('username');
?>
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 05:28:59

使用 Zend_Form 生成表单 --(手册)的相关文章

使用 Zend_Form_Element 生成表单元素 --(手册)

表单由元素组成,它一般对应于 HTML 表单输入.Zend_Form_Element 封装了单个表单元素,并完成下列工作: 校验(提交的数据有效乎?) 抓取校验错误代码和消息 过滤(在校验和/或输出之前元素如何转义或规范化?) 解析(元素如何显示?) 元数据和属性(什么信息进一步修饰元素?) 基础类 Zend_Form_Element 对许多类有合理的缺省设置,但最好还是继承这个类来完成特殊意图的元素.另外,Zend Framework 带有许多标准的 XHTML 元素. 1.  插件加载器 Z

根据数据生成表单

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>根据数据生成表单</title> <script> //定义一个数组承接里面的对象内容 //提取数组中的元素(这个元素是对象) //用元素对象type属性判断这个对象是什么类型的标签 //再有对象拿到属性值给标签附上属性 //老套路 window.onload = function()

开源驰骋工作流CCFlow的通过导入内部数据生成表单的示例

应用背景:ccform的表单设计是自上而下的设计,就是说现有表单后有数据表,就是说在设计表单时ccform就自动创建了字段,如果该表单的表有了该字段就不创建了.但是很多程序员习惯了先创建表,然后在创建表单,也就是说在设计表单时,系统已经有该表了,要以已经有的表结构做为该表单的模版导入,就需要用到此功能. 解释:从指定的数据源中,指定的表,导入字段信息. 用途:在新建表单以前,表单已经有一个原型,或者已经有一个表,要以原来的数据表结构为模版,创建表单.比如我们要做一个人员入职流程,在实施以前,人员

yii2自动生成表单

视图中: 1.要use的两个文件类 use yii\helpers\Html;   use yii\widgets\ActiveForm; 2.生成表单,以添加商品为例说明.注意红线区域:上传文件需要注意的地方一级表单中有textarea文本域的使用 yii2自动生成表单

vue动态生成表单组件vue-generate-form

项目地址 简介 Vue动态生成表单组件 可以根据数据配置表单 使用的UI库是iView 在Vue里 一般要用到什么组件或数据 都得提前声明 所以要根据数据来生成表单 只能使用Vue的render函数 要做这一个组件 其实并不难 看一下Vue官方示例 再找个UI组件库 差不多就能写出来 如果对项目有兴趣 可以fork或克隆项目 自行研究 有问题或BUG欢迎提issues 文档 在线DEMO 表单组件 Input 输入框 Button 按钮 Radio 单选框 Checkbox 多选框 Icon 图

Yii 2.0 ActiveForm生成表单 ,控制表单label和filed样式,filed一旦报错,前面lable颜色跟着变,看图,帮你解决

需要生成如下图的表单样式,图一: 正确代码: <?php $form = ActiveForm::begin([          'id' => 'login-form',          'options' => ['class' => 'form-horizontal'],          'fieldConfig' => [              'template' => "{label}\n<div class=\"col-

yii2.0 用Html方式生成表单

文本框:textInput(); 密码框:passwordInput(); 单选框:radio(),radioList(); 复选框:checkbox(),checkboxList(); 下拉框:dropDownList(); 隐藏域:hiddenInput(); 文本域:textarea(['rows'=>3]); 文件上传:fileInput(); 提交按钮:submitButton(); 重置按钮:resetButtun(); <?php //引入命名空间 use yii\helpers

vue中通过后台返回的只动态生成表单及提交

在crm系统中,页面中表单内容和表单提交的内容都是不固定的,特别是表单内容不确定:是根据后台的需要配置出来:前台根据接口返回:进行渲染,处理后进行提交,这样在vue中就会出现问题:因为vue中的数据是先渲染后使用:所有的数据必须先生命出来,所以这样就造成了这个问题: 解决方法: 1.在请求接口:渲染后台需要提交的表单字段的时候:先对所有的需要渲染和提交的表单字段进行遍历,然后存储到data中一个对象中,我写的对象是subParams,这样就可以把所有需要提交的字段提交到subparams中了:

生成 表单 令牌

/** * 生成令牌 * * @return string */ public function gen_token() { $hash = md5(uniqid(rand(), true)); $token = sha1($hash); return $token; }