source: branches/version-2_12-dev/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php @ 21684

Revision 21684, 18.0 KB checked in by Seasoft, 9 years ago (diff)

#1613 (typo修正・ソース整形・ソースコメントの改善)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
26
27/**
28 * CSV 出力項目設定(高度な設定)のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_Contents_CsvSql extends LC_Page_Admin_Ex {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'contents/csv_sql.tpl';
47        $this->tpl_subno = 'csv';
48        $this->tpl_subno_csv = 'csv_sql';
49        $this->tpl_mainno = 'contents';
50        $this->tpl_maintitle = 'コンテンツ管理';
51        $this->tpl_subtitle = 'CSV出力設定';
52    }
53
54    /**
55     * Page のプロセス.
56     *
57     * @return void
58     */
59    function process() {
60        $this->action();
61        $this->sendResponse();
62    }
63
64    /**
65     * Page のアクション.
66     *
67     * @return void
68     */
69    function action() {
70        // フックポイント.
71        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
72        $objPlugin->doAction('lc_page_admin_contents_csvsql_action_start', array($this));
73
74        // パラメーター管理クラス
75        $objFormParam = new SC_FormParam_Ex();
76        // パラメーター設定
77        $this->lfInitParam($objFormParam);
78        $objFormParam->setParam($_POST);
79        $objFormParam->setParam($_GET);
80        $objFormParam->convParam();
81        $this->arrForm = $objFormParam->getHashArray();
82        switch ($this->getMode()) {
83            // データの登録
84            case 'confirm':
85                $this->arrErr = $this->lfCheckConfirmError($objFormParam);
86                if (SC_Utils_Ex::isBlank($this->arrErr)) {
87                    // データの更新
88                    $this->arrForm['sql_id'] = $this->lfUpdData($objFormParam->getValue('sql_id'), $objFormParam->getDbArray());
89                    // 完了メッセージ表示
90                    $this->tpl_onload = "alert('登録が完了しました。');";
91                }
92                break;
93            // 確認画面
94            case 'preview':
95                $this->arrErr = $this->lfCheckPreviewError($objFormParam);
96                if (SC_Utils_Ex::isBlank($this->arrErr)) {
97                    $this->sqlerr = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
98                }
99                $this->setTemplate('contents/csv_sql_view.tpl');
100
101                // フックポイント.
102                $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
103                $objPlugin->doAction('lc_page_admin_contents_csvsql_action_preview', array($this));
104                return;
105
106            // 新規作成
107            case 'new_page':
108                // フックポイント.
109                $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
110                $objPlugin->doAction('lc_page_admin_contents_csvsql_action_new_page', array($this));
111
112                // リロード
113                SC_Response_Ex::reload();
114                break;
115            // データ削除
116            case 'delete':
117                $this->arrErr = $this->lfCheckDeleteError($objFormParam);
118                if (SC_Utils_Ex::isBlank($this->arrErr)) {
119                    $this->lfDelData($objFormParam->getValue('sql_id'));
120
121                    // フックポイント.
122                    $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
123                    $objPlugin->doAction('lc_page_admin_contents_csvsql_action_delete', array($this));
124
125                    SC_Response_Ex::reload();
126                    exit;
127                }
128                break;
129            // CSV出力
130            case 'csv_output':
131                $this->arrErr = $this->lfCheckOutputError($objFormParam);
132                if (SC_Utils_Ex::isBlank($this->arrErr)) {
133                    // フックポイント.
134                    $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
135                    $objPlugin->doAction('lc_page_admin_contents_csvsql_action_csv_output', array($this));
136
137                    $this->lfDoCsvOutput($objFormParam->getValue('csv_output_id'));
138                    exit;
139                }
140                break;
141            default:
142                $this->arrErr = $objFormParam->checkError();
143                if (SC_Utils_Ex::isBlank($this->arrErr)) {
144                    // 設定内容を取得する
145                    $this->arrForm = $this->lfGetSqlData($objFormParam);
146                    // カラム一覧を取得する
147                    $this->arrColList = $this->lfGetColList($objFormParam->getValue('select_table'));
148                }
149                break;
150        }
151
152        // 登録済みSQL一覧取得
153        $this->arrSqlList = $this->lfGetSqlList();
154        // テーブル一覧を取得する
155        $this->arrTableList = $this->lfGetTableList();
156
157        // フックポイント.
158        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
159        $objPlugin->doAction('lc_page_admin_contents_csvsql_action_end', array($this));
160    }
161
162    /**
163     * パラメーター情報の初期化
164     *
165     * @param array $objFormParam フォームパラメータークラス
166     * @return void
167     */
168    function lfInitParam(&$objFormParam) {
169        $objFormParam->addParam('SQL ID', 'sql_id', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'));
170        $objFormParam->addParam('CSV出力対象SQL ID', 'csv_output_id', INT_LEN, 'n', array('NUM_CHECK','MAX_LENGTH_CHECK'), '', false);
171        $objFormParam->addParam('選択テーブル', 'select_table', STEXT_LEN, 'KVa', array('GRAPH_CHECK','MAX_LENGTH_CHECK'), '', false);
172        $objFormParam->addParam('名称', 'sql_name', STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK','SPTAB_CHECK'));
173        $objFormParam->addParam('SQL文', 'csv_sql', '30000', 'KVa', array('MAX_LENGTH_CHECK','SPTAB_CHECK'));
174    }
175
176    /**
177     * SQL登録エラーチェック
178     *
179     * @param array $objFormParam フォームパラメータークラス
180     * @return array エラー配列
181     */
182    function lfCheckConfirmError(&$objFormParam) {
183        // パラメーターの基本チェック
184        $arrErr = $objFormParam->checkError();
185        // 拡張エラーチェック
186        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
187        $objErr->doFunc(array('名称', 'sql_name'), array('EXIST_CHECK'));
188        $objErr->doFunc(array('SQL文', 'csv_sql', '30000'), array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
189        $objErr->doFunc(array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array('PROHIBITED_STR_CHECK'));
190        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
191            $arrErr = array_merge($arrErr, $objErr->arrErr);
192        }
193        // SQL文自体の確認、エラーが無い時のみ実行
194        if (SC_Utils_Ex::isBlank($arrErr)) {
195            $sql_error = $this->lfCheckSQL($objFormParam->getValue('csv_sql'));
196            if (!SC_Utils_Ex::isBlank($sql_error)) {
197                $arrErr['csv_sql'] = '※ SQL文が不正です。SQL文を見直してください';
198            }
199        }
200        return $arrErr;
201    }
202
203    /**
204     * SQL確認エラーチェック
205     *
206     * @param array $objFormParam フォームパラメータークラス
207     * @return array エラー配列
208     */
209    function lfCheckPreviewError(&$objFormParam) {
210        // パラメーターの基本チェック
211        $arrErr = $objFormParam->checkError();
212        // 拡張エラーチェック
213        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
214        $objErr->doFunc( array('SQL文', 'csv_sql', '30000'), array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
215        $objErr->doFunc( array('SQL文には読み込み関係以外のSQLコマンドおよび";"記号', 'csv_sql', $this->lfGetSqlDenyList()), array('PROHIBITED_STR_CHECK'));
216        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
217            $arrErr = array_merge($arrErr, $objErr->arrErr);
218        }
219        return $arrErr;
220    }
221
222    /**
223     * SQL設定 削除エラーチェック
224     *
225     * @param array $objFormParam フォームパラメータークラス
226     * @return array エラー配列
227     */
228    function lfCheckDeleteError(&$objFormParam) {
229        // パラメーターの基本チェック
230        $arrErr = $objFormParam->checkError();
231        // 拡張エラーチェック
232        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
233        $objErr->doFunc( array('SQL ID', 'sql_id'), array('EXIST_CHECK'));
234        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
235            $arrErr = array_merge($arrErr, $objErr->arrErr);
236        }
237        return $arrErr;
238    }
239
240    /**
241     * SQL設定 CSV出力エラーチェック
242     *
243     * @param array $objFormParam フォームパラメータークラス
244     * @return array エラー配列
245     */
246    function lfCheckOutputError(&$objFormParam) {
247        // パラメーターの基本チェック
248        $arrErr = $objFormParam->checkError();
249        // 拡張エラーチェック
250        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
251        $objErr->doFunc( array('CSV出力対象SQL ID', 'csv_output_id'), array('EXIST_CHECK'));
252        if (!SC_Utils_Ex::isBlank($objErr->arrErr)) {
253            $arrErr = array_merge($arrErr, $objErr->arrErr);
254        }
255        return $arrErr;
256    }
257
258    /**
259     * デストラクタ.
260     *
261     * @return void
262     */
263    function destroy() {
264        parent::destroy();
265    }
266
267    /**
268     * テーブル一覧を取得する.
269     *
270     * @return array テーブル名一覧
271     */
272    function lfGetTableList() {
273        $objQuery =& SC_Query_Ex::getSingletonInstance();
274        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
275        $arrTable = $objQuery->listTables();
276        if (SC_Utils_Ex::isBlank($arrTable)) {
277            return array();
278        }
279        $arrRet = array();
280        foreach ($arrTable as $table) {
281            if (substr($table, 0, 4) == 'dtb_') {
282                $arrRet[ $table ] = 'データテーブル: ' . $table;
283            }else if (substr($table, 0, 4) == 'mtb_') {
284                $arrRet[ $table ] = 'マスターテーブル: ' . $table;
285            }else if (substr($table, 0, 3) == 'vw_') {
286                $arrRet[ $table ] = 'ビュー: ' . $table;
287            }
288        }
289        return $arrRet;
290    }
291
292    /**
293     * テーブルのカラム一覧を取得する.
294     *
295     * @param string $selectTable テーブル名
296     * @return array カラム一覧の配列
297     */
298    function lfGetColList($table) {
299        if (SC_Utils_Ex::isBlank($table)) {
300            return array();
301        }
302        $objQuery =& SC_Query_Ex::getSingletonInstance();
303        // 実テーブル上のカラム設定を見に行く仕様に変更 ref #476
304        $arrColList = $objQuery->listTableFields($table);
305        $arrColList= SC_Utils_Ex::sfArrCombine($arrColList, $arrColList);
306        return $arrColList;
307    }
308
309    /**
310     * 登録済みSQL一覧を取得する.
311     *
312     * @param string $where Where句
313     * @param array $arrVal 絞り込みデータ
314     * @return array 取得結果の配列
315     */
316    function lfGetSqlList($where = '' , $arrVal = array()) {
317        $objQuery =& SC_Query_Ex::getSingletonInstance();
318        $table = 'dtb_csv_sql';
319        $objQuery->setOrder('sql_id');
320        return $objQuery->select('*', $table, $where, $arrVal);
321    }
322
323    /**
324     * 入力されたSQL文が正しく実行出来るかのチェックを行う.
325     *
326     * @param string SQL文データ(頭にSELECTは入れない)
327     * @return string エラー内容
328     */
329    function lfCheckSQL($sql) {
330        // FIXME: 意図的に new SC_Query しています。 force_runをtrueにする必要があるので.本当はqueryの引数で制御したい。ref SC_Query
331        $objQuery = new SC_Query_Ex('', true);
332        $err = '';
333        $sql = 'SELECT ' . $sql . ' ';
334        $objErrMsg = $objQuery->query($sql);
335        if (PEAR::isError($objErrMsg)) {
336            $err = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
337        }
338        return $err;
339    }
340
341    /**
342     * SQL詳細設定情報呼び出し (編集中データがある場合はそれを保持する)
343     *
344     * @param array $objFormParam フォームパラメータークラス
345     * @return mixed 表示用パラメーター
346     */
347    function lfGetSqlData(&$objFormParam) {
348        // 編集中データがある場合
349        if (!SC_Utils_Ex::isBlank($objFormParam->getValue('sql_name'))
350            || !SC_Utils_Ex::isBlank($objFormParam->getValue('csv_sql'))
351        ) {
352            return $objFormParam->getHashArray();
353        }
354        $sql_id = $objFormParam->getValue('sql_id');
355        if (!SC_Utils_Ex::isBlank($sql_id)) {
356            $arrData = $this->lfGetSqlList('sql_id = ?', array($sql_id));
357            return $arrData[0];
358        }
359        return array();
360    }
361
362    /**
363     * DBにデータを保存する.
364     *
365     * @param integer $sql_id 出力するデータのSQL_ID
366     * @return void
367     */
368    function lfDoCsvOutput($sql_id) {
369        $arrData = $this->lfGetSqlList('sql_id = ?', array($sql_id));
370        $sql = 'SELECT ' . $arrData[0]['csv_sql'] . ' ';
371
372        // TODO: ヘッダ取得 SQL内にLIMIT文がある場合はLIMIT句は追加しないので重いかも
373        $objQuery =& SC_Query_Ex::getSingletonInstance();
374
375        $arrHeader = array();
376        if (!preg_match('/ LIMIT /', $sql)) {
377            $head_sql = $sql . ' LIMIT 0';
378        } else {
379            $head_sql = $sql;
380        }
381        $arrData = $objQuery->getQueryDefsFields($head_sql, array(), true);
382        if (!SC_Utils_Ex::isBlank($arrData)) {
383            foreach ($arrData as $key => $val) {
384                $arrHeader[] = $key;
385            }
386        }
387        $objCSV = new SC_Helper_CSV_Ex();
388        $objCSV->sfDownloadCsvFromSql($sql, array(), 'contents', $arrHeader, true);
389        exit;
390    }
391
392    /**
393     * DBにデータを保存する.
394     *
395     * @param integer $sql_id 更新するデータのSQL_ID
396     * @param array $arrSqlVal 更新データの配列
397     * @return integer $sql_id SQL_IDを返す
398     */
399    function lfUpdData($sql_id, $arrSqlVal) {
400        $objQuery =& SC_Query_Ex::getSingletonInstance();
401        $table = 'dtb_csv_sql';
402        $arrSqlVal['update_date'] = 'CURRENT_TIMESTAMP';
403        if (SC_Utils_Ex::sfIsInt($sql_id)) {
404            //データ更新
405            $where = 'sql_id = ?';
406            $objQuery->update($table, $arrSqlVal, $where, array($sql_id));
407        } else {
408            //新規作成
409            $sql_id = $objQuery->nextVal('dtb_csv_sql_sql_id');
410            $arrSqlVal['sql_id'] = $sql_id;
411            $arrSqlVal['create_date'] = 'CURRENT_TIMESTAMP';
412            $objQuery->insert($table, $arrSqlVal);
413        }
414        return $sql_id;
415    }
416
417    /**
418     * 登録済みデータを削除する.
419     *
420     * @param integer $sql_id 削除するデータのSQL_ID
421     * @return boolean 実行結果 true:成功
422     */
423    function lfDelData($sql_id) {
424        $objQuery =& SC_Query_Ex::getSingletonInstance();
425        $table = 'dtb_csv_sql';
426        $where = 'sql_id = ?';
427        if (SC_Utils_Ex::sfIsInt($sql_id)) {
428            $objQuery->delete($table, $where, array($sql_id));
429            return true;
430        }
431        return false;
432    }
433
434    /**
435     * SQL文に含めることを許可しないSQLキーワード
436     * 基本的にEC-CUBEのデータを取得するために必要なコマンドしか許可しない。複数クエリも不可
437     *
438     * FIXME: キーワードの精査。危険な部分なのでプログラム埋め込みで実装しました。mtb化の有無判断必要。
439     *
440     * @return array 不許可ワード配列
441     */
442    function lfGetSqlDenyList() {
443        $arrList = array(';'
444            ,'CREATE\s'
445            ,'INSERT\s'
446            ,'UPDATE\s'
447            ,'DELETE\s'
448            ,'ALTER\s'
449            ,'ABORT\s'
450            ,'ANALYZE\s'
451            ,'CLUSTER\s'
452            ,'COMMENT\s'
453            ,'COPY\s'
454            ,'DECLARE\s'
455            ,'DISCARD\s'
456            ,'DO\s'
457            ,'DROP\s'
458            ,'EXECUTE\s'
459            ,'EXPLAIN\s'
460            ,'GRANT\s'
461            ,'LISTEN\s'
462            ,'LOAD\s'
463            ,'LOCK\s'
464            ,'NOTIFY\s'
465            ,'PREPARE\s'
466            ,'REASSIGN\s'
467//            ,'REINDEX\s'      // REINDEXは許可で良いかなと
468            ,'RELEASE\sSAVEPOINT'
469            ,'RENAME\s'
470            ,'REST\s'
471            ,'REVOKE\s'
472            ,'SAVEPOINT\s'
473            ,'SET\s'
474            ,'SHOW\s'
475            ,'START\sTRANSACTION'
476            ,'TRUNCATE\s'
477            ,'UNLISTEN\s'
478            ,'VACCUM\s'
479            ,'HANDLER\s'
480            ,'LOAD\sDATA\s'
481            ,'LOAD\sXML\s'
482            ,'REPLACE\s'
483            ,'OPTIMIZE\s'
484            ,'REPAIR\s'
485            ,'INSTALL\sPLUGIN\s'
486            ,'UNINSTALL\sPLUGIN\s'
487            ,'BINLOG\s'
488            ,'KILL\s'
489            ,'RESET\s'
490            ,'PURGE\s'
491            ,'CHANGE\sMASTER'
492            ,'START\sSLAVE'
493            ,'STOP\sSLAVE'
494            ,'MASTER\sPOS\sWAIT'
495            ,'SIGNAL\s'
496            ,'RESIGNAL\s'
497            ,'RETURN\s'
498            ,'USE\s'
499            ,'HELP\s'
500            );
501        return $arrList;
502    }
503}
Note: See TracBrowser for help on using the repository browser.