【问题标题】:Codeigniter Why I can't load view from MY_ControllerCodeigniter 为什么我不能从 MY_Controller 加载视图
【发布时间】:2014-04-06 22:39:47
【问题描述】:

我希望每个控制器都有一个方法_render_page,它加载主模板并传递数据对象。

我的家庭控制器类如下所示:

class Home extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    public function index() {
        $data['title'] = "Site title";
        $data['the_view'] = 'welcome_message';
        $this->_render_page($this->layout, $data);
        //$this->load->view($this->layout, $data);  //This works ok..
    }
}

MY_controller 类:

class MY_Controller extends CI_Controller {

    public $layout;
    public $viewdata;

    public function __construct() {
        parent::__construct();
        $this->layout = 'layout/master_template';
        $this->viewdata = null;
    }

    public function _render_page($view, $data=null, $render=false) {
        $this->viewdata = $data;
        $this->viewdata['the_view'] = $view;
        if($this->ion_auth->logged_in()) {
            $user_obj = $this->ion_auth->user()->row();
            $usr_data['username'] = $user_obj->username;
            $user_obj = null;
            $this->viewdata['usr_data'] = $usr_data;
        }
        $this->load->view($this->layout, $this->viewdata);  //The code crashes here
    }
}

当我浏览到家庭控制器时,我什么也得不到,只是白屏没有错误......

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    找到了解决方案:我以错误的方式调用 _render_page。 而不是这个:

    $this->_render_page($this->layout, $data);
    

    我应该这样称呼:

    $this->_render_page('welcome_message', $data);
    

    当然,这就是这个函数的目的——加载母版页并将视图名称作为 $data 的成员传递,这样母版页就会知道要加载哪个视图。

    【讨论】:

    • 最后你不得不调用方法_render_page()。我就是这么说的!
    • 因为构造函数会被自动调用,进而调用 _render_page() 函数,否则您必须在某个地方手动调用该方法!
    • 是的!仔细阅读我的问题并查看我的“Home”控制器(它扩展了 MY_Controller)......并查看 index 方法。比看看我的回答,你就会知道我做错了什么。
    【解决方案2】:

    看,你需要了解流程, 当您调用您的类 home 时,它​​扩展了 MY_Controller,CI 将查找 MY_Controller,执行 MY_controller 的构造函数,然后 CI 开始执行家庭控制器的构造函数,然后执行家庭控制器的默认方法, 所以为了让它工作,你需要打电话给_render_page()- 改变你的 MY_Controller 喜欢 -

    class MY_Controller extends CI_Controller {
    
        public $layout;
        public $viewdata;
    
        public function __construct() {
            parent::__construct();
            $this->layout = 'layout/master_template';
            $this->viewdata = null;
            $this->_render_page($this->layout, $data=null, $render=false);  // call your method 
    
        }
    
        public function _render_page($view, $data=null, $render=false) {
            $this->viewdata = $data;
            $this->viewdata['the_view'] = $view;
            if($this->ion_auth->logged_in()) {
                $user_obj = $this->ion_auth->user()->row();
                $usr_data['username'] = $user_obj->username;
                $user_obj = null;
                $this->viewdata['usr_data'] = $usr_data;
            }
            $this->load->view($this->layout, $this->viewdata);  //The code crashes here
        }
    }
    

    【讨论】:

    • 它也不起作用。为什么要在父类构造函数中调用render方法?
    • @user568021 如果我错了,请纠正我,但如果您不调用该方法,它将如何执行?
    • @user568021 你一定是在某个地方调用它,也许在子类中
    • 完全正确。查看 Home 控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2023-03-05
    • 1970-01-01
    • 2013-11-23
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多