user icon

RoudcubeプラグインでAjaxする

RoudcubeプラグインでAjaxする方法を紹介します。

サーバ側:

rc = rcmail::get_instance();

$this->add_texts('localization/');
$this->register_task('ajax_sample');

if($this->rc->task == 'ajax_sample'){
$this->register_action('index', array($this, 'action'));
$this->register_action('get_data', array($this, 'action'));
}else{
$this->add_button(array(
'command' => 'ajax_sample',
'label' => 'ajax_sample.title'
), 'taskbar');
}
}

public function action(){
//画面表示
if($this->rc->action === 'index'){

$this->include_script('ajax_sample.js');
$this->rc->output->send('ajax_sample.ajax_sample');

//ajax
}else if($this->rc->action === 'get_data'){

error_log(get_input_value('data', RCUBE_INPUT_POST));
$this->rc->output->command('plugin.get_data', array('data' => 'test'));

}
}

}

クライアント側:

var get_data_call_back = function(response){
console.log(response.data);
}

if (window.rcmail) {
rcmail.addEventListener('init', function() {
rcmail.addEventListener('plugin.get_data', get_data_call_back);
rcmail.enable_command('get_data', true);
});
}

rcube_webmail.prototype.get_data = function()
{
rcmail.http_post('get_data',{"data":'test'});
}

①コールバックの登録
  クライアント側のrcmail.addEventListener(‘plugin.get_data’, get_data_call_back);の
  第一引数と
  サーバ側の$this->rc->output->command(‘plugin.get_data’, array(‘data’ => ‘test’));の
  第一引数を
  一致させる必要があります。

  この際に’plugin.’という文字を前につける必要があります。
  なぜなら/roundcuberoot/program/include/rcube_json_output.phpの
  141行目が次のようになっています。

    public function command()
    {
        $cmd = func_get_args();

        if (strpos($cmd[0], 'plugin.') === 0)
          $this->callbacks[] = $cmd;
        else
          $this->commands[] = $cmd;
    }

  ここでcallbacksに登録されないため

  /roundcuberoot/program/js/app.src.jsの6041行目

    // execute callback functions of plugins
    if (response.callbacks && response.callbacks.length) {
      for (var i=0; i < response.callbacks.length; i++)
        this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
    }

  この部分のコールバックとして実行されません。

②ポストするデータ
  rcmail.http_post('get_data',{"data":'test'});の第二引数で指定します。

③サーバから返すデータ
  $this->rc->output->command('plugin.get_data', array('data' => 'test'));の第二引数で指定します。

Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)