Yii学习笔记::模型自动完成
博客专区 > 吾爱 的博客 > 博客详情
Yii学习笔记::模型自动完成
吾爱 发表于4年前
Yii学习笔记::模型自动完成
  • 发表于 4年前
  • 阅读 801
  • 收藏 4
  • 点赞 0
  • 评论 3
摘要: 用习惯了TP都知道可以定义一个自动完成规则,针对每个字段可以在入库前做一些自动填充值,比如注册时间自动填充一个时间戳。但这些在Yii教程里面就没讲,唉,不得已又费了脑细胞去研究,得出一些成果。

首先Yii模型是没有自动完成这个功能的,它只有验证validate()。

当我们调用AR模型的save()功能时,会自动调用validate(),紧接着数据就入库了。

现在我表单中获取到密码的字段,我入库前肯定要进行加密啊,还有注册时间字段,也需要自动生成一个时间戳,在手册里我找到一个 

$post->create_time=new CDbExpression('NOW()');

这玩意是数据库里的函数啊,无法做到复杂的逻辑啊!!

怎么办?想啊想,想到了事件功能,我找啊找,打开validate()的源码,发现有两个事件:beforeValidate() afterValidate()。

到这里思路就比较清晰了,我们的目的就是入库前填充或修改一些字段,那么我们从 afterValidate()这个方法入手就行了。

我们发现,这个方式里是有内容的,主要就是触发事件用的,我们这里不那么麻烦去注册事件了,直接在自己的模型类里面重载它,当然不要忘了parent::afterValidate();不然事件钩子就没了。

    //验证前的数据处理
    public function afterValidate(){
        parent::afterValidate();
        $this->password = md5($this->password);
        $this->password1 = md5($this->password1);
        $this->addtime = time();
        $this->expire = time()+86400*3;
        return true;
    }

看,这就是达到了自动完成的效果,最后返回true即可。

共有 人打赏支持
粉丝 141
博文 250
码字总数 86884
评论 (3)
别人说我名字很长
这个吊啊老爱,很实用
~\(≧▽≦)/~
建议在bforesave事件中处理
荒野无灯

引用来自“~\(≧▽≦)/~”的评论

建议在bforesave事件中处理
+1 . 像上面文章中那样用的话,如果定义了一个password max length 是16 ,那么md5后变32位,会导致validate失败.在 beforeSave 中做如上自动完成动作是最好的.
×
吾爱
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: