CodeIgniter: глобальные переменные в контроллере
Я очень новичок в CodeIgniter, и, пока я продолжаю, я сталкиваюсь с проблемами, которые в процедурной кодировке легко исправить.
Текущая проблема: у меня этот контроллер
class Basic extends Controller {
function index(){
$data['title'] = 'Page Title';
$data['robots'] = 'noindex,nofollow';
$data['css'] = $this->config->item('css');
$data['my_data'] = 'Some chunk of text';
$this->load->view('basic_view', $data);
}
function form(){
$data['title'] = 'Page Title';
$data['robots'] = 'noindex,nofollow';
$data['css'] = $this->config->item('css');
$data['my_other_data'] = 'Another chunk of text';
$this->load->view('form_view', $data);
}
}
Как вы можете видеть, некоторые элементы массива повторяются снова и снова:
$data['title'] = 'Page Title';
$data['robots'] = 'noindex,nofollow';
$data['css'] = $this->config->item('css');
Нет ли способа сделать их "глобальными" в контроллере, чтобы я не вводил их для каждой функции?
Что-то вроде (но это дает мне ошибку):
class Basic extends Controller {
// "global" items in the $data array
$data['title'] = 'Page Title';
$data['robots'] = 'noindex,nofollow';
$data['css'] = $this->config->item('css');
function index(){
$data['my_data'] = 'Some chunk of text';
$this->load->view('basic_view', $data);
}
function form(){
$data['my_other_data'] = 'Another chunk of text';
$this->load->view('form_view', $data);
}
}
Thnaks заранее!
Ответы
Ответ 1
Что вы можете сделать, это сделать "переменные класса", к которым можно получить доступ из любого метода в контроллере. В конструкторе вы устанавливаете эти значения.
class Basic extends Controller {
// "global" items
var $data;
function __construct(){
parent::__construct(); // needed when adding a constructor to a controller
$this->data = array(
'title' => 'Page Title',
'robots' => 'noindex,nofollow',
'css' => $this->config->item('css')
);
// $this->data can be accessed from anywhere in the controller.
}
function index(){
$data = $this->data;
$data['my_data'] = 'Some chunk of text';
$this->load->view('basic_view', $data);
}
function form(){
$data = $this->data;
$data['my_other_data'] = 'Another chunk of text';
$this->load->view('form_view', $data);
}
}
Ответ 2
Вы можете настроить свойство класса с именем data, а затем установить его значения по умолчанию в contructor, который является первым, что запускается при создании нового экземпляра в Basic
.
Затем вы можете ссылаться на него с помощью ключевого слова $this
class Basic extends Controller
{
var $data = array();
public function __construct()
{
parent::__construct();
// load config file if not autoloaded
$this->data['title'] = 'Page Title';
$this->data['robots'] = 'noindex,nofollow';
$this->data['css'] = $this->config->item('css');
}
function index()
{
$this->data['my_data'] = 'Some chunk of text';
$this->load->view('basic_view', $this->data);
}
function form()
{
$this->data['my_data'] = 'Another chunk of text';
$this->load->view('form_view', $this->data);
}
}
Ответ 3
Эй, спасибо, здесь мой снайпер
это глобальная переменная, содержащая представление
/* Location: ./application/core/MY_Controller */
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$this->data = array(
'sidebar' => $this->load->view('sidebar', '' , TRUE),
);
}
}
/* Location: ./application/controllers/start.php */
class Start extends MY_Controller {
function __construct()
{
parent::__construct();
}
public function index()
{
$data = $this->data;
$this->load->view('header');
$this->load->view('start', $data);
$this->load->view('footer');
}
}
Ответ 4
Почему пользователь не помощник?
Файл:
/application/helpers/meta_helper.php
Содержание:
<?php
function meta_data() {
return array("title" => null, "robots" => "noindex, nofollow" );
}
В вашем контроллере:
class Basic extends Controller {
function __construct(){
parent::__construct();
$this->load->helper('meta');
}
function index(){
$data['meta'] = meta_data(); //associate the array on it own key;
//if you want to assign specific value
$data['meta']['title'] = 'My Specific Page Title';
//all other values will be assigned from the helper automatically
$this->load->view('basic_view', $data);
}
И в вашем шаблоне просмотра:
<title><?php $meta['title']; ?></title>
Будет выводиться:
<title>My Specific Page Title</title>
Надеюсь, что это имеет смысл: -)!
Ответ 5
Хотя это было так долго. Это может быть полезно другим, вы можете использовать $this- > load- > vars ($ data); в основном MY_controller, чтобы сделать $data array доступным во всех представлениях.
/* Location: ./application/core/MY_Controller */
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$data['title'] = 'Page Title';
$data['robots'] = 'noindex,nofollow';
$data['css'] = $this->config->item('css');
$this->load->vars($data);
}
}
/* Location: ./application/controllers/start.php */
class Start extends MY_Controller {
function __construct()
{
parent::__construct();
}
public function index()
{
$data['myvar'] = "mystring";
$this->load->view('header');
$this->load->view('start', $data);
$this->load->view('footer');
}
}