0

嗨,我想向 CI_Controllers 的所有实例添加一个公共变量($this->data[]),这样我就可以存储一些用于输出页面(css/js 等)的基本规则,然后将每个控制器附加到这个数组添加自己的要求(更多的 css/js)。我有一个带有自定义视图函数的核心库,这些函数将这些数组注入到页面模板的 head 标记中。

我想到的选项;

  1. 编辑 CI_Controller 并将其添加到那里......猜测这是一个坏主意。

  2. 创建一个扩展 CI_Controller 的 shell 控制器,将 var 添加到其中,然后让每个其他控制器扩展 shell 控制器。

  3. 还有什么巧妙的方法吗?

我只使用 CI 大约一个月,我已经尝试通读文档,但我找不到任何内置的方法来做这样的事情?以前有没有人遇到过这种情况,如果有,您是如何解决的?

谢谢!

[编辑] 使用 PHP 5.3.x [/编辑]

4

3 回答 3

2

http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html

您可以扩展CI_Controller以拥有您想要的功能。

应用程序/核心/MY_Controller.php:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends CI_Controller {


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

    public function my_function()
    {
        return "Cool return from my_function";

    }
}

控制器/welcome.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends MY_Controller {

    public function index()
    {
        echo $this->my_function();//echo's "Cool return from my_function"
    }
}

您只需定义您想要的功能MY_Controller。然后在您的控制器中,使用extends MY_Controller代替,extends CI_Controller您可以在这些控制器内的任何位置调用函数。

于 2013-03-26T13:44:06.787 回答
1

我认为使用特征可以轻松实现您想要的。在这里检查:PHP:特征

更具体地说 -> 示例 #11 定义属性。

唯一的限制是它是 PHP 5.4+

于 2013-03-26T13:34:50.163 回答
0

您可以创建自己的基本控制器文件来继承 \application\core\MY_Controller.php 中的基本页面加载方法,如下所示:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Controller extends CI_Controller {

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

    protected function loadPage($path, $data = array())
    {
        $this->load->view('common/head'); // Assuming you will use a folder for page parts
        $this->load->view($path, $data);
        $this->load->view('common/foot');
    }
}

之后在您的页面控制器中,您可以更轻松地调用相同的方法:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class User extends MY_Controller {

    public function index()
    {
        $data = array(); // get data from model

        $this->loadPage('user/view', $data); // Assuming you will use folders for sets of views
    }

    public function edit()
    {
        $data = array(); // get data from model

        $this->loadPage('user/edit', $data);
    }
}
于 2016-10-30T08:54:30.527 回答