Posted on

PDF出力で時間がかかる場合に「処理中...」表示する

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が削除されれば、処理中...を消すことで完成となります。