表单字段验证这可是常见应用开发框架中比较重要的一块儿,至少在我看来是这样的。因此,在设计CMSPAD中的表单验证器过程中,我们研究了很多已存在的PHP框架,提炼他们比较有优势的地方,加上本身的项目经验,开发出了具有极好易用性和极大扩展性的产品:CMSPAD Validator(以下称CV)。
在设计CV过程中,我们考虑到了它是由两种角色使用的:前台美工和后台程序员。
[b]1. 美工角色[/b]
假设大部分美工不懂程序开发(包括JavaScript),怎么才能让他们很好的使用CV呢?下面让我们看看下列的用例代码:
[code]<form bind="SimplePortlet.helloWorld">
<input type="text" name="email" bind="email:无效的Email地址;"/>
<input type="text" name="chineseName" bind="chinese:请输入中文字符"/>
<button type="submit">提交</button>
</form>[/code]
这是CV的最简化用法,主要方便美工进行简单的客户端输入字段验证。bind属性中主要有两部分组成:验证器名称和出现错误对话框时弹出的内容文字,他们之间使用冒号(:)分隔,其中内容文字是可选的,如果没有,它当然就不弹出文字了。下面看看比较复杂点儿的用法:
[code]<form bind="SimplePortlet.helloWorld">
<input type="text" name="username" bind="length(3,20):请输入长度在3至20字符之间的用户名称"/>
<input type="text" name="idcard" bind="idcard:身份证号码不正确; SimplePortlet.idcard"/>
<button type="submit">提交</button>
</form>[/code]
这段代码中,检测用户帐号字段使用了两个参数,来判断帐号长度是否在3至20个字符之间,如果没有则弹出文字;而检测身份证号码字段使用了两个验证器:第一个为客户端验证,检查身份证号码规则是否正确,第二个是将信息提交到名字为“SimplePortlet”的Portlet中的checkIdcard方法中,远程验证身份证号码是否正确。两个验证器之间使用分号(;)分隔,当然,每个字段可以有多个验证器,他们顺序执行。例如:
[code]<input type="text" name="username" bind="!empty:不允许为空;length(3,20):长度在3至20字符之间;!equals('Administrator'):不能是Administrator"/>[/code]
这样验证器会自动判断该字段是否为非空,如果不是,则弹出对话框;如果是,则检查长度是否在3-20字符之间,如果不是,则弹出对话框;如果是,则检查所输入的是否是“Administraotr”,如果是,则弹出对话框,否则验证通过。
这里有一个特殊的字符“!”,用来表示“非”判断,例如“!empty”就是非空,“!equals”就是不等于。
至此,美工的活儿就完事儿了,不是很难吧。 :wink:
[b]2.程序员角色[/b]
在CV架构中,程序员主要是做以下几件事情:
[list=1][*]开发Portlet端的字段验证方法[*]开发验证器实现[/list]
2.1 开发Portlet端的字段验证方法
如果某些字段需要在服务器端进行验证,或者在表单提交时进行服务器端自动验证,那程序员需要开发Portlet端的字段验证方法,样例代码如下:
[code]import('Validator');
class SimplePortlet{
public function checkIdcard(&$response, $value, $context = false){
if(Validator::validate('empty', $value, $context)){
$response->alert('请输入身份证号码');
return false;
}else if(!Validator::validate('idcard', $value, $context)){
$response->alert('无效身份证号码');
return false;
}
}
}[/code]
所有的Portlet端字段验证器名称都是以"check"开头,后面跟验证器名称。其参数分别为:控制器的回复对象、待验证的值、验证器上下文(在提交验证时,为$_POST数组;而在远程验证时,为NULL)。
[list]Portlet端验证器的两种验证方式[*]远端验证:即在表单字段的bind属性中指定验证器。[*]提交验证:当表单提交到服务器上时,CV会自动根据字段名称与验证器名称相匹配,如果该验证器存在,则进行验证。如果验证器不是返回false,则继续其他字段验证,否则,暂停处理。待到所有验证都通过时,才调用formXXXX方法来进行表单处理。[/list]
2.2 验证器实现的开发:
一个验证器实现,类名称必须为 cmspad_validator_<当前文件名>,必须有下面两个方法:
[list][*]validate($value,$context = null): 这是进行服务器端验证的方法。[*]getJavascript($v): 这是获取进行客户端验证所需的JavaScript脚本,是静态方法。[/list]
下面看看一个简单的验证器实现:
[code]class cmspad_validator_chinese{
public function validate($value, $context = null){
return preg_match('/^[\u0391-\uFFE5]+$/', $value);
}
public static function getJavascript($value){
return "return /^[\u0391-\uFFE5]+$/.test($value);";
}
}[/code]
该代码保存在 inc/validators/chinese.php 文件中。
当在服务器端调用时,使用如下代码:
[code]Validator::validate('chinese', $value, $context);[/code]
上面的Portlet字段验证代码中已经有使用样例了,这里就再说明了。
至此,CMSPAD验证器框架的大部分功能已经介绍完毕,学起来还算简单吧。 :D
在设计CV过程中,我们考虑到了它是由两种角色使用的:前台美工和后台程序员。
[b]1. 美工角色[/b]
假设大部分美工不懂程序开发(包括JavaScript),怎么才能让他们很好的使用CV呢?下面让我们看看下列的用例代码:
[code]<form bind="SimplePortlet.helloWorld">
<input type="text" name="email" bind="email:无效的Email地址;"/>
<input type="text" name="chineseName" bind="chinese:请输入中文字符"/>
<button type="submit">提交</button>
</form>[/code]
这是CV的最简化用法,主要方便美工进行简单的客户端输入字段验证。bind属性中主要有两部分组成:验证器名称和出现错误对话框时弹出的内容文字,他们之间使用冒号(:)分隔,其中内容文字是可选的,如果没有,它当然就不弹出文字了。下面看看比较复杂点儿的用法:
[code]<form bind="SimplePortlet.helloWorld">
<input type="text" name="username" bind="length(3,20):请输入长度在3至20字符之间的用户名称"/>
<input type="text" name="idcard" bind="idcard:身份证号码不正确; SimplePortlet.idcard"/>
<button type="submit">提交</button>
</form>[/code]
这段代码中,检测用户帐号字段使用了两个参数,来判断帐号长度是否在3至20个字符之间,如果没有则弹出文字;而检测身份证号码字段使用了两个验证器:第一个为客户端验证,检查身份证号码规则是否正确,第二个是将信息提交到名字为“SimplePortlet”的Portlet中的checkIdcard方法中,远程验证身份证号码是否正确。两个验证器之间使用分号(;)分隔,当然,每个字段可以有多个验证器,他们顺序执行。例如:
[code]<input type="text" name="username" bind="!empty:不允许为空;length(3,20):长度在3至20字符之间;!equals('Administrator'):不能是Administrator"/>[/code]
这样验证器会自动判断该字段是否为非空,如果不是,则弹出对话框;如果是,则检查长度是否在3-20字符之间,如果不是,则弹出对话框;如果是,则检查所输入的是否是“Administraotr”,如果是,则弹出对话框,否则验证通过。
这里有一个特殊的字符“!”,用来表示“非”判断,例如“!empty”就是非空,“!equals”就是不等于。
至此,美工的活儿就完事儿了,不是很难吧。 :wink:
[b]2.程序员角色[/b]
在CV架构中,程序员主要是做以下几件事情:
[list=1][*]开发Portlet端的字段验证方法[*]开发验证器实现[/list]
2.1 开发Portlet端的字段验证方法
如果某些字段需要在服务器端进行验证,或者在表单提交时进行服务器端自动验证,那程序员需要开发Portlet端的字段验证方法,样例代码如下:
[code]import('Validator');
class SimplePortlet{
public function checkIdcard(&$response, $value, $context = false){
if(Validator::validate('empty', $value, $context)){
$response->alert('请输入身份证号码');
return false;
}else if(!Validator::validate('idcard', $value, $context)){
$response->alert('无效身份证号码');
return false;
}
}
}[/code]
所有的Portlet端字段验证器名称都是以"check"开头,后面跟验证器名称。其参数分别为:控制器的回复对象、待验证的值、验证器上下文(在提交验证时,为$_POST数组;而在远程验证时,为NULL)。
[list]Portlet端验证器的两种验证方式[*]远端验证:即在表单字段的bind属性中指定验证器。[*]提交验证:当表单提交到服务器上时,CV会自动根据字段名称与验证器名称相匹配,如果该验证器存在,则进行验证。如果验证器不是返回false,则继续其他字段验证,否则,暂停处理。待到所有验证都通过时,才调用formXXXX方法来进行表单处理。[/list]
2.2 验证器实现的开发:
一个验证器实现,类名称必须为 cmspad_validator_<当前文件名>,必须有下面两个方法:
[list][*]validate($value,$context = null): 这是进行服务器端验证的方法。[*]getJavascript($v): 这是获取进行客户端验证所需的JavaScript脚本,是静态方法。[/list]
下面看看一个简单的验证器实现:
[code]class cmspad_validator_chinese{
public function validate($value, $context = null){
return preg_match('/^[\u0391-\uFFE5]+$/', $value);
}
public static function getJavascript($value){
return "return /^[\u0391-\uFFE5]+$/.test($value);";
}
}[/code]
该代码保存在 inc/validators/chinese.php 文件中。
当在服务器端调用时,使用如下代码:
[code]Validator::validate('chinese', $value, $context);[/code]
上面的Portlet字段验证代码中已经有使用样例了,这里就再说明了。
至此,CMSPAD验证器框架的大部分功能已经介绍完毕,学起来还算简单吧。 :D