2013-09-18 4 views
3

Я хочу глобальный массив, к которому я могу получить доступ через функции контроллера, они могут либо добавлять, либо удалять любой элемент с определенным ключом. Как мне это сделать? Я сделал свой пользовательский контроллер «globals.php» и добавил его в библиотеку автозагрузки.Динамический глобальный массив в codeigniter

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
    $notification_array = array(); 
    $config['notification'] = $notification_array; 
?> 

Следующая функция на контроллере следует добавить новый элемент в мой массив

function add_data(){ 
    array_unshift($this->config->item('notification'), "sample-data"); 
} 

после add_data добавляет к глобальному массиву, когда следующая функция вызывается из клиента, он должен предоставить обновленный массив клиенту ,

function send_json() 
{ 
    header('content-type: application/json'); 
    $target = $this->config->item('notification'); 
    echo json_encode($target); 
} 

Но мой клиент всегда получает пустой массив. Как я могу это сделать? Пожалуйста помоги.

+3

, пожалуйста, забудьте о глобальных переменных, вы в OOP расширьте свой класс контроллера и объявите свою «глобальную переменную» там, вы можете получить его от любого контроллера, который его расширяет. Учебник [здесь] (http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY). – Kyslik

+1

Нет проблем, если у вас возникли проблемы с этим комментарием здесь. – Kyslik

+0

Ну, я сделал массив глобальным, но, похоже, я не могу добавить еще один элемент. Я пробовал $ this-> global_array ['mykey'] = "Ashok"; on add_data(), но когда я показываю global_array, у меня нет этого нового элемента. –

ответ

0

Вы можете добавить «глобальный» массив для каждого контроллера.

В верхней части контроллера:

public $notification_array = array(); 

Тогда для доступа к нему внутри различных функций, которые вы будете использовать:

$this->notification_array; 

Так что, если вы хотите добавить в нее элементы, вы могли бы сделать :

$this->notification_array['notification'] = "Something"; 
$this->notification_array['another'] = "Something Else"; 
+0

Правильный ответ. Я думаю, что ему нужен только один контроллер + данные, потому что, если он использует «MY_Controller», который расширяет его все контроллеры, собираются получать одинаковые данные (в разных контроллерах), просто потому, что каждый раз, когда контроллер называется массивом по умолчанию, начинается с начала. Ему нужно некоторое устойчивое решение, такое как сеанс/файлы cookie/файлы/база данных. – Kyslik

1

Привет воспользоваться объектно-ориентированного программирования, как этот

// помещаем MY_Controller.php в директории ядра

class MY_Controller extends CI_Controller{ 

    public $global_array = array('key1'=>'Value one','key2'=>'Value2'): 

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

} 

// страница контроллер

class Page extends MY_Controller{ 

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

function send_json() 
{ 
    header('content-type: application/json'); 
    $target = $this->global_array['key1']; 
    echo json_encode($target); 
} 

} 
+0

Я могу получить доступ к $ global_array, но как добавить к нему другой элемент из функции add_data, чтобы значение было постоянным и к нему можно было получить в любое время позже с помощью функции send_json? –

+0

, если вы вызываете add_data с помощью send_json, тогда он будет постоянным, потому что при каждом вызове контроллера вы получите только значения по умолчанию. – umefarooq

+0

Ну, я не могу этого сделать, есть и другие функции, которые могут изменить массив. send_json должен отправить последний массив, а не по умолчанию. как это возможно?? –

1

Одно решение, которое я придумал, чтобы использовать сессии, его легко использовать и его «быстро» Вас необходимо выполнить некоторый бенчмаркинг.

Поскольку я прокомментировал оба ответа выше/ниже, вы не можете получать одинаковые данные в разных контроллерах только потому, что каждый запрос «перезагружается», а для доступа к другому контроллеру вам необходимо хотя бы перезагрузить страницу. (обратите внимание, что даже вызов AJAX делает новый запрос)

Обратите внимание, что сеансы ограничены размером, у вас есть ограничение на 4 КБ (CodeIgniter хранит сеанс как Cookie), но подождите, есть способ, хранить их в БД (чтобы разрешить это идет в конфигурационный файл и включите его $config['sess_use_database'] = TRUE; + создать таблицу вы найдете более here)

Ну позволяет добраться до самого ответа, как я понимаю, вы не пытались extending всех контроллеров, если не сделать это и поместить некоторый код в том, что ядро/MY_Controller.php файл следующим образом:

private function _initJSONSession() { //this function should be run in MY_Controller construct() after succesful login, $this->_initJSONSession(); //ignore return values 

    $json_session_data = $this->session->userdata('json'); 

    if (empty($json_session_data)) { 

    $json_session_data['json'] = array(); //your default array if no session json exists, 
              //you can also have an array inside if you like 

     $this->session->set_userdata($ses_data); 
     return TRUE; //returns TRUE so you know session is created 
    } 

return FALSE; //returns FALSE so you know session is already created 

} 

вам также нужны эти несколько функций, которые они сами объясняют, все они являются общедоступными, поэтому вы можете использовать их в любом контроллере, который расширяется MY_Controller.PHP, как этот

$this->_existsSession('json');

public function _existsSession($session_name) { 

    $ses_data = $this->session->userdata($session_name); 

    if (empty($ses_data)) return FALSE; 

    return TRUE; 

} 

public function _clearSession($session_name) { 

    $this->session->unset_userdata($session_name); 

} 

public function _loadSession($session_name) { 

    return (($this->_existsSession($session_name)) ? $this->session->userdata($session_name) : FALSE); 

} 

самая интересная функция _loadSession(), ее вид сам explainatory мне потребовалось некоторое время, чтобы полностью понять саму сессию, а в нескольких словах, которые вы должны получить (нагрузка), которые уже находятся в сеансе, что-то с ним делать ([CRUD], например, добавлять новые данные или удалять некоторые), а затем возвращать все данные в тот же сеанс (REWRITE).


Едем к примеру:

иметь в виду, что сессии, как 2d массив (я работаю с 4 + 5d массивов сам)

$session['session_name'] = 'value';

$session['json'] = array('id' => '1', 'name' => 'asok', 'some_array' => array('array_in_array' => array()), 'etcetera' => '...'); 

так, чтобы написать новый (переписать) предмет в сеансе вы используете

{ 
    $session_name = 'json'; 

    $session_data[$session_name] = $this->_loadSession($session_name); 

    //manipulate with array as you wish here, keep in mind that your variable is 
    $session_data[$session_name]['id'] = '2'; // also keep in mind all session variables are (string) type even (boolean) TRUE translates to '1' 

    //or create new index 
    $session_data[$session_name]['new_index'] = FALSE; // this retypes to (string) '0' 

    //now put session in place 

    $this->session->set_userdata($session_data); 

} 

, если вы хотите использовать свою собственную функцию add_data() вам нужно сделать, это

  1. хорошо вам нужно передать некоторые данные, для его первого add_data($arr = array(), $data = ''){}

например: array_unshift($arr, $data);

{ 
    //your default array that is set to _initJSONSession() is just pure empty array(); 

    $session_name = 'json';   
    $session_data[$session_name] = $this->_loadSession($session_name); 

    // to demonstrate I use native PHP function instead of yours add_data() 
    array_unshift($session_data[$session_name], 'sample-data'); 

    $this->session->set_userdata($session_data); 
    unset($session_data); 
} 

Это это.

Смежные вопросы