source: branches/feature-module-update/html/admin/system/module.php @ 15078

Revision 15078, 9.0 KB checked in by nanasess, 17 years ago (diff)

r15064 から svn cp
とりあえず暫定コミット.

  • UTF-8 に変更
  • slib.php, glib.php のクラス化
  • LC_Page の抽象化(一部)
Line 
1<?php
2/*
3 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
4 *
5 * http://www.lockon.co.jp/
6 */
7require_once("../require.php");
8require_once(DATA_PATH . "module/Request.php");
9
10//ページ管理クラス
11class LC_Page {
12    //コンストラクタ
13    function LC_Page() {
14        //メインテンプレートの指定
15        $this->tpl_mainpage = 'system/module.tpl';
16        $this->tpl_subnavi = 'system/subnavi.tpl';
17        $this->tpl_mainno = 'system';       
18        $this->tpl_subno = 'module';
19        $this->tpl_subtitle = 'モジュール管理';
20    }
21}
22$objPage = new LC_Page();
23$objView = new SC_AdminView();
24$objQuery = new SC_Query();
25
26// セッションクラス
27$objSess = new SC_Session();
28// 認証可否の判定
29sfIsSuccess($objSess);
30
31switch($_POST['mode']) {
32// アップデート情報ファイルを取得
33case 'edit':
34    // 更新情報を最新にする
35    lfLoadUpdateList();
36    break;
37// インストール
38case 'install':
39    // 更新情報を最新にする
40    lfLoadUpdateList();
41    // モジュール郡のインストール
42    lfInstallModule();
43    break;
44// アンインストール
45case 'uninstall':
46    // 更新情報を最新にする
47    lfLoadUpdateList();
48    // モジュール郡のインストール   
49    lfUninstallModule();
50    break;
51default:
52    break;
53}
54
55$objQuery->setorder("module_id");
56$arrUpdate = $objQuery->select("*", "dtb_module");
57
58$objPage->arrUpdate = $arrUpdate;
59$objView->assignobj($objPage);      //変数をテンプレートにアサインする
60$objView->display(MAIN_FRAME);      //テンプレートの出力
61//-------------------------------------------------------------------------------------------------------
62// 更新ファイルの取得
63function lfCopyUpdateFile($file) {
64    global $objPage;
65   
66    $src_path = sfRmDupSlash(UPDATE_HTTP . $file . ".txt");
67    $dst_path = sfRmDupSlash(MODULE_PATH . $file);
68    $flg_ok = true; // 処理の成功判定
69   
70    $src_fp = @fopen($src_path, "rb");
71   
72    if(!$src_fp) {
73        sfErrorHeader(">> " . $src_path . "の取得に失敗しました。");
74        $flg_ok = false;
75    } else {
76        // ファイルをすべて読み込む
77        $contents = '';
78        while (!feof($src_fp)) {
79            $contents .= fread($src_fp, 1024);
80        }
81        fclose($src_fp);
82       
83        // ディレクトリ作成を試みる
84        lfMakeDirectory($dst_path);
85        // ファイル書込み     
86        $dst_fp = @fopen($dst_path, "wb");
87        if(!$dst_fp) {
88            sfErrorHeader(">> " . $dst_path . "をオープンできません。");
89            $flg_ok = false;
90        } else {
91            fwrite($dst_fp, $contents);
92            fclose($dst_fp);
93        }
94    }
95   
96    if($flg_ok) {
97        $objPage->update_mess.= ">> " . $dst_path . ":コピー成功<br>";
98    } else {
99        $objPage->update_mess.= ">> " . $dst_path . ":コピー失敗<br>";       
100    }
101   
102    return $flg_ok;
103}
104
105// すべてのパスのディレクトリを作成する
106function lfMakeDirectory($path) {
107    $pos = 0;
108    $cnt = 0;               // 無限ループ対策
109    $len = strlen($path);   // 無限ループ対策
110   
111    while($cnt <= $len) {
112        $pos = strpos($path, "/", $pos);
113        // ここでの判定は、等号3つを使用
114        if($pos === false) {
115            // スラッシュが見つからない場合はループから抜ける
116            break;
117        }
118        $pos++; // 文字発見位置を一文字進める
119        $dir = substr($path, 0, $pos);
120       
121        // すでに存在するかどうか調べる
122        if(!file_exists($dir)) {
123            mkdir($dir);
124        }
125        $cnt++; // 無限ループ対策
126    }
127}
128
129// 更新情報を最新にする
130function lfLoadUpdateList() {
131    $objQuery = new SC_Query();
132    $path = UPDATE_HTTP . "module.txt";
133    $fp = @fopen($path, "rb");
134   
135    $arrInsID = array();
136       
137    if(!$fp) {
138        sfErrorHeader(">> " . $path . "の取得に失敗しました。");
139    } else {
140       
141        while (!feof($fp)) {
142            $arrCSV = fgetcsv($fp, UPDATE_CSV_LINE_MAX);
143           
144            // エスケープ処理の置換
145            foreach($arrCSV as $key => $val){
146                $arrCSV[$key] = str_replace('\"', '"', $val);
147            }
148           
149            if(ereg("^#", $arrCSV[0])) {
150                continue;
151            }
152           
153            // カラム数が正常であった場合のみ
154            if(count($arrCSV) == MODULE_CSV_COL_MAX) {
155                    // insertするmodule_idを配列に格納
156                    $arrInsID[] = $arrCSV[0];
157               
158                    // 取得したアップデート情報をDBに書き込む
159                    $sqlval['module_id'] = $arrCSV[0];
160                    $sqlval['module_name'] = $arrCSV[1];
161                    $sqlval['latest_version'] = $arrCSV[3];
162                    $sqlval['module_explain'] = $arrCSV[4];
163                    $sqlval['main_php'] = $arrCSV[5];
164                    $sqlval['extern_php'] = $arrCSV[6];
165                    $sqlval['install_sql'] = $arrCSV[7];
166                    $sqlval['uninstall_sql'] = $arrCSV[8];             
167                    $sqlval['other_files'] = $arrCSV[9];
168                    $sqlval['del_flg'] = $arrCSV[10];
169                    $sqlval['update_date'] = "now()";
170                    $sqlval['release_date'] = $arrCSV[12];
171                    $sqlval['module_x'] = $arrCSV[14];
172                    $sqlval['module_y'] = $arrCSV[15];
173                    // モジュールが対応している本体のバージョン
174                    $sqlval['eccube_version'] = $arrCSV[13];                   
175                    // 既存レコードのチェック
176                    $cnt = $objQuery->count("dtb_module", "module_id = ?", array($sqlval['module_id']));
177                    if($cnt > 0) {
178                        // すでに取得されている場合は更新する。   
179                        $objQuery->update("dtb_module", $sqlval, "module_id = ?", array($sqlval['module_id']));
180                    } else {
181                        // 新規レコードの追加
182                        $sqlval['create_date'] = "now()";
183                        $objQuery->insert("dtb_module", $sqlval);
184                    }
185            } else {
186                sfErrorHeader(">> カラム数が一致しません。:".count($arrCSV));
187            }
188        }
189       
190        // 不要なデータを削除
191        if(count($arrInsID) > 0){
192            $del_sql = "DELETE FROM dtb_module WHERE module_id NOT IN (?";
193           
194            for($i = 1; $i < count($arrInsID); $i++){
195                $del_sql .= ",?";
196            }
197            $del_sql .= ")";
198           
199            $objQuery->query($del_sql, $arrInsID);
200        }
201
202        fclose($fp);
203    }
204}
205
206// インストール処理
207function lfInstallModule() {
208    global $objPage;
209   
210    $objQuery = new SC_Query();
211    $arrRet = $objQuery->select("module_id, extern_php, other_files, install_sql, latest_version", "dtb_module", "module_id = ?", array($_POST['module_id']));
212    $flg_ok = true; // 処理の成功判定
213   
214    if(count($arrRet) > 0) {
215        $arrFiles = array();
216        if($arrRet[0]['other_files'] != "") {
217            $arrFiles = split("\|", $arrRet[0]['other_files']);
218        }
219        $arrFiles[] = $arrRet[0]['extern_php'];
220        foreach($arrFiles as $val) {
221            // 更新ファイルの取得
222            $ret=lfCopyUpdateFile($val);
223            if(!$ret) {
224                $flg_ok = false;
225            }
226        }
227    } else {
228        sfErrorHeader(">> 対象の機能は、配布を終了しております。");
229        $flg_ok = false;
230    }
231   
232    // 必要なSQL文の実行
233    if($arrRet[0]['install_sql'] != "") {
234        // SQL文実行、パラーメータなし、エラー無視
235        $arrInstallSql = split(";",$arrRet[0]['install_sql']);
236        foreach($arrInstallSql as $key => $val){
237            if (trim($val) != ""){
238                $ret = $objQuery->query(trim($val),"",true);
239            }
240        }
241        if(DB::isError($ret)) {
242            // エラー文を取得する
243            ereg("\[(.*)\]", $ret->userinfo, $arrKey);
244            $objPage->update_mess.=">> テーブル構成の変更に失敗しました。<br>";
245            $objPage->update_mess.= $arrKey[0] . "<br>";
246            $flg_ok = false;
247        } else {
248            $objPage->update_mess.=">> テーブル構成の変更を行いました。<br>";
249        }
250    }
251   
252    if($flg_ok) {       
253        $path = MODULE_PATH . $arrRet[0]['extern_php'];
254        $sqlval['now_version'] = sfGetFileVersion($path);
255        $sqlval['update_date'] = "now()";
256        $objQuery->update("dtb_module", $sqlval, "module_id = ?", array($arrRet[0]['module_id']));
257    }
258}
259
260// アンインストール処理
261function lfUninstallModule() {
262    global $objPage;
263   
264    $objQuery = new SC_Query();
265    $arrRet = $objQuery->select("module_id, extern_php, other_files, install_sql, uninstall_sql, latest_version", "dtb_module", "module_id = ?", array($_POST['module_id']));
266    $flg_ok = true; // 処理の成功判定
267   
268    if(count($arrRet) > 0) {
269       
270        // モジュールを削除する
271        $objQuery->query("UPDATE dtb_payment SET del_flg = 1 WHERE module_id = ?", array($arrRet[0]['module_id']));
272
273        $arrFiles = array();
274        if($arrRet[0]['other_files'] != "") {
275            $arrFiles = split("\|", $arrRet[0]['other_files']);
276        }
277        $arrFiles[] = $arrRet[0]['extern_php'];
278
279        foreach($arrFiles as $val) {
280            $path = MODULE_PATH . $val;
281            // ファイルを削除する
282            if(file_exists($path) && unlink($path)) {
283                $objPage->update_mess.= ">> " . $path . ":削除成功<br>";
284            } else {
285                $objPage->update_mess.= ">> " . $path . ":削除失敗<br>";
286            }
287        }
288
289        // 必要なSQL文の実行
290        if($arrRet[0]['uninstall_sql'] != "") {
291            // SQL文実行、パラーメータなし、エラー無視
292            $ret = $objQuery->query($arrRet[0]['uninstall_sql'],"",true);
293            if(DB::isError($ret)) {
294                // エラー文を取得する
295                ereg("\[(.*)\]", $ret->userinfo, $arrKey);
296                $objPage->update_mess.=">> テーブル構成の変更に失敗しました。<br>";
297                $objPage->update_mess.= $arrKey[0] . "<br>";
298                $flg_ok = false;
299            } else {
300                $objPage->update_mess.=">> テーブル構成の変更を行いました。<br>";
301            }
302        }
303    } else {
304        sfErrorHeader(">> 対象の機能は、配布を終了しております。");
305    }
306
307    if($flg_ok) {
308        // バージョン情報を削除する。
309        $sqlval['now_version'] = "";
310        $sqlval['update_date'] = "now()";
311        $objQuery->update("dtb_module", $sqlval, "module_id = ?", array($arrRet[0]['module_id']));
312    }
313}
314
315?>
Note: See TracBrowser for help on using the repository browser.