3

コントローラー関数を介してアクセスできるグローバル配列が必要です。特定のキーを持つアイテムを追加または削除できます。どうすればいいですか?カスタム コントローラ ' globals.php' を作成し、autoload ライブラリに追加しました。

<?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);
}

しかし、私のクライアントは常に空の配列を取得します。どうすればこれを実現できますか? 助けてください。

4

3 に答える 3

1

こんにちは、このようにOOPを利用してください

// 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);
}

}
于 2013-09-18T17:07:57.290 に答える
1

私が思いついた1つの解決策は、セッションを使用することです。これは使いやすく、ベンチマークを行う必要がある「高速」です。

上記/以下の両方の回答についてコメントしたように、リクエストごとにすべてが「リセット」されるという理由だけで、異なるコントローラーで同じデータを取得する方法はありません。別のコントローラーにアクセスするには、少なくともそのページをリロードする必要があります。(注、AJAX 呼び出しでも新しい要求が作成されます)

セッションはサイズによって制限されていることに注意してください.4kbの制限があります(CodeIgniterはセッションをCookieとして保存します)が、待ってください.DBに保存する方法があります(これを許可するには、構成ファイルに移動して有効にし、$config['sess_use_database'] = TRUE;テーブルを作成します詳細はこちら

答え自体に行きましょう。すべてのコントローラーを拡張しようとしていない場合はそれを行い、次のようにそのcore/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()、セッション自体を完全に理解するのに時間がかかりました。簡単に言えば、既にセッションにあるデータを取得 (ロード) する必要があります。新しいデータを追加するか、一部を削除してから、同じセッション内のすべてのデータを元に戻します ( REWRITE )。


例に行きましょう:

セッションは2次元配列のようなものであることに注意してください(私は4 + 5次元配列を自分で扱っています)

$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 );
}

それだ。

于 2013-09-19T09:31:59.200 に答える