用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2973|回复: 13
收起左侧

[HELP] 向view传对象 ??? 求助 ???

[复制链接]
发表于 2014-2-27 12:31:57 | 显示全部楼层 |阅读模式
在控制器中获得一个 $user 对象传到 view中

Controller:

$data['user'] = $user; // $user 是通过Active Record 获取的对象 有自己的属性和方法
$this->load->view('view', $data);
~

View:
~
echo $user->user_name; // 属性
echo $user->is_student(); // 方法
~
在View中这样使用
在Yii 和 ThinkPHP框架中都是可以使用的
---------------------------------------------------------------------------------------------------------
本来打算在codeiginiter也这样用的,但是会报错,说是不能在数组中传递对象

有用过的吗?来说下


发表于 2014-2-27 17:28:37 | 显示全部楼层
你的 $user 是怎么得到的,贴代码。
 楼主| 发表于 2014-2-27 18:23:47 | 显示全部楼层
Hex 发表于 2014-2-27 17:28
你的 $user 是怎么得到的,贴代码。

就是通过Active Record 模式得到的

Model:
~
$query = $this->db->get_where('News', array('id' => $id));
return $query->row(0, 'User');
~

Control:
~
$data['user'] = $user // 通过上述Model返回的 对象
$this->load->view('view', $data);
~

View:
~
echo $user->name;
echo $user->is_student();
~
-------------------------------------------------------------------------------------------------------------------------
手册视图部分有下面一段话:
注意:如果你使用一个对象,那么类变量将转换为数组元素。

我看CI框架可能是不支持这样使用







 楼主| 发表于 2014-2-27 18:28:09 | 显示全部楼层
如果CI不支持这样用的话
注意:如果你使用一个对象,那么类变量将转换为数组元素。//  手册里提到
那么只有把把数据和结果在Model 或 Control中全部获取完毕
然后转成Array 再传给 View了
这样一来 优点是 View断代码比较简洁
缺点就是 我们写代码要多费一些功夫

这样看来CI是严格MVC 但OOP方面差了点
发表于 2014-2-27 18:51:31 | 显示全部楼层
$query->row() 以后,取出来的就是普通数据了,不是带有方法的对象实例。
也就是说这只是一个对象形式的数据,和关联数组没有本质区别。

另外,你如果直接把模型实例传到视图中,应该也是可以调用的,你可以试试。
 楼主| 发表于 2014-2-27 20:37:35 | 显示全部楼层
Hex 发表于 2014-2-27 18:51
$query->row() 以后,取出来的就是普通数据了,不是带有方法的对象实例。
也就是说这只是一个对象形式的数 ...

return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例化
得到的返回的对象 拥有自己的属性和方法 在控制器 这些属性和方法是可以正常调用的 // 这个我测试过

但是很遗憾 该对象无法传到View中去  


 楼主| 发表于 2014-2-27 22:53:53 | 显示全部楼层
剑出惊雷 发表于 2014-2-27 20:37
return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例 ...

下班后看了一眼,返回的这个对象只有属性,没有方法,在控制器中虽然可以向调用方法那样使用,但是调用的方法其实是实例化的类中的方法,而不是对象的私有方法。

看来CI是不能像ThinkPHP Yii那样使用的

 楼主| 发表于 2014-2-27 23:25:06 | 显示全部楼层
回去认真研究了一下 CI Yii 在这方面的不同:

在CI中比较标准 规范的用法 我个人还是倾向于要一个model对应一个表
如果要关联数据的话 就在controller中做 把数据组合好,然后再传给view中

而在Yii中 因为model的功能实在是很强大,可以说是重model的,我们可以简单的获取对象(当然也可以是对象数据提供器),简简单单render给view一个对象
要获取相关数据的时候 可以直接调用该对象的方法就好了,这个方法在model中早定义好了。
大家要是有疑问的话可以去看看Yii的demo中的用法

说了这么多,大家可能感触不是很大,因为我在做项目的时候遇到复杂的情况(view端需要很多判断)
如果我把这些判断写在model的方法中,在view里面我就能直接调用这个方法,那么这个代码的复用简直是爽歪歪了(这也是重model思想)

就这点而言 Yii确实用着很爽

发表于 2014-2-28 09:40:18 | 显示全部楼层
本帖最后由 幸福糖 于 2014-2-28 09:44 编辑
剑出惊雷 发表于 2014-2-27 23:25
回去认真研究了一下 CI Yii 在这方面的不同:

在CI中比较标准 规范的用法 我个人还是倾向于要一个model对 ...

"说了这么多,大家可能感触不是很大,因为我在做项目的时候遇到复杂的情况(view端需要很多判断)
如果我把这些判断写在model的方法中,在view里面我就能直接调用这个方法,那么这个代码的复用简直是爽歪歪了(这也是重model思想)"

额,没看明白你的问题是什么,不过你上面的这段话我感觉是要将model类分配到view中,然后在view中能调用model中的方法么?这样是可以的吧。
如:在控制器中加载model :$this->load->model("front/single","getsing");      
       在控制器中调用model中的方法:$this->getsing->getsingle();
       再把model对象分配到视图中:$this->load->view("orderformhotel",array(           
                                                                                                         "c"=>$this->getsing->c,
                                                                                                         "d"=>$this->getsing->d,
                                                                                                         "e"=>$this->getsing
                                                                                    ));

       其实吧,这里的属性c,和属性d都是对象,在model 中 我的属性c 和d 分别是:
       $this->c=new Orderhotel();
       $this->d=$this->c->setandget($this->sendstrint,$this->sendstring,$this->sendintkey,$this->sendintval);
       setandget()方法返回的也是一个对象。
       恩,也许我没看明白吧,你的开始是要把从mysql中查询获得对象分配给view中,但是分配失败了,是这样的么?恩,这个我也不太了解,但是CI是可以给view分配对象的。
发表于 2014-2-28 10:34:02 | 显示全部楼层
剑出惊雷 发表于 2014-2-27 20:37
return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例 ...

这里估计是文档写的有问题,我看下 CI 源码吧。

你的想法是直接让 view 和 model 通信,这个在 MVC 架构中是没问题的,不过 CI 并不是这样,CI 的视图就是接收数据并渲染数据,没有其他逻辑。

当然,你可以扩展 CI 让他符合你的想法,因为 CI 简直太容易扩展了,这也是我喜欢 CI 的原因。

本版积分规则