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

Revision 19803, 13.5 KB checked in by Seasoft, 13 years ago (diff)

#834(パラメータの定数名に「URL」を含むにもかかわらず、パスのみのものがある)

  • 一斉置換前の現状記録のためのコミット

#628(未使用処理・定義などの削除)

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