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
- ・
- ・
- ・
- <link type="text/css" rel="stylesheet" href="<?php echo ROOT_URL ?>css/custom.css">
- ・
- ・
- ・
- <script type="text/javascript">
- var rootUrl = "<?php echo $this->Html->url('/') ?>";
- </script>
- <div id="loading" style="display:none;"><img decoding="async" src="<?php echo ROOT_URL ?>img/wait.gif">
- 処理中・・・・</div>
- ・
- ・
- ・
- <script>
- // PDF出力時に処理中の表示処理 下記xxxxは作成されているコントローラ名を記載ください。
- function LoadingMsg() {
- if(confirm('PDF作成に1から5分程度の時間を要します。本当に実行しますか?')) {
- $("#loading").css("display", "block");
- $.get(rootUrl + "xxxx/ajax_session_save", function (data) {
- var json = $.parseJSON(data);
- if (json.RES == 0) {
- loop();
- } else {
- $("#loading").css("display", "none");
- }
- });
- } else {
- return false;
- }
- }
- // 処理中表示を続けるかを判定する。 下記xxxxは作成されているコントローラ名を記載ください。
- var timerID
- function loop() {
- timerID = setTimeout(loop,1000);
- $.get(rootUrl + "xxxx/ajax_session_get", function (data) {
- var json = $.parseJSON(data);
- if (json.RES == -1) {
- $("#loading").css("display","none");
- clearTimeout(timerID);
- }
- });
- }
- </script>
xxxxController.php
- function detail($id, $step){
- (isset($this->request->data['out'])) {
- $info = PDF出力する情報を取得処理を記述する。
- if (!emptyempty($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 (!emptyempty($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
- ・
- ・
- ・
- <input type="submit" name="out" id="out" value="出力" onclick="LoadingMsg();">
- ・
- ・
- ・
PDF作成処理はこのブログでは触れませんが、
結論から言うとsession_idがDBに保存されている間は、PDF出力処理中になるようにします。
出力ボタンが押下された時点で、本当に実行してよいかを問い、実行してよい場合は、当該のsession_idをDBに追加します。
renderで呼ばれた処理が終了すると、PDF出力が終わったことになり、CAKEPHP2では、
afterFilter()が呼ばれます。そこで、DBから該当のsession_idを消します。
表示VIEWでは、session_idが存在する間、処理中...を表示としておき、
DBからsession_idが削除されれば、処理中...を消すことで完成となります。