2

问题:

出于好奇,我想知道 Codeigniter 是否提供了一种将特定数据始终加载到视图中的方法。

例如:我有一个配置文件,其中包含有利于访问所有页面的视图内部的站点信息,而不是每次加载视图时都必须调用加载该数据,我是否可以始终包含它?


<?php
    //Standard way
    function index() {

        $this->load->config('site_settings', true);
        $data['config'] = $this->config->item('site_settings');
        $data['fizz'] = 'buzz';

        $this->load->view('index', $data);
    }

    //Way I'd like to see
    function index() {
        $data['foo'] = 'bar';
        $this->load->view('index', $data); //$data already includes $data['config']
    }
?>

选项1:

某种 MY_Loader 扩展 - 我们已经有一个 MY_Controller,所以做一个 MY_Loader 类并让 MY_Controller 调用它而不是 CI_Loader 不会太牵强。但是,我不确定这是可能的。

选项 2:

我知道如果您编辑系统文件,这是可能的,但我真的不希望这样做。因为这使得更新 CI 时很难跟踪更改。

选项 3:

???


想法?

编辑澄清:这专门用于将数据加载到视图中,扩展CI_Controller和设置成员变量,只能从模型和控制器访问,而不是视图。

4

3 回答 3

1
Class foo extends CI_controller{
     public $_site_settings;

     function __construct()
    {
          $this->_site_settings = $this->config->item('site_settings');
    }
}
于 2015-11-19T22:39:58.660 回答
1

您可以在自己的控制器类中初始化数组,并附加到该数组:

Class MY_Controller extends CI_Controller {
    private $data = array();    
    function __construct()
    {
          parent::__construct();
          $this->data['config'] = $this->config->item('site_settings');
    }
}

然后:

Class foo extends MY_Controller {
 function index() {
    $this->data['fizz'] = 'buzz';
    $this->load->view('index', $this->data);
  }
}
于 2015-11-19T23:32:59.097 回答
1

谢谢大家的回答!我想到了!

您实际上可以扩展 Codeigniter 的CI_Loader类,这非常酷!

/application/core/MY_Loader.php

class MY_Loader extends CI_Loader
{
    protected $data;

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

    public function preload($data = array())
    {
        $this->data = $data;
    }

    public function view($view, $vars = array(), $return = FALSE)
    {
        array_merge($vars, $this->data);
        return parent::view($view, $vars, $return);
    }
}

用法:

/application/core/MY_Controller.php

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        //Load CI In
        parent::__construct();
        $this->load->preload(array('foo' => 'bar'));
    }
}

/application/controllers/Controller.php

class Controller extends MY_Controller
{

    public function __construct()
    {
        parent::__construct(); // !!IMPORTANT
    }

    public function index() 
    {
        $this->load->view('index', array('fizz' => 'buzz'));
    }
}

/application/views/index.php

<?php var_dump($foo, $fizz); ?>

输出:

"bar"
"buzz"
于 2015-11-19T23:38:07.827 回答