您的位置:首页 > 编程语言 > PHP开发

Yii数据的流向及处理分析

2014-03-18 15:38 316 查看
1、用户从浏览器输入URL(类似http://localhost/myweb/index.php?r=admin/goods/create

2、admin这个Modules下的goods控制器执行create方法

3、create方法首先调用goods Model($model=new Goods()),然后render一个form视图。

4、视图调用后,显示表单给用户,用户输入相应的值,提交上来。

5、提交上来的数据同样是提交到admin/goods/create,这时,$_POST就不再为空了,执行一段入代码,将提交上来的save()进数据库,然后跟转到一个视图。

这时候,如果我们想将提交上来的数据,经过处理后再保存到数据库:

if(isset($_POST['TblGoods'])){
//YII默认把所接收的值一次性分配给model里属性。
$model->attributes=$_POST['TblGoods'];
//在这之后,save()之前,我们可能将$model->attributes的数据处理后,再save进去。
//在这可以直接使用$model->属性值   的形式
//yii checkBoxList 的高级使用
//将checkBoxList提交的数据,转换成字符串后再保存到数据库中。
//获取颜色数组后将数组转换成字符串,用豆号分隔。并保存到数据库中。
if(!empty($_POST['TblGoods']['goods_color'])){
//将表单数据处理
$str_color=  implode(',', $_POST['TblGoods']['goods_color']);
//处理后再保存进属性里
$model->goods_color=$str_color;
}
//获取颜色数组后将数组转换成字符串,用豆号分隔。并保存到数据库中。
if(!empty($_POST['TblGoods']['goods_size'])){
$str_size=  implode(',', $_POST['TblGoods']['goods_size']);
$model->goods_size=$str_size;
}
//处理完后,再保存进去
if($model->save())
$this->redirect(array('view','id'=>$model->goods_id));
}


以上是针对增加数据行的操作。

 

针对修改数据的操作(重点)

1、用户点击修改按钮后,把要修改的ID号从URL上提交过去。

2、admin/goods/update接收到ID后,根据该ID创建了一个模型

3、该模型从数据库中将该ID对应的数据据取出来,保存在模型当中。

这时候,重要的搂据操作,将在render一个视图之前了。在render视图前,我们可以将该模型的数据处理后,再展现到视图中。

以下便是一个很好的用法。

public function actionUpdate($id){
$model=$this->loadModel($id);
//yii checkBoxList 的高级使用
//如果数据库颜色存在颜色数据,先将数据读取出来,转换成数组后,再赋值给$model->goods_color
//这时候,在视图那边的checkBoxList将会显示从数据库中存在的值了。
if(!empty($model->goods_color)){
$color=$model->goods_color;
$arr_color= explode(',', $color);
$model->goods_color=$arr_color;
}
//如果数据库颜色存在尺寸数据,先将数据读取出来,转换成数组后,再赋值给$model->goods_size
//这时候,在视图那边的checkBoxList将会显示从数据库中存在的值了。
if(!empty($model->goods_size)){
$size=$model->goods_size;
$arr_size= explode(',', $size);
$model->goods_size=$arr_size;
}

if(isset($_POST['TblGoods']))
{
$model->attributes=$_POST['TblGoods'];

//获取颜色数组后将数组转换成字符串,用豆号分隔。并保存到数据库中。
if(!empty($_POST['TblGoods']['goods_color'])){
$str_color=  implode(',', $_POST['TblGoods']['goods_color']);
$model->goods_color=$str_color;
}
//获取颜色数组后将数组转换成字符串,用豆号分隔。并保存到数据库中。
if(!empty($_POST['TblGoods']['goods_size'])){
$str_size=  implode(',', $_POST['TblGoods']['goods_size']);
$model->goods_size=$str_size;
}
if($model->save())
$this->redirect(array('view','id'=>$model->goods_id));
//在render之前,先将数据处理,再调用视图
$this->render('update',array(
'model'=>$model,
));
}


原来的时候goods_color表对应的字段是varchar(32),并不能保存数组,数据经过转换成字符串后,保存到goods_color中了,取出时,是字符串,goods_color被分配到视图时,也会以字符串的形式展示数据,这不符合checkBoxList的要求。所以,可以在这里把处理成goods_color对应的1,3,6形式的数据,处理成array()后,强制性保存到$model->goods_color中,这里,goods_color就变成是数组了。

4、数据显示到视图后,用户修改后,提交,同样是提交到admin/goods/update

5、admin/goods/update这时的$_POST就不为空了,这时,再执行跟create一样的入库存操作。

 

由此可见,新增数据时,处理的重点在save()之前,修改数据时,重点在render()之前。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: