您的位置:首页 > 编程语言 > PHP开发

ZendFramework学习第三章(核心组件—过滤器之 Zend_Filter_Input过滤器)

2012-08-27 14:34 561 查看
由于 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>

和书上的代码内容类似,但是有些地方是我改过的,我写的是整个项目,而书上的只是单个的几个文件而已,不同之处就是我的不用加载类什么的,应为系统已经把所有的类全都加载了。


千里之行,始于足下。(老子)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐