CAKEPHP2で、PDF作成時にその作成している間だけ、処理中...を表示するサンプルを記入します。
まずDBを追加します。
CREATE TABLE IF NOT EXISTS `sessions` (
`session_id` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
custom.css
・
・
・
div#loading {
position : absolute;
top : 20%;
left : 50%;
}
・
・
・
bootstrap.php
・
・
・
define('ROOT_URL', preg_replace('/index\.php/', '', env('SCRIPT_NAME')));
・
・
・
default.ctp
・
・
・
・
・
・
処理中・・・・
・
・
・
xxxxController.php
function detail($id, $step){
if (isset($this->request->data['out'])) {
$info = PDF出力する情報を取得処理を記述する。
if (!empty($info)) {
$this->autoRender = false;
$this->layout = false;
$this->set('info', $info);
$this->render('pdf_out');
} else {
$this->モデル名->invalidate('error', "データがありません。");
$this->autoRender = true;
$this->layout = 'default';
}
}
}
/**
* セッション保存
*
* @note
*/
function ajax_session_save() {
Configure::write('debug', 0);
$this->autoRender = false;
$id = $this->Session->id();
$sql = "INSERT INTO sessions (`session_id`) VALUE (:id);";
$sqlArr['id'] = $id;
$jsonResult = array();
if (false === $this->モデル名->query($sql,$sqlArr)) {
$jsonResult['RES'] = -1;
} else {
$jsonResult['RES'] = 0;
}
echo json_encode($jsonResult);
exit;
}
/**
* セッション確認
*
* @note
*/
function ajax_session_get() {
Configure::write('debug', 0);
$this->autoRender = false;
$id = $this->Session->id();
$sql = "select * from sessions WHERE session_id = :id;";
$sqlArr['id'] = $id;
$jsonResult = array();
$res = $this->モデル名->query($sql,$sqlArr);
if (!empty($res)) {
$jsonResult['RES'] = 0;
} else {
$jsonResult['RES'] = -1;
}
echo json_encode($jsonResult);
exit;
}
/**
* render直後の処理
*
* @note
*/
public function afterFilter() {
$id = $this->Session->id();
$sql = "delete from sessions WHERE session_id = :id;";
$sqlArr['id'] = $id;
$res = $this->モデル名->query($sql,$sqlArr);
}
detail.ctp
・
・
・
・
・
・
PDF作成処理はこのブログでは触れませんが、
結論から言うとsession_idがDBに保存されている間は、PDF出力処理中になるようにします。
出力ボタンが押下された時点で、本当に実行してよいかを問い、実行してよい場合は、当該のsession_idをDBに追加します。
renderで呼ばれた処理が終了すると、PDF出力が終わったことになり、CAKEPHP2では、
afterFilter()が呼ばれます。そこで、DBから該当のsession_idを消します。
表示VIEWでは、session_idが存在する間、処理中...を表示としておき、
DBからsession_idが削除されれば、処理中...を消すことで完成となります。