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

由于 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>

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



千里之行,始于足下。(老子)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值