Codeigniter 3.x - 将 $data 与动态数据一起预加载到所有视图
Codeigniter 3.x - Preload $data to ALL views alongside dynamic data
问题:
出于好奇,我想知道 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 Class 并没有太牵强MY_Controller 调用它而不是 CI_Loader。但是,我不确定这是否可行。
选项 2:
我知道如果您编辑系统文件这是可能的,但我真的不想那样做。因为这使得在更新 CI.
时很难跟踪更改
选项 3:
???
想法?
Edit 澄清一下:这是专门用于将数据加载到 views、扩展 CI_Controller
和设置成员变量的只能从 模型和控制器 不能访问。
Class foo extends CI_controller{
public $_site_settings;
function __construct()
{
$this->_site_settings = $this->config->item('site_settings');
}
}
您可以在自己的控制器中初始化数组 class,然后也附加到该数组:
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);
}
}
谢谢大家的回答!我想通了!
您实际上可以扩展 Codeigniter 的 CI_Loader
Class,这非常酷!
/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"
问题:
出于好奇,我想知道 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 Class 并没有太牵强MY_Controller 调用它而不是 CI_Loader。但是,我不确定这是否可行。
选项 2:
我知道如果您编辑系统文件这是可能的,但我真的不想那样做。因为这使得在更新 CI.
时很难跟踪更改选项 3:
???
想法?
Edit 澄清一下:这是专门用于将数据加载到 views、扩展 CI_Controller
和设置成员变量的只能从 模型和控制器 不能访问。
Class foo extends CI_controller{
public $_site_settings;
function __construct()
{
$this->_site_settings = $this->config->item('site_settings');
}
}
您可以在自己的控制器中初始化数组 class,然后也附加到该数组:
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);
}
}
谢谢大家的回答!我想通了!
您实际上可以扩展 Codeigniter 的 CI_Loader
Class,这非常酷!
/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"