source: branches/version-2_4/data/class/pages/admin/contents/LC_Page_Admin_Contents_CsvSql.php @ 18121

Revision 18121, 13.6 KB checked in by kajiwara, 12 years ago (diff)

#469 管理画面→コンテツンツ管理→CSV出力項目設定→高度な設定から、”商品管理”以外をクリックした場合、全てが商品管理へ遷移してしまうバグの修正。
r17769 のチェンジセットはチェンジセット適応前の状態に戻しました。

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