source: branches/feature-module-update/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php @ 16449

Revision 16449, 13.6 KB checked in by nanasess, 15 years ago (diff)

クラス化対応

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to text/x-httpd-php
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7
8// {{{ requires
9require_once(CLASS_PATH . "pages/LC_Page.php");
10
11/**
12 * CSV 出力項目設定(高度な設定)のページクラス.
13 *
14 * @package Page
15 * @author LOCKON CO.,LTD.
16 * @version $Id$
17 */
18class LC_Page_Admin_Contents_CsvSql extends LC_Page {
19
20    // }}}
21    // {{{ functions
22
23    /**
24     * Page を初期化する.
25     *
26     * @return void
27     */
28    function init() {
29        parent::init();
30        $this->tpl_mainpage = 'contents/csv_sql.tpl';
31        $this->tpl_subnavi = 'contents/subnavi.tpl';
32        $this->tpl_subno = 'csv';
33        $this->tpl_subno_csv = 'csv_sql';
34        $this->tpl_mainno = "contents";
35        $this->tpl_subtitle = 'CSV出力設定';
36    }
37
38    /**
39     * Page のプロセス.
40     *
41     * @return void
42     */
43    function process() {
44        $objView = new SC_AdminView();
45        $objDbFactory = SC_DB_DBFactory_Ex::getInstance();
46
47        $masterData = new SC_DB_MasterData_Ex();
48        //$this->arrSubnavi = $masterData->getMasterData("mtb_subnavi");
49        //$this->arrSubnaviName = $masterData->getMasterData("mtb_subnavi_name");
50
51        // 認証可否の判定
52        $objSess = new SC_Session();
53        SC_Utils_Ex::sfIsSuccess($objSess);
54
55        if (!isset($_POST['mode'])) $_POST['mode'] = "";
56        if (!isset($_POST['sql_id'])) $_POST['sql_id'] = "";
57        if (!isset($_GET['sql_id'])) $_GET['sql_id'] = "";
58        if (!isset($_POST['selectTable'])) $_POST['selectTable'] = "";
59
60        // SQL_IDの取得
61        if ($_POST['sql_id'] != "") {
62            $sql_id = $_POST['sql_id'];
63        }elseif($_GET['sql_id'] != ""){
64            $sql_id = $_GET['sql_id'];
65        }else{
66            $sql_id = "";
67        }
68
69        $mode = $_POST['mode'];
70
71        switch($_POST['mode']) {
72            // データの登録
73        case "confirm":
74            // エラーチェック
75            $this->arrErr = $this->lfCheckError($_POST);
76
77            if (count($this->arrErr) <= 0){
78                // データの更新
79                $sql_id = $this->lfUpdData($sql_id, $_POST);
80                // 完了メッセージ表示
81                $this->tpl_onload = "alert('登録が完了しました。');";
82            }
83            break;
84
85            // 確認画面
86        case "preview":
87            // SQL文表示
88            $sql = "SELECT \n" . $_POST['csv_sql']; // FIXME
89            $this->sql = $sql;
90
91            // エラー表示
92            $objErrMsg = $this->lfCheckSQL($_POST);
93            if ($objErrMsg != "") {
94                $errMsg = $objErrMsg->message . "\n" . $objErrMsg->userinfo;
95            }
96
97            $this->sqlerr = isset($errMsg) ? $errMsg : "" ;
98
99            $this->objView = $objView;
100
101            // 画面の表示
102            $objView->assignobj($this);
103            $objView->display('contents/csv_sql_view.tpl');
104            exit;
105            break;
106
107            // 新規作成
108        case "new_page":
109            $this->sendRedirect($this->getLocation("./csv_sql.php"));
110            break;
111
112            // データ削除
113        case "delete":
114            $this->lfDelData($sql_id);
115            $this->sendRedirect($this->getLocation("./csv_sql.php"));
116            break;
117
118        case "csv_output":
119            // CSV出力データ取得
120            $arrCsvData = $this->lfGetSqlList(" WHERE sql_id = ?", array($_POST['csv_output_id']));
121
122            $objQuery = new SC_Query();
123
124            $arrCsvOutputData = $objQuery->getall("SELECT " . $arrCsvData[0]['csv_sql']);
125
126            if (count($arrCsvOutputData) > 0) {
127
128                $arrKey = array_keys(SC_Utils_Ex::sfSwapArray($arrCsvOutputData));
129                $i = 0;
130                $header = "";
131                foreach($arrKey as $data) {
132                    if ($i != 0) $header .= ", ";
133                    $header .= $data;
134                    $i ++;
135                }
136                $header .= "\n";
137
138                $data = $this->lfGetCSVData($arrCsvOutputData, $arrKey);
139                // CSV出力
140                SC_Utils_Ex::sfCSVDownload($header.$data);
141                exit;
142                break;
143            }else{
144                $this->tpl_onload = "alert('出力データがありません。');";
145                $sql_id = "";
146                $_POST="";
147            }
148            break;
149        }
150
151        // mode が confirm 以外のときは完了メッセージは出力しない
152        if ($mode != "confirm" and $mode != "csv_output") {
153            $this->tpl_onload = "";
154        }
155
156        // 登録済みSQL一覧取得
157        $arrSqlList = $this->lfGetSqlList();
158
159        // 編集用SQLデータの取得
160        if ($sql_id != "") {
161            $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
162        }
163
164        // テーブル一覧を取得する
165        $arrTableList = $this->lfGetTableList();
166        $arrTableList = SC_Utils_Ex::sfSwapArray($arrTableList);
167
168        // 現在選択されているテーブルを取得する
169        if ($_POST['selectTable'] == ""){
170            $selectTable = $arrTableList['table_name'][0];
171        }else{
172            $selectTable = $_POST['selectTable'];
173        }
174
175        // カラム一覧を取得する
176        $arrColList = $this->lfGetColumnList($selectTable);
177        $arrColList =  SC_Utils_Ex::sfSwapArray($arrColList);
178
179        // 表示させる内容を編集
180        foreach ($arrTableList['description'] as $key => $val) {
181            $arrTableList['description'][$key] = $arrTableList['table_name'][$key] . ":" . $arrTableList['description'][$key];
182        }
183        foreach ($arrColList['description'] as $key => $val) {
184            $arrColList['description'][$key] = $arrColList['column_name'][$key] . ":" . $arrColList['description'][$key];
185        }
186
187
188        $arrDiff = array_diff($objDbFactory->sfGetColumnList($selectTable), $arrColList["column_name"]);
189        $arrColList["column_name"] = array_merge($arrColList["column_name"], $arrDiff);
190        $arrColList["description"] = array_merge($arrColList["description"], $arrDiff);
191
192        // テンプレートに出力するデータをセット
193        $this->arrSqlList = $arrSqlList;    // SQL一覧
194        $this->arrTableList = SC_Utils_Ex::sfarrCombine($arrTableList['table_name'], $arrTableList['description']); // テーブル一覧
195        $this->arrColList = SC_Utils_Ex::sfarrCombine($arrColList['column_name'],$arrColList['description']);           // カラム一覧
196        $this->selectTable = $selectTable;  // 選択されているテーブル
197        $this->sql_id = $sql_id;            // 選択されているSQL
198
199        // POSTされたデータをセットする
200        if (count($_POST) > 0) {
201            $arrSqlData[0]['sql_name'] = isset($_POST['sql_name']) ? $_POST['sql_name'] : "";
202            $arrSqlData[0]['csv_sql'] = isset($_POST['csv_sql']) ? $_POST['csv_sql'] : "";
203        }
204        $this->arrSqlData = $arrSqlData[0]; // 選択されているSQLデータ
205
206        // 画面の表示
207        $objView->assignobj($this);
208        $objView->display(MAIN_FRAME);
209    }
210
211    /**
212     * デストラクタ.
213     *
214     * @return void
215     */
216    function destroy() {
217        parent::destroy();
218    }
219
220    /**
221     * テーブル一覧を取得する.
222     *
223     * @return void
224     */
225    function lfGetTableList(){
226        $objQuery = new SC_Query();
227        $arrRet = array();      // 結果取得用
228
229        $sql = "";
230        $sql .= "SELECT table_name, description FROM dtb_table_comment WHERE column_name IS NULL ORDER BY table_name";
231        $arrRet = $objQuery->getAll($sql);
232
233        return $arrRet;
234    }
235
236    /**
237     * テーブルのカラム一覧を取得する.
238     *
239     * @param string $selectTable テーブル名
240     * @return array カラム一覧の配列
241     */
242    function lfGetColumnList($selectTable){
243        $objQuery = new SC_Query();
244        $arrRet = array();      // 結果取得用
245        $sql = "";
246        $sql .= " SELECT column_name, description FROM dtb_table_comment WHERE table_name = ? AND column_name IS NOT NULL";
247        $arrRet = $objQuery->getAll($sql, array($selectTable));
248
249        return $arrRet;
250    }
251
252    /**
253     * 登録済みSQL一覧を取得する.
254     *
255     * @param string $where Where句
256     * @param array $arrData 絞り込みデータ
257     * @return array 取得結果の配列
258     */
259    function lfGetSqlList($where = "" , $arrData = array()){
260        $objQuery = new SC_Query();
261        $arrRet = array();      // 結果取得用
262
263        $sql = "";
264        $sql .= " SELECT";
265        $sql .= "     sql_id,";
266        $sql .= "     sql_name,";
267        $sql .= "     csv_sql,";
268        $sql .= "     update_date,";
269        $sql .= "     create_date";
270        $sql .= " FROM";
271        $sql .= "     dtb_csv_sql";
272
273        // Where句の指定があれば結合する
274        if ($where != "") {
275            $sql .= " $where ";
276        }else{
277            $sql .= " ORDER BY sql_id ";
278        }
279        $sql .= " ";
280
281        // データを引数で渡されている場合にはセットする
282        if (count($arrData) > 0) {
283            $arrRet = $objQuery->getall($sql, $arrData);
284        }else{
285            $arrRet = $objQuery->getall($sql);
286        }
287
288        return $arrRet;
289    }
290
291    /**
292     * 入力項目のエラーチェックを行う.
293     *
294     * @param array POSTデータ
295     * @return array エラー内容の配列
296     */
297    function lfCheckError($data){
298        $objErr = new SC_CheckError();
299        $objErr->doFunc( array("名称", "sql_name"), array("EXIST_CHECK") );
300        $objErr->doFunc( array("SQL文", "csv_sql", "30000"), array("EXIST_CHECK", "MAX_LENGTH_CHECK") );
301
302        // SQLの妥当性チェック
303        if ($objErr->arrErr['csv_sql'] == "") {
304            $objsqlErr = $this->lfCheckSQL($data);
305            if ($objsqlErr != "") {
306                $objErr->arrErr["csv_sql"] = "SQL文が不正です。SQL文を見直してください";
307            }
308        }
309
310        return $objErr->arrErr;
311    }
312
313    /**
314     * 入力されたSQL文が正しいかチェックを行う.
315     *
316     * @param array POSTデータ
317     * @return array エラー内容
318     */
319    function lfCheckSQL($data){
320        $err = "";
321        $objDbConn = new SC_DbConn();
322        $sql = "SELECT " . $data['csv_sql'] . " ";
323        $ret = $objDbConn->conn->query($sql);
324        if ($objDbConn->conn->isError($ret)){
325            $err = $ret;
326        }
327
328        return $err;
329    }
330
331    /**
332     * DBにデータを保存する.
333     *
334     * @param integer $sql_id 更新するデータのSQL_ID
335     * @param array $arrData 更新データの配列
336     * @return integer $sql_id SQL_IDを返す
337     */
338    function lfUpdData($sql_id = "", $arrData = array()){
339        $objQuery = new SC_Query();     // DB操作オブジェクト
340        $sql = "";                      // データ取得SQL生成用
341        $arrRet = array();              // データ取得用(更新判定)
342        $arrVal = array();              // データ更新
343
344        // sql_id が指定されている場合にはUPDATE
345        if ($sql_id != "") {
346            // 存在チェック
347            $arrSqlData = $this->lfGetSqlList(" WHERE sql_id = ?", array($sql_id));
348            if (count($arrSqlData) > 0) {
349                // データ更新
350                $sql = "UPDATE dtb_csv_sql SET sql_name = ?, csv_sql = ?, update_date = now() WHERE sql_id = ? ";
351                $arrVal= array($arrData['sql_name'], $arrData['csv_sql'], $sql_id);
352            }else{
353                // データの新規作成
354                $sql_id = "";
355                $sql = "INSERT INTO dtb_csv_sql (sql_name, csv_sql, create_date, update_date) values (?, ?, now(), now()) ";
356                $arrVal= array($arrData['sql_name'], $arrData['csv_sql']);
357
358            }
359        }else{
360            // データの新規作成
361            $sql = "INSERT INTO dtb_csv_sql (sql_name, csv_sql, create_date, update_date) values (?, ?, now(), now()) ";
362            $arrVal= array($arrData['sql_name'], $arrData['csv_sql']);
363        }
364        // SQL実行
365        $arrRet = $objQuery->query($sql,$arrVal);
366
367        // 新規作成時は$sql_idを取得
368        if ($sql_id == "") {
369            $arrNewData = $this->lfGetSqlList(" ORDER BY create_date DESC");
370            $sql_id = $arrNewData[0]['sql_id'];
371        }
372
373        return $sql_id;
374    }
375
376
377    /**
378     * 登録済みデータを削除する.
379     *
380     * @param integer $sql_id 削除するデータのSQL_ID
381     * @return bool 実行結果 TRUE:成功 FALSE:失敗
382     */
383    function lfDelData($sql_id = ""){
384        $objQuery = new SC_Query();     // DB操作オブジェクト
385        $sql = "";                      // データ取得SQL生成用
386        $Ret = false;                   // 実行結果
387
388        // sql_id が指定されている場合のみ実行
389        if ($sql_id != "") {
390            // データの削除
391            $sql = "DELETE FROM dtb_csv_sql WHERE sql_id = ? ";
392            // SQL実行
393            $ret = $objQuery->query($sql,array($sql_id));
394        }else{
395            $ret = false;
396        }
397
398        // 結果を返す
399        return $ret;
400    }
401
402
403    //---- CSV出力用データ取得
404    function lfGetCSVData( $array, $arrayIndex){
405        $return = "";
406        for ($i=0; $i<count($array); $i++){
407            for ($j=0; $j<count($array[$i]); $j++ ){
408                if ( $j > 0 ) $return .= ",";
409                $return .= "\"";
410                if ( $arrayIndex ){
411                    $return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$arrayIndex[$j]] )) ."\"";
412                } else {
413                    $return .= mb_ereg_replace("<","<",mb_ereg_replace( "\"","\"\"",$array[$i][$j] )) ."\"";
414                }
415            }
416            $return .= "\n";
417        }
418
419        return $return;
420    }
421}
422?>
Note: See TracBrowser for help on using the repository browser.