现在的位置: 首页 > 综合 > 正文

codeigniter视图中调用控制器中的方法

2013年12月06日 ⁄ 综合 ⁄ 共 968字 ⁄ 字号 评论关闭

学过asp.net的同学,一定会对在页面中直接调用this的方法有点儿情有独钟……
但是由那个迁移到CI框架发现在试图里的$this找不到对象了……今天解决这个问题。
首先分析CI的视图渲染原理,
每个控制器都有一个loader对象,名为load,调用loader的view方法,来渲染视图文件,同时向视图文件中传递变量……
我们找不到的变量$this应该也是这个时候被传进去,这样的话解决思路也就有了吧!
因为CI是支持重写核心类的,我们就重新loader的view方法,将当前的控制器传进去。
但是,查看一下loader对象的代码发现其中根本没有当前的控制器对象,恼人……
这样我们就得在初始化load对象的时候给他一个字段了,也就是代表当前的控制器吧!
我是把他放到控制器的构造函数中了,那个时候loader对象已经被初始化了,只要把当前的控制器对象传进去就好,
大概是这样的代码:
$this->load->controller = $this;

当时每个都这么写,感觉有点儿不爽吧!改动一下,写一个父控制器,构造函数中传递当前控制器,由子类传递吧!

class MY_Controller extends CI_Controller {
    public function __construct($controller) {
        $this->load->controller = $controller;
    }
 
}

这样每一个控制器的代码应该是这样的:

class Sample extends MY_Controller {
     public function __construct(){
          parent::__construct($this);
     }
}

重写的loader部分方法是这样的:

class MY_Loader extends CI_Loader {
       public function view($view, $vars = array(), $return = FALSE) {
                     $view = $this->controllerName . '/' . $view;
                     $vars["cself"] = $this->controller;
                     return parent::view($view, $vars , $return);
      }
}

这样在视图中就多了$cself对象,为了和self区分,所以用了这个名字……
在视图中$cself这个东西就代表了当前的控制器.

抱歉!评论已关闭.