由于 Zend_Filter_Input过滤器有些特殊,我们单独拿出来一起学习下。这东西专门用于实现对互动程序中用户输入数据的过滤,说白了就是对form表单过滤。要实现过滤通常有以下几个步骤:
1.定义过滤与效验规则。
2.创建过滤与效验处理器。
3.检索处理后的字段与其他报告内容。
下边我们按照以上三步学习下 Zend_Filter_Input过滤器的定义方法------------
定义过滤器与效验规则
在创建一个 Zend_Filter_Input类之前,需要为该过滤器分别创建过滤规则和效验规则数组。
其中的两个键与值呢为需要获取前台表单项的名称(也就是表单中name的值)与相应对其进行处理的子类名称(也就是过滤和效验的规则)。
下边不废话举个书上的例子:
$filters=array( //定义过滤规则
'username'=>'StringToLower',
'month'=>'Digits'
);
$validators=array( //定义效验规则
'username'=>'Alpha',
'month'=>array(array('Between',1,12))
);
看到没,这就是用数组方式定义的过滤规则和效验规则。username就是表单name的值,StringToLower就是规则。
除了这种单一的定义方法以外,还可以使用如下形式,把指定内容使用一组效验规则。
$validators=array(
'month'=>array(
'Digits', //字符串表示类名
'new Zend_Validate_Int(), //对象表示类
'array('Between',1,12) //数组以字符串及附加参数表示
)
);
所创建的校验器就实现了对月份进行了三重效验,分别是数值效验、证书效验与位于1和12之间效验。可以看出使用数组参数既可以是以字符串表示效验名称,还可以使校验器类的实例哦。
还可以使用数组的形式来表示,还有如果校验器中有附加参数,则必须数组的形式来表示。还可以使用通配符 “*” ,改符号代表所有表单项。例如以下代码:
$filters=array(
' * ' => 'HtmlEntities',
' age ' => 'Digits'
);
创建Input过滤器
创建Input过滤器无非就是实例化一个对象并加上指定参数,方法如下:
$input = new Zend_Filter_Input($filters,$validators,$data)
其中$filters为过滤规则数组,$validators为效验规则数组,$data为表单数据的来源(就是form表单采用的方式比如说post)。如果$data的值为$_post。代码所定义的过滤器将从数组$_post[ ]中过去数据。
检索处理后的字段与其他内容
在定义了Zend_Filter_Input过滤器之后,就可以通过多种方法来获取其中的各项内容,包括无效内容(Invalid)、丢失内容(Missing)和未知内容(UNknown)等。当然最重要的还是返回经过过滤器处理后的内容。正常获取处理后的内容如下方法:
$input = new Zend_Filter_Input($filters,$validators,$data)
$m=$input->month;
其中,$input为指定Zend_Filter_Input过滤器的实例;month为经过过滤的表单项名称。
对于Zend_Filter_Input过滤器的学习呢,我还是做了一个例子,这例子修改书上的,很是经典。
1.首先我们先创建一个项目。
2.创建一个控制器SelfController.php
3.创建public function selfAction()方法用来调用表单视图
4.创建 /self/self.phtml视图用于写表单
5.创建public function jieguoAction()方法把表单内容提交到这,在此方法中检索字段与其他内容
大概呢就分为这几步骤,下边我把文件内容展示给大家看:
文件SelfController.php内容如下--
<?php
/*Zend_Controller_Ation*/
require_once 'Zend/Controller/Action.php';
//SelfController
class SelfController Extends Zend_Controller_Action
{
public function selfAction()
{
//input过滤器使用
}
public function jieguoAction()
{
$filters=array( //定义过滤规则
'username'=>'StringToLower',
'month'=>'Digits'
);
$validators=array( //定义效验规则
'username'=>'Alpha',
'month'=>array(array('Between',1,12))
);
$data=$_POST;
$input=new Zend_Filter_Input($filters, $validators,$data); //为类实例化对象并指明参数
if($input->hasInvalid()){
echo "111";
$invalidFiedlds=$input->getInvalid(); //获取无效内容,近没有效验通过的表单项
}
if ($input->hasMissing()){
echo "222";
$missingFields=$input->getMissing();
}
if ($input->hasUnknown()){
echo "333";
$unknownFields=$input->getUnknown();
}
$m=$input->month;
$n=$input->username;
$m3=$input->getUnescaped('month');
echo "<p>";
echo "未经过过滤的表单项为:";
echo "<p>";
print_r($invalidFiedlds);
echo "<p>";
echo "没有出现表单项为:";
echo "<p>";
print_r($missingFields);
echo "<p>";
echo "未被定义过滤的表单项为:";
echo "<p>";
print_r($unknownFields);
echo "<p>";
echo "过滤后的月份为:";
echo "<p>";
print_r($m);
echo "<p>";
echo "过滤后的用户名为:";
echo "<p>";
print_r($n);
}
}
文件self.phtml内容如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>应用Zend_filter_Input实例前台</title>
</head>
<body>
<p align="center">
<table border="1">
<captoin>加入表单</captoin>
<form method="post" action="<?php echo $this->baseUrl();?>/self/jieguo">
<tr>
<td>姓名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>性别:</td>
<td><input type="radio" name="sex" value="男" checked>男
<input type="radio" name="sex" value="女">女
<input type="radio" name="sex" value="变态">变态</td>
</tr>
<tr>
<td>出生日期</td>
<td>
<input type="text" name="year" size="4">年
<input type="text" name="month" size="4">月
<input type="text" name="day" size="4">日
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交">
<input type="reset" value="重置">
</td>
</tr>
</form>
</table>
</body>
</html>
和书上的代码内容类似,但是有些地方是我改过的,我写的是整个项目,而书上的只是单个的几个文件而已,不同之处就是我的不用加载类什么的,应为系统已经把所有的类全都加载了。
千里之行,始于足下。(老子)