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

Revision 22567, 16.7 KB checked in by shutta, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.12.4)
Zend Framework PHP 標準コーディング規約のコーディングスタイルへ準拠。
classおよびfunctionの開始波括弧「{」のスタイルを修正。

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