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 и установки переменных-членов доступны ТОЛЬКО модели и контроллеры, а НЕ представления.

Author: acupajoe, 2015-11-20

3 answers

Class foo extends CI_controller{
     public $_site_settings;

     function __construct()
    {
          $this->_site_settings = $this->config->item('site_settings');
    }
}
 1
Author: Kisaragi, 2015-11-19 22:45:51

Вы можете просто инициализировать массив в своем собственном классе контроллера и добавить к нему также:

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);
  }
}
 1
Author: skrilled, 2015-11-19 23:32:59

Спасибо всем вам за ответы! Я все понял!

На самом деле вы можете расширить класс 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"
 1
Author: acupajoe, 2015-11-20 16:19:25