关于Model内Setter的验证

初学yii,遇到个一个问题。

我的数据库表里有一个字段repayment_date,是时间戳。

我想通过页面中的RepaymentDateText传递过来的值:2013-04-27,来设定repayment_date。

getter部分已经OK,可以正常获得




        public function getRepaymentDateText()

        {

                if (empty($this->repayment_date)) {

                        return null;

                } else {

                        return date('Y-m-d',$this->repayment_date);

                }

        }



setter部分我是这样写的




        public function setRepaymentDateText($value)

        {

                if(empty($value) || !$value) return false;

                $this->repayment_date = strtotime($value.' 00:00:00');

        }



gii默认在Controller中用$model->attributes=$_POST[’***’],这样自动过滤了POST过来的RepaymentDateText的值




        public function actionUpdate($id)

        {

                $model=$this->loadModel($id);


                // Uncomment the following line if AJAX validation is needed

                // $this->performAjaxValidation($model);


                if(isset($_POST['Blacklist']))

                {

                        $model->attributes=$_POST['Blacklist'];

                        if($model->save())

                                $this->redirect(array('view','id'=>$model->id));

                }


                $this->render('update',array(

                        'model'=>$model,

                ));

        }



我在model的beforeSave里用,如下代码可以激活setRepaymentDateText,但是这样写不是很合适。




$this->RepaymentDateText = $_POST['Blacklist']['RepaymentDateText'];



第一个问题:请问如何该如何处理才比较好?

第二个问题:$_POST[‘Blacklist’][‘RepaymentDateText’]这个值应该如何验证才更加复合yii的规范?写在rules()里?请给个示范代码,谢谢。

好吧,我找到答案了,yii是这样声明的:




	public function rules()

	{

		return array(

			#......

			array('repayment_date_text', 'length', 'max'=>10),

			#......

		);

	}



文档里边说,仅给那些需要批量赋值(massive assignment)的属性添加规则(rules),也就是所谓安全属性(safe attributes)。不能批量赋值的的属性千万不要设定规则。

大概是这么表达的吧。。。