无法从 CodeIgniter HMVC 中的库加载模块

Can't load modules from libraries in CodeIgniter HMVC

我在 CodeIgniter HMVC 的 template 库中加载模块时遇到问题。我想在模板库中加载模块的原因是我希望在我的模板中使用侧框和其他内容框的模块。

PS: 我也在为 CodeIgniter 使用 Smarty 模板解析系统,但我怀疑它与错误有什么关系,但如果您有理由不相信,请告诉我。

我尝试做的事情

我尝试以两种不同的方式加载模块,但都出现了相同的错误。

错误

A PHP Error was encountered

Severity: Notice

Message: Undefined Property CI::$template

File: MX/Loader.php

Line Number: 141

-

A PHP Error was encountered

Severity: Notice

Message: Undefined Property CI::$template

Filename: MX/Controller.php

Line number: 57

-

Fatal error: Call to a member function load_content() on a non-object in E:\Xampp\htdocs\firecms\application\modules\sidebar_login_box\controllers\sidebar_login_box.php on line 7

未定义的 "load_content()" 函数将在下面进一步解释(在 Sidebar Controller 中)。

错误行

MX/Loader

/*Line 140*/if (isset($this->_ci_classes[$class]) AND $_alias = $this->_ci_classes[$class])
/*Line 141*/        return CI::$APP->$_alias;

MX/Controller

/*Line 56*/public function __get($class) {
/*Line 57*/        return CI::$APP->$class;

我是如何尝试加载模块的

这是我的第一次尝试(加载文件并实例化它的类):

class Template {
//[...]
public function load_sidebars()
{
    $sidebars = $this->CI->cms_model->get_sidebars();

    foreach ($sidebars as $sidebar)
    {
        if (trim($sidebar["content"]) == "")
        {
            //An example of sidebar module name is "sidebar:login_box"
            //The function below changes the name to "sidebar_login_box" (the
            //module's folder and controller name.
            $module = str_replace(':', '_', $sidebar["module"]);
            $file_path = APPPATH.'modules/'.$module.'/controllers/'.$module.'.php';
            require_once $file_path;
            $class = ucfirst($module);
            $object = new $class();
            $module_data = $object->index();
            $this->_section_data["sidebars"][]["content"] = $module_data;
        }
        else
        {
            $this->_section_data["sidebars"][]["content"] = $sidebar["content"];
        }
    }
}
//[...] 
}

这是我的第二次尝试(使用加载器功能):

public function load_sidebars()
{
    $sidebars = $this->CI->cms_model->get_sidebars();

    foreach ($sidebars as $sidebar)
    {
        if (trim($sidebar["content"]) == "")
        {
            $module = str_replace(':', '_', $sidebar["module"]);
            $this->CI->load->module($module);
            $module_data = $this->CI->$module->index();
            $this->_section_data["sidebars"][]["content"] = $module_data;
        }
        else
        {
            $this->_section_data["sidebars"][]["content"] = $sidebar["content"];
        }
    }
}

边栏控制器

边栏控制器是这样的:

class Sidebar_login_box extends Fire_Controller {
public function index()
{
    $view_data = array();
    //The load_content function in the template library is used to parse template files
    //and return them as a string.
    return $this->template->load_content("login_box", $view_data);
}

}

消防员

Fire_Controller是我的核心控制器。我的核心类的前缀是 Fire_ 而不是 MY_。

这是消防控制器的样子:

class Fire_Controller extends MX_Controller {
public function __construct()
{
    parent::__construct();

    //Load configurations from the database.
    $this->config->load_db_configs();

    //Set the timezone.
    date_default_timezone_set(config_item("timezone"));

    //Loads the form validation library.
    $this->load->library("form_validation");
    //Reset the Form Validation CI Object (to fix problems with HMVC CI).
    $this->form_validation->CI =& $this;

    //To reduce load time, the template library will not be loaded in ajax
    //requests.
    if ( ! $this->input->is_ajax_request())
    {
        $this->load->library("template");
    }

    //Force access via SSL connection (HTTPS) if necessary.        
    if ((int)config_item('force_https') === 1)
    {
        force_https();
    }
}

注意:这是我最近的一个项目,这意味着该框架和所有第三方扩展都是截至 2015 年 1 月 6 日的最新稳定版本。

感谢您的宝贵时间,

此致。

您需要先加载库,然后才能在边栏控制器中使用它。它不是从父级传递的。试试这个:

class Sidebar_login_box extends Fire_Controller {
    public function index()
    {
        $view_data = array();

        $this->load->library('template');

        //The load_content function in the template library is used to parse template files
        //and return them as a string.
        return $this->template->load_content("login_box", $view_data);
    }
}

干杯!

固定。

侧边栏是从 set_defaults() 方法加载的,该方法由我的模板库中的构造方法调用。由于它没有完全加载,模板对象没有保存在 CI 的超级对象中,因此无法访问并在侧边栏模块中抛出错误。

我已将 set_defaults() 调用移动到模板库的 render_page() 函数(由模块的控制器调用),现在它运行良好。

太糟糕了,我在找到解决方案前几个小时就添加了赏金,呵呵。