2017-08-02 17:23:42 1866次浏览 4条回答 0 悬赏 10 金钱

如下图所示,我是按照官网上介绍的,独立验证器支持客户端验证,但是返回JS代码这样写不对,报错了,有哪位同学知道的可以告诉我该怎么写呢?谢谢!
另外,行内验证器为什么无法支持客户端验证呢?
图片1.png

最佳答案

  • 阿江 发布于 2017-08-03 09:22 举报

    //实例:客户端验证器
    文件位置:
    \advanced\frontend\components\validators\StatusValidator.php

    <?php
    namespace frontend\components\validators;
    use yii\validators\Validator;
    use frontend\models\Validator as v;
    class StatusValidator extends Validator{
        public function init(){
            parent::init();
            $this->message = '无效状态';
        }
        public function validateAttribute($model, $attribute){
            $value = $model->$attribute;
            if(!in_array($value,v::status())){
                $model->addError($attribute, $this->message);
            }
        }
        public function clientValidateAttribute($model, $attribute, $view){
    		/*
    		预定义的变量(可直接在JavaScript中引用):
    		attribute:正在被验证的属性名称
    		value:正在被验证的值
    		messages:一个数组,记录了与输入项对应的验证错误信息
    		deferred:一个数组,可以推入的推迟数组
    		*/
            $statuses = json_encode(v::status());
            $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
            return <<<JS
    if ($.inArray(value, $statuses) === -1) {
        messages.push($message);
    }
    JS;
        }
    }
    

    文件位置:
    \advanced\frontend\views\post\validator.php

    	$form = ActiveForm::begin([
    	'enableClientValidation'=>true,
    ]);
    <?= $form->field($model, 'selectedDefault')->textInput(); ?>
    

    文件位置:
    \advanced\frontend\models\Validator.php

    <?
    	public function rules(){
    		return [
    			['selectedDefault',StatusValidator::className()],
    		];
    	}
    	public static function status(){
    		return ['ok','active','offline','online'];
    	}
    <?
    
    1 条回复
    回复于 2017-08-03 10:11 回复

    谢谢了兄弟!

  • 回答于 2017-08-02 17:46 举报

    这样试试:

    $okay=json_encode($model->conpassword==$model->password?1:0);
    

    另外,$okay传到客户端应该是个字符串,你用字符串比较试一下。

    1 条回复
    回复于 2017-08-02 17:58 回复

    我指的是return部分不知道该怎么写,IDE提示错误,访问提示文件非法结束。。

  • 回答于 2017-08-02 18:32 举报
    echo '<script>...</script>';
    return false;
    
    
    1 条回复
    回复于 2017-08-02 19:20 回复

    public function clientValidateAttribute($model, $attribute, $view) {

    $okay = $model->conpassword==$model->password ? 1 : 0;
    $message = json_encode($this->message);
    $str = '<script>';
    $str .= 'if('.$okay.' == 0) {';
    $str .= 'message.push('.$message.');';
    $str .= '}</script>';
    echo $str;
    return false;
    

    }
    请问是这样吗?不对哦,还是没走客户端验证,直接走服务端验证了。。。

  • 回答于 2017-08-04 13:53 举报

    你的例子完全可以用 compare validator

您需要登录后才可以回答。登录 | 立即注册
是啊俊
经理

是啊俊

注册时间:2017-07-28
最后登录:2018-01-23
在线时长:13小时58分
  • 粉丝0
  • 金钱785
  • 威望20
  • 积分1115

热门问题