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

Revision 22856, 16.7 KB checked in by Seasoft, 11 years ago (diff)

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

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