再问个问题关于智能的数据验证spVerifier如何显示错误信息

#1 anythink

我使用
 
if($this->spArgs('submit'))
  {
    $memobj = spClass('db_member');
    $memobj->verifier = $memobj->verifier_reg; // 切换验证规则     
    if( false == $memobj->spVerifier($this->spArgs()) ){  
   
   
    }else{  
   
    // 不能通过验证  
    dump($memobj->spVerifier($this->spArgs()) )  //来验证,如果错了如何更好的现实错误信息? 难道?

   
    }  

2011-06-11 01:56:02

#2 anythink

如果我要判断用户是否存在


创建了一个


          var $addrules = array(  
                'isused' => 'checkname' //  检查用户是否重复
          );  




function checkname($val,$right)
        {
                $result = $this->findBy('username',$val)
                if(is_array($result))
                {
                return false;       
                }else{
                return true;       
                }
               
        }

这样判断拥护名是否重复  对部?

2011-06-11 02:06:19

#3 anythink

搞不清楚着两个 $val  和 $right 是什么意思

2011-06-11 02:26:05

#4 anythink

验证用户名重复已经搞定
 
声明

var $addrules = array(  
  'isused' => array('db_member','checkname') // 使用当前类的'checkname'方法判断
   );


 
设置验证规则
var $verifier_reg  = array(  
       "rules" => array(
           'username' => array(  
               'notnull' => TRUE, // username不能为空  
               'minlength' => 5,  // username长度不能小于5  
               'maxlength' => 20, // username长度不能大于
               'isused' => 'username', //把username植作为验证参数
             ),  
           'password' => array(   
               'notnull' => TRUE,
               'minlength' => 6,
            ),  
      'password2' => array(  
              'equalto' => 'password',   
            ),  
        ),  
    "messages" => array( // 提示信息  
             'username' => array(  
                 'notnull' => "用户名不能为空",  
                'minlength' => "用户名不能少于5个字符",
                 'maxlength' => "用户名不能大于20个字符",  
     'isused'=>'用户名已经存在',
            ),  
     'password' => array(  
                 'notnull' => "密码不能为空",  
                'minlength' => "密码不能少于5个字符",  
            ),  
      'password2' => array(  
              'equalto' => '两次密码输入不正确',   
            ),
     )  
    );  


 
验证函数

/*注册验证是否重名*/
function checkname($val,$right)
{
  $result = $this->findBy('username',$val);
  if(is_array($result))
  {
  return FALSE;
  }else{
  return TRUE;
  }
  
}


现在还有个问题就是 登陆的时候 我如何验证用户名密码是否正确呢? 如何在着2个参数上严正?

2011-06-11 02:36:08

#5 jake

这里,你已经理解了“一个参数”进行验证的方法。目前是想做“两个参数”验证,对吗?

其实验证函数的第三个参数,就是全部的输入值,你可以dump出来看看。

checkname($val,$right, $values)
dump($values);

这样你就获得了用户名和密码两个参数了,然后怎么验证那是程序怎么写的问题,最后返回 true或false代表通过或不通过即可。

具体这里例子,可参考 http://speedphp.com/bbs/thread-219-1-2.html

2011-06-11 07:08:40

#6 anythink

checkname($val,$right, $values)
第三个参数就是 全部的 post表单里的内容啊????

2011-06-11 11:25:25

#7 anythink

之前问的那个问题还没解决呢?

 



if($this->spArgs('submit'))

  {

    $memobj = spClass('db_member');

    $memobj->verifier = $memobj->verifier_reg; // 切换验证规则     

    if( false == $memobj->spVerifier($this->spArgs()) ){  

   

  

    }else{  
   

   // 不能通过验证 的话我再显示这个代码 如果有错误信息 会重复2次,如何友好的显示该错误信息呢???

    dump($memobj->spVerifier($this->spArgs()) )  

    }  

2011-06-11 11:48:14

#8 jake

就是第三个参数是你传入的参数

$memobj->spVerifier($this->spArgs())

checkname($val,$right, $values)

$values就是$this->spArgs()

2011-06-11 18:27:10

#9 anythink

明白了,如何友好的现显示 错误信息呢 ? 我在7楼说了一下????

2011-06-11 20:58:48

#10 jake

看手册:http://speedphp.com/spverifier-friendly-tips.html

2011-06-12 09:53:12

#11 anythink

哥,没写着吧...


未命名.jpg

2011-06-12 12:31:53

#12 anythink

我现在都是这样的....

2011-06-12 12:32:07

#13 anythink

这里我们可以看到,加入信息提示的方法和规则的写作方法差不多,而且与规则是一一对应的。如果某个规则存在对应的提示,那么当该规则不能通过时将返回对应的提示。同时也存在以下两种情况:

规则没有对应信息提示,正如例子中的email的全部规则都没有对应的信息提示,那么规则不能通过时返回的提示将是规则的名称。
信息提示存在,但是对应的规则却不存在。这并无问题,同时在重用性方面会有一定的方便。
相信我们看到了信息提示中有一个“ 'youare' => "看来你不是jake" ”的提示, 这youare就是一个自定义的验证规则。下章,我们将介绍如何创建自定义的验证规则。

-------------------悲剧的风格线-----------------

给个例子把,如何友好的显示错误信息到前端
...

2011-06-12 14:08:18

#14 jake

验证原理和提示如果明白如何操作(看手册)后,可以看看实例

http://speedphp.com/bbs/thread-219-1-2.html

2011-06-12 16:36:24

#15 anythink

天那 竟然摸班里面是这样写的

<{foreach from=$errmsg_arr item=err key=posi}><{if "addcity" == $posi }><{$err.0}><{/if}><{/foreach}>

每次都判断一个 input name ,然后 foreach 好麻烦啊,,,

强烈建议优化这个步骤,.... 不然感觉验证好麻烦,,,,,,, -

什么时候出新版本呢 = = 改改贝

2011-06-13 17:28:56

#16 anythink

酸了 我试一下...

2011-06-13 17:30:43

#17 jake

天那 竟然摸班里面是这样写的



每次都判断一个 input name ,然后 foreach 好麻烦啊,,,

强烈建议优化这个 ...
anythink 发表于 2011-6-13 17:28
其实可以写得简单些,不过我那是那个页面的需要,不同页面对提示有不同的处理,这才是“友好提示”麻烦的地方。

2011-06-13 18:27:12

#18 anythink

我现在想的是,只显示一条关键错误就行了, 比如  用户名不能为空是1  不能超过6个字为 2   不能小雨1个字为3

显示的时候逐错误现实,只显示最近的1个错误 就是  用户名不能为空是1   ,其他的等瑕疵提交再显示

2011-06-13 18:46:37

#19 anythink

哈成功了!

2011-06-13 20:24:31

#20 anythink

发一个函数搞定!

原创 原创!!!

2011-06-13 20:34:53

#21 anythink

希望能得到一些借鉴

写了一个扩展来


 
function verifierMsg($params)
{
$config =  array(
    'defaultTag'        => 'span',   //默认提示的包围标签
    'defaultTagClass'   => '', //默认提示的标签附加class
    'errTag'            => 'span',       //错误的提示包围标签
    'errTagClass'       => 'err',  //错误的提示包围标签附加class
    'showType'          => 1,      //错误显示方式,1为单独调用,2为全部显示在某个地方
    'ShowAre'           => 'ul',    //全部显示的时候外筐
    'ShowAreClass'      => 'tab', //外矿css
    'ShowInner'         => 'li',     //内部循环
    'ShowInnerClass'    => '',     //内部循环
   );
$set_array = $params['set'];
$input     = $params['in'];
$msg     = $params['msg'];
$show     = $params['showtype'];



if($config['showType']  ==2 || $show==2)
{

  if(is_array($set_array))
  {
    $str .= '<'.$config['ShowAre'].' class="'.$config['ShowAreClass'].'">';
    foreach($set_array as $k=>$v)
    {
     $str .= '<'.$config['ShowInner'].' class="'.$config['ShowInnerClass'].'">' . $v[0] . '' ;
    }
    $str .= '';
    return $str;
  }
   
}else{
  
  if(is_array($set_array))
  {
   foreach($set_array as $k=>$v)
   {
    if($k == $input)
    {
     return  '<'.$config['errTag'].' class="'.$config['errTagClass'].'">' . $v[0] . '' ;
    }else{
     return '<'.$config['defaultTag'].' class="'.$config['defaultTagClass'].'">' . $msg . '' ;
    }
   }
  }else{
   return '<'.$config['defaultTag'].' class="'.$config['defaultTagClass'].'">' . $msg . '' ;
  }
}
}
spAddViewFunction('verifierMsg','verifierMsg');

2011-06-13 20:35:36

#22 anythink

我去 一不小心就提交了!!!!!!


使用起来就是这么简单!!!!!!


{verifierMsg set=$errmsg_arr in=username showtype=2}

加上 showtype=2  就把所有错误都显示出来了!!!



{verifierMsg set=$errmsg_arr in=username msg='输入您的用户名,并记住'}



set 错误提示数组    in  哪个input 的错误信息           msg  没有错误的原始提示信息,有错误就覆盖




有个配制文件, 在函数里,  可以配制 普通信息和错误信息的标签 和 class  方便定义样式!!



完毕!

2011-06-13 20:37:59

#23 anythink

加上 showtype=2  就把所有错误都显示出来了!!!  in=username  是手误, 实际用showtype2的时候不写

2011-06-13 20:39:17

#24 anythink

额  来看看么...

2011-06-14 22:47:56

#25 jake

验证提示的方式有很多种,都是根据页面情况和设计来定的。

2011-06-15 16:45:30

#26 anythink

恩所以我才根据实际需求写了这么一个 插件

2011-06-15 18:32:23

#27 gnuser

在if(false==spVerifier(**)){

}else{
    输出错误信息
}
这里不就可以简单地处理提示信息吗?为什么还要加个插件?

2011-06-15 19:05:50

#28 anythink

你试试就知道了 那个错误输出能显示个啥.. 太不友好了

2011-06-15 23:53:56

#29 flashack

同样有显示一条错误信息的需求

                        foreach($userobj->spVerifier($this->spArgs()) as $ver) {
                                $this->error = $ver[0];
                                break;
                        }

2012-01-11 13:22:21

#30 jake

看看手册吧,验证这章其实挺复杂的,但是了解了之后就挺简单的

2012-01-14 09:41:56