source: branches/comu-ver2/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php @ 18701

Revision 18701, 13.5 KB checked in by nanasess, 14 years ago (diff)

Copyright の更新(#601)

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