source: trunk/html/admin/system/module.php @ 18562

Revision 18562, 9.8 KB checked in by kajiwara, 14 years ago (diff)

EC-CUBE Ver2.4.3 分コミット。詳細はこちら( http://www.ec-cube.net/release/detail.php?release_id=210

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