向view传对象 ??? 求助 ???
在控制器中获得一个 $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也这样用的,但是会报错,说是不能在数组中传递对象
有用过的吗?来说下
你的 $user 是怎么得到的,贴代码。 Hex 发表于 2014-2-27 17:28 static/image/common/back.gif
你的 $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框架可能是不支持这样使用
如果CI不支持这样用的话
注意:如果你使用一个对象,那么类变量将转换为数组元素。//手册里提到
那么只有把把数据和结果在Model 或 Control中全部获取完毕
然后转成Array 再传给 View了
这样一来 优点是 View断代码比较简洁
缺点就是 我们写代码要多费一些功夫
这样看来CI是严格MVC 但OOP方面差了点
$query->row() 以后,取出来的就是普通数据了,不是带有方法的对象实例。
也就是说这只是一个对象形式的数据,和关联数组没有本质区别。
另外,你如果直接把模型实例传到视图中,应该也是可以调用的,你可以试试。
Hex 发表于 2014-2-27 18:51 static/image/common/back.gif
$query->row() 以后,取出来的就是普通数据了,不是带有方法的对象实例。
也就是说这只是一个对象形式的数 ...
return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例化
得到的返回的对象 拥有自己的属性和方法 在控制器 这些属性和方法是可以正常调用的 // 这个我测试过
但是很遗憾 该对象无法传到View中去
剑出惊雷 发表于 2014-2-27 20:37 static/image/common/back.gif
return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例 ...
下班后看了一眼,返回的这个对象只有属性,没有方法,在控制器中虽然可以向调用方法那样使用,但是调用的方法其实是实例化的类中的方法,而不是对象的私有方法。
看来CI是不能像ThinkPHP Yii那样使用的
回去认真研究了一下 CI Yii 在这方面的不同:
在CI中比较标准 规范的用法 我个人还是倾向于要一个model对应一个表
如果要关联数据的话 就在controller中做 把数据组合好,然后再传给view中
而在Yii中 因为model的功能实在是很强大,可以说是重model的,我们可以简单的获取对象(当然也可以是对象数据提供器),简简单单render给view一个对象
要获取相关数据的时候 可以直接调用该对象的方法就好了,这个方法在model中早定义好了。
大家要是有疑问的话可以去看看Yii的demo中的用法
说了这么多,大家可能感触不是很大,因为我在做项目的时候遇到复杂的情况(view端需要很多判断)
如果我把这些判断写在model的方法中,在view里面我就能直接调用这个方法,那么这个代码的复用简直是爽歪歪了(这也是重model思想)
就这点而言 Yii确实用着很爽
本帖最后由 幸福糖 于 2014-2-28 09:44 编辑
剑出惊雷 发表于 2014-2-27 23:25 static/image/common/back.gif
回去认真研究了一下 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-27 20:37 static/image/common/back.gif
return $query->row(0, 'User'); // 你注意去手册里 看这个用法
这个意思是用User 类来实例 ...
这里估计是文档写的有问题,我看下 CI 源码吧。
你的想法是直接让 view 和 model 通信,这个在 MVC 架构中是没问题的,不过 CI 并不是这样,CI 的视图就是接收数据并渲染数据,没有其他逻辑。
当然,你可以扩展 CI 让他符合你的想法,因为 CI 简直太容易扩展了,这也是我喜欢 CI 的原因。
页:
[1]
2