Codeigniter 3.x - Предварительная загрузка $данных во ВСЕ представления вместе с динамическими данными
Вопрос:
Из любопытства мне интересно, предоставляет ли 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
и установки переменных-членов доступны ТОЛЬКО модели и контроллеры, а НЕ представления.
3 answers
Class foo extends CI_controller{
public $_site_settings;
function __construct()
{
$this->_site_settings = $this->config->item('site_settings');
}
}
Вы можете просто инициализировать массив в своем собственном классе контроллера и добавить к нему также:
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
, что довольно круто!
/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"