source: branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php @ 21683

Revision 21683, 37.2 KB checked in by Seasoft, 9 years ago (diff)

#1613 (typo修正・ソース整形・ソースコメントの改善)

  • Property svn:eol-style set to LF
  • 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-2011 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_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
26
27/**
28 * システム情報 のページクラス.
29 *
30 * @package Page
31 * @author LOCKON CO.,LTD.
32 * @version $Id$
33 */
34class LC_Page_Admin_System_Plugin extends LC_Page_Admin_Ex {
35
36    // }}}
37    // {{{ functions
38
39    /**
40     * Page を初期化する.
41     *
42     * @return void
43     */
44    function init() {
45        parent::init();
46        $this->tpl_mainpage = 'system/plugin.tpl';
47        $this->tpl_subno    = 'plugin';
48        $this->tpl_mainno   = 'system';
49        $this->tpl_maintitle = 'システム設定';
50        $this->tpl_subtitle = 'プラグイン管理';
51    }
52
53    /**
54     * Page のプロセス.
55     *
56     * @return void
57     */
58    function process() {
59        $this->action();
60        $this->sendResponse();
61    }
62
63    /**
64     * Page のアクション.
65     *
66     * @return void
67     */
68    function action() {
69        // パラメーター管理クラス
70        $objFormParam = new SC_FormParam_Ex();
71        $mode = $this->getMode();   
72        // パラメーター情報の初期化
73        $this->initParam($objFormParam, $mode);
74        $objFormParam->setParam($_POST);
75
76        $mode = $this->getMode();       
77
78        switch ($mode) {
79            // インストール
80            case 'install':
81                $file_key = 'plugin_file';
82                $this->arrErr = $this->checkUploadFile($file_key);
83                if ($this->isError($this->arrErr) === false) {
84                    $upload_file = $_FILES[$file_key];
85                    $upload_file_file_name = $upload_file['name'];
86                    // インストール処理.
87                    $this->arrErr = $this->installPlugin($upload_file_file_name, 'plugin_file');
88                    if ($this->isError($this->arrErr) === false) {
89                        // コンパイルファイルのクリア処理
90                        SC_Utils_Ex::clearCompliedTemplate();
91                        $this->tpl_onload = "alert('プラグインをインストールしました。');";
92                    }
93                }
94                break;
95            // 削除
96            case 'uninstall':
97                // エラーチェック
98                $this->arrErr = $objFormParam->checkError();
99                if ($this->isError($this->arrErr) === false) {
100                    $plugin_id = $objFormParam->getValue('plugin_id');
101                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
102                    $this->arrErr = $this->uninstallPlugin($plugin);
103                    if ($this->isError($this->arrErr) === false) {
104                        // コンパイルファイルのクリア処理
105                        SC_Utils_Ex::clearCompliedTemplate();
106                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] ."を削除しました。');";
107                    }
108                }
109                break;
110            // 有効化
111            case 'enable':
112
113                // エラーチェック
114                $this->arrErr = $objFormParam->checkError();
115                if ($this->isError($this->arrErr) === false) {
116                    $plugin_id = $objFormParam->getValue('plugin_id');
117                    // プラグイン取得.
118                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
119                    $this->arrErr = $this->enablePlugin($plugin);                   
120                    if ($this->isError($this->arrErr) === false) {
121                        // コンパイルファイルのクリア処理
122                        SC_Utils_Ex::clearCompliedTemplate();
123                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] . "を有効にしました。');";
124                    }
125                }
126                break;
127            // 無効化
128            case 'disable':
129                // エラーチェック
130                $this->arrErr = $objFormParam->checkError();
131                if ($this->isError($this->arrErr) === false) {
132                    $plugin_id = $objFormParam->getValue('plugin_id');
133                    // プラグイン取得.
134                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
135                    $this->arrErr = $this->disablePlugin($plugin);
136                    if ($this->isError($this->arrErr) === false) {
137                        // コンパイルファイルのクリア処理
138                        SC_Utils_Ex::clearCompliedTemplate();
139                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] . "を無効にしました。');";
140                    }
141                }
142                break;
143            // アップデート.
144            case 'update':
145                // エラーチェック
146                $this->arrErr = $objFormParam->checkError();
147                if ($this->isError($this->arrErr) === false) {
148                    $target_plugin_code = $objFormParam->getValue('plugin_code'); // アップデート対象のプラグインコード
149                    $this->arrErr = $this->checkUploadFile($target_plugin_code);
150
151                    if ($this->isError($this->arrErr) === false) {
152                        $update_plugin_file = $_FILES[$target_plugin_code];
153                        $update_plugin_file_name = $update_plugin_file['name']; // アップデートファイルのファイル名.
154                        // インストール処理.
155                        $target_plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($target_plugin_code);
156                        $this->arrErr = $this->updatePlugin($target_plugin, $update_plugin_file_name, $target_plugin_code);
157                        if ($this->isError($this->arrErr) === false) {
158                            // コンパイルファイルのクリア処理
159                            SC_Utils_Ex::clearCompliedTemplate();
160                            $this->tpl_onload = "alert('プラグインをアップデートしました。');";
161                        }
162                    }
163                }
164                break;
165            // 優先度.
166            case 'priority':
167                // エラーチェック
168                $arrErr = $objFormParam->checkError();
169                $plugin_id = $objFormParam->getValue('plugin_id');
170                if ($this->isError($arrErr) === false) {
171                    // 優先度の更新
172                    $priority = $objFormParam->getValue('priority');
173                    $this->updatePriority($plugin_id, $priority);
174                    // コンパイルファイルのクリア処理
175                    SC_Utils_Ex::clearCompliedTemplate();
176                } else {
177                    // エラーメッセージを詰め直す.
178                    $this->arrErr['priority'][$plugin_id] = $arrErr['priority'];
179                }
180
181                break;
182            default:
183                break;
184        }
185        // DBからプラグイン情報を取得
186        $plugins = SC_Plugin_Util_Ex::getAllPlugin();
187
188        foreach ($plugins as $key => $plugin) {
189            // 設定ファイルがあるかを判定.
190            $plugins[$key]['config_flg'] = $this->isContainsFile(PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'], 'config.php');
191            if ($plugins[$key]['enable'] === PLUGIN_ENABLE_TRUE) {
192                // 競合するプラグインがあるかを判定.
193                $plugins[$key]['conflict_message']= $this->checkConflictPlugin($plugin['plugin_id']);
194            }
195        }
196        $this->plugins = $plugins;
197    }
198
199    /**
200     * デストラクタ.
201     *
202     * @return void
203     */
204    function destroy() {
205        parent::destroy();
206    }
207
208    /**
209     * パラメーター初期化.
210     *
211     * @param SC_FormParam_Ex $objFormParam
212     * @param string $mode モード
213     * @return void
214     */
215    function initParam(&$objFormParam, $mode) {
216        $objFormParam->addParam('mode', 'mode', INT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
217        $objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
218        $objFormParam->addParam('plugin_code', 'plugin_code', MTEXT_LEN, '', array('ALNUM_CHECK', 'MAX_LENGTH_CHECK'));
219        if ($mode === 'priority') {
220            $objFormParam->addParam('優先度', 'priority', INT_LEN, '', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
221        }
222    }
223
224    /**
225     * ファイルパラメーター初期化.
226     *
227     * @param SC_UploadFile_Ex $objUpFile SC_UploadFileのインスタンス.
228     * @param string $key 登録するキー.
229     * @return void
230     */
231    function initUploadFile(&$objUpFile, $key) {
232        $objUpFile->addFile('プラグインファイル', $key, explode(',', PLUGIN_EXTENSION), FILE_SIZE, true, 0, 0, false);
233    }
234
235    /**
236     * ファイルが指定されている事をチェックします.
237     *
238     * @param string $file ファイル
239     * @param string $file_key ファイルキー
240     * @return array エラー情報を格納した連想配列.
241     */
242    function checkUploadFile($file_key) {
243        $objErr = new SC_CheckError_Ex();
244        // 拡張子チェック
245        $objErr->doFunc(array('プラグインファイル', $file_key, explode(',', PLUGIN_EXTENSION)), array('FILE_EXT_CHECK'));
246        // ファイルサイズチェック
247        $objErr->doFunc(array('プラグインファイル', $file_key, FILE_SIZE), array('FILE_SIZE_CHECK'));
248        // ファイル名チェック
249        $objErr->doFunc(array('プラグインファイル', $file_key), array('FILE_NAME_CHECK'));
250
251        return $objErr->arrErr;
252    }
253
254    /**
255     * 既にインストールされているプラグインかを判定します.
256     *
257     * @param string $plugin_code プラグインコード
258     * @return boolean インストール済の場合true インストールされていない場合false
259     */
260    function isInstalledPlugin($plugin_code) {
261        $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($plugin_code);
262        if (!empty($plugin)) {
263            return true;
264        }
265        return false;
266    }
267
268    /**
269     * ファイル名からプラグインコードを取得する.
270     *
271     * ファイル名を「.」で配列に分解.
272     * 配列内から拡張子として格納される可能性のある「tar」「gz」を除外すし、再度結合する.
273     *
274     * @param string $file_name ファイル名
275     * @return string $plugin_code プラグインコード.
276     */
277    function getPluginCode($file_name) {
278        // 分解
279        $array_ext = explode('.', $file_name);
280        $array_file_name = array_diff($array_ext, array('tar','gz'));
281        // 結合
282        $plugin_code = implode('.', $array_file_name);
283        return $plugin_code;
284    }
285
286    /**
287     * プラグイン保存ディレクトリのパスを取得する.
288     *
289     * @param string $plugin_code プラグインコード
290     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
291     */
292    function getPluginDir($plugin_code) {
293        $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/';
294        return $plugin_dir_path;
295    }
296
297    /**
298     * プラグインHTMLディレクトリのパスを取得する.
299     *
300     * @param string $plugin_code プラグインコード
301     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
302     */
303    function getHtmlPluginDir($plugin_code) {
304        $plugin_dir_path = PLUGIN_HTML_REALDIR . $plugin_code . '/';
305        return $plugin_dir_path;
306    }
307
308    /**
309     * プラグインファイルのパスを取得する.
310     *
311     * @param string $plugin_code プラグインコード
312     * @return string $plugin_file_path クラスファイルのパス.
313     */
314    function getPluginFilePath($plugin_code) {
315        $plugin_file_path = $this->getPluginDir($plugin_code) . $plugin_code . '.php';
316        return $plugin_file_path;
317    }
318
319    /**
320     * プラグインをインストールします.
321     *
322     * @param string $plugin_code プラグインコード.
323     * @param string $key キー.
324     * @return array エラー情報を格納した連想配列.
325     */
326    function installPlugin($upload_file_file_name, $key) {
327
328        $arrErr = array();
329        // ファイルをチェックし一時展開用ディレクトリに展開します.
330        $arrErr = $this->unpackPluginFile($upload_file_file_name, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $key);
331        if ($this->isError($arrErr) === true) {
332            return $arrErr;
333        }
334        // plugin_infoを読み込み.
335        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR . 'plugin_info.php', $key);
336        if ($this->isError($arrErr) === true) {
337            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
338            return $arrErr;
339        }
340
341        // リフレクションオブジェクトを生成.
342        $objReflection = new ReflectionClass('plugin_info');
343        // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
344        $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
345        if ($this->isError($arrErr) === true) {
346            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
347            return $arrErr;
348        }
349
350        // プラグインコード
351        $plugin_code = $objReflection->getConstant('PLUGIN_CODE');
352        // プラグイン名
353        $plugin_name = $objReflection->getConstant('PLUGIN_NAME');
354
355        // 既にインストールされていないかを判定.
356        if ($this->isInstalledPlugin($plugin_code) === true) {
357            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
358            $arrErr['plugin_file'] = '※ ' . $plugin_name . 'は既にインストールされています。<br/>';
359            return $arrErr;
360        }
361
362        // プラグイン情報をDB登録
363        if ($this->registerData($objReflection) === false) {
364            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
365            $arrErr['plugin_file'] = '※ DB登録に失敗しました。<br/>';
366            return $arrErr;
367        }
368
369        // プラグイン保存ディレクトリを作成し、一時展開用ディレクトリから移動します.
370        $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/';
371        $this->makeDir($plugin_dir_path);
372        SC_Utils_Ex::copyDirectory(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin_dir_path);
373
374        // プラグイン情報を取得
375        $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($plugin_code);
376
377        // クラスファイルを読み込み.
378        $plugin_class_file_path = $plugin_dir_path . $plugin['class_name'] . '.php';
379        $arrErr = $this->requirePluginFile($plugin_class_file_path, $key);
380        if ($this->isError($arrErr) === true) {
381            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id']);
382            return $arrErr;
383        }
384        // プラグインhtmlディレクトリ作成
385        $plugin_html_dir = PLUGIN_HTML_REALDIR . $plugin_code;
386        $this->makeDir($plugin_html_dir);
387
388        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'install');
389        if ($this->isError($arrErr) === true) {
390            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id'], $plugin_html_dir);
391            return $arrErr;
392        }
393
394        // 不要なファイルの削除
395        SC_Utils_EX::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false);
396        return $arrErr;
397    }
398
399    /**
400     * ロールバック処理
401     * インストール失敗時などに不要な一時ファイルを削除します.
402     *
403     * @param string $temp_dir インストール・アップデート時の一時展開用ディレクトリのパス.
404     * @param string $plugin_id プラグインID.
405     * @param string $plugin_html_dir プラグイン毎に生成されるhtmlディレクトリのパス.
406     */
407    function rollBack($temp_dir, $plugin_id = '', $plugin_html_dir ='') {
408        // 一時ディレクトリを削除.
409        SC_Utils_Ex::deleteFile($temp_dir, false);
410        // DBからプラグイン情報を削除
411        if(empty($plugin_id) === false) SC_Plugin_Util_Ex::deletePluginByPluginId($plugin_id);
412        // htmlディレクトリを削除
413        if(empty($plugin_html_dir) === false) SC_Utils_Ex::deleteFile($plugin_html_dir, true);
414    }
415
416    /**
417     * プラグインクラス内の定数をチェックします.
418     *
419     * @param ReflectionClass $objReflection リフレクションオブジェクト
420     * @return array エラー情報を格納した連想配列.
421     */
422    function checkPluginConstants(ReflectionClass $objReflection, $unpack_dir) {
423        $arrErr = array();
424        $plugin_code = $objReflection->getConstant('PLUGIN_CODE');
425        if ($plugin_code === false) {
426            $arrErr['plugin_file'] = '※ PLUGIN_CODEが定義されていません。<br/>';
427            return $arrErr;
428        }
429        $plugin_name = $objReflection->getConstant('PLUGIN_NAME');
430        if ($plugin_name === false) {
431            $arrErr['plugin_file'] = '※ PLUGIN_NAMEが定義されていません。<br/>';
432            return $arrErr;
433        }
434        $class_name = $objReflection->getConstant('CLASS_NAME') . '.php';
435        if ($class_name === false ||file_exists($unpack_dir . $class_name) === false) {
436            $arrErr['plugin_file'] = '※ CLASS_NAMEが定義されていません。またはCLASS_NAMEが正しく定義されていません。<br/>';
437            return $arrErr;
438        }
439        if ($objReflection->getConstant('PLUGIN_VERSION') === false) {
440            $arrErr['plugin_file'] = '※ PLUGIN_VERSIONが定義されていません。<br/>';
441            return $arrErr;
442        }
443        if ($objReflection->getConstant('COMPLIANT_VERSION') === false) {
444            $arrErr['plugin_file'] = '※ COMPLIANT_VERSIONが定義されていません。<br/>';
445            return $arrErr;
446        }
447        if ($objReflection->getConstant('AUTHOR') === false) {
448            $arrErr['plugin_file'] = '※ AUTHORが定義されていません。<br/>';
449            return $arrErr;
450        }
451        if ($objReflection->getConstant('DESCRIPTION') === false) {
452            $arrErr['plugin_file'] = '※ DESCRIPTIONが定義されていません。<br/>';
453            return $arrErr;
454        }
455        $objErr = new SC_CheckError_Ex($objReflection->getConstants());
456        $objErr->doFunc(array('PLUGIN_CODE', 'PLUGIN_CODE', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
457        $objErr->doFunc(array('PLUGIN_NAME', 'PLUGIN_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK'));
458        $objErr->doFunc(array('CLASS_NAME', 'CLASS_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
459        $objErr->doFunc(array('PLUGIN_VERSION', 'PLUGIN_VERSION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
460        $objErr->doFunc(array('COMPLIANT_VERSION', 'COMPLIANT_VERSION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
461        $objErr->doFunc(array('AUTHOR', 'AUTHOR', STEXT_LEN), array('MAX_LENGTH_CHECK'));
462        $objErr->doFunc(array('DESCRIPTION', 'DESCRIPTION', SLTEXT_LEN), array('MAX_LENGTH_CHECK'));
463        if ($objReflection->getConstant('PLUGIN_SITE_URL') !== false) {
464            $objErr->doFunc(array('PLUGIN_SITE_URL', 'PLUGIN_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
465        }
466        if ($objReflection->getConstant('AUTHOR_SITE_URL') !== false) {
467            $objErr->doFunc(array('AUTHOR_SITE_URL', 'AUTHOR_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
468        }
469        // エラー内容を出力用の配列にセットします.
470        if ($this->isError($objErr->arrErr)) {
471            $arrErr['plugin_file'] = '';
472            foreach ($objErr->arrErr as $error) {
473                    $arrErr['plugin_file'] .= $error;
474            }
475        }
476        return $arrErr;
477    }
478
479    /**
480     * プラグインをアップデートします.
481     *
482     * @param string $target_plugin アップデートするプラグインコード.
483     * @param string $upload_file_name アップロードファイル名.
484     * @return array エラー情報を格納した連想配列.
485     */
486    function updatePlugin($target_plugin, $upload_file_name) {
487        $arrErr = array();
488
489        // ファイルをチェックし展開します.
490        $arrErr = $this->unpackPluginFile($upload_file_name, DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, $target_plugin['plugin_code']);
491        if ($this->isError($arrErr) === true) {
492            return $arrErr;
493        }
494
495        // plugin_infoを読み込み.
496        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . 'plugin_info.php', $target_plugin['plugin_code']);
497        if ($this->isError($arrErr) === true) {
498            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
499            return $arrErr;
500        }
501
502        // リフレクションオブジェクトを生成.
503        $objReflection = new ReflectionClass('plugin_info');
504        // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
505        $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
506        if ($this->isError($arrErr) === true) {
507            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
508            return $arrErr;
509        }
510
511        // プラグインのクラス名を取得;
512         $class_name = $objReflection->getConstant('CLASS_NAME');
513
514        // 展開されたディレクトリからプラグインクラスファイルを読み込みます.
515        $update_plugin_class_path = DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . $class_name . '.php';
516        $arrErr = $this->requirePluginFile($update_plugin_class_path, $target_plugin['plugin_code']);
517        if ($this->isError($arrErr) === true) {
518            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
519            return $arrErr;
520        }
521        // プラグインクラスファイルのUPDATE処理を実行.
522        $arrErr = $this->execPlugin($target_plugin, $class_name, 'update');
523
524        // 保存ディレクトリの削除.
525        SC_Utils_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, false);
526
527        return $arrErr;
528    }
529
530    /**
531     * ファイルをアップロードし、解凍先のディレクトリに解凍します.
532     *
533     * @param string $unpack_file_name 解凍ファイル名
534     * @param string $unpack_dir 解凍先ディレクトリ
535     * @param string $file_key ファイルキー
536     * @return array エラー情報を格納した連想配列.
537     */
538    function unpackPluginFile($unpack_file_name, $unpack_dir, $file_key) {
539        $arrErr = array();
540        // 解凍ディレクトリディレクトリを作成し、一時ディレクトリからファイルを移動
541        $objUpFile = new SC_UploadFile_Ex(PLUGIN_TEMP_REALDIR, $unpack_dir);
542        $this->initUploadFile($objUpFile, $file_key);
543        $arrErr = $objUpFile->makeTempFile($file_key, false);
544        if ($this->isError($arrErr) === true) {
545            return $arrErr;
546        }
547
548        // 正常にアップロードされているかをチェック.
549        $arrErr = $objUpFile->checkEXISTS($file_key);
550        if ($this->isError($arrErr) === true) {
551            return $arrErr;
552        }
553        $objUpFile->moveTempFile();
554        // 解凍
555        $update_plugin_file_path = $unpack_dir . $unpack_file_name;
556        if (!SC_Helper_FileManager_Ex::unpackFile($update_plugin_file_path)) {
557            $arrErr['plugin_file'] = '※ 解凍に失敗しました。<br/>';
558            return $arrErr;
559        }
560        return $arrErr;
561    }
562
563    /**
564     * プラグインをアンインストールします.
565     *
566     * @param array $plugin プラグイン情報を確認した連想配列.
567     * @return array エラー情報を格納した連想配列.
568     */
569    function uninstallPlugin($plugin) {
570        $arrErr = array();
571        // プラグインファイルを読み込みます.
572        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
573        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
574        if ($this->isError($arrErr) === true) {
575            return $arrErr;
576        }
577
578        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'uninstall');
579        if ($this->isError($arrErr) === true) {
580            return $arrErr;
581        }
582        // プラグインの削除処理.
583        $arrErr = $this->deletePlugin($plugin['plugin_id'], $plugin['plugin_code']);
584
585        return $arrErr;
586    }
587
588    /**
589     * プラグインを有効にします.
590     *
591     * @param array $plugin プラグイン情報を確認した連想配列.
592     * @return array $arrErr エラー情報を格納した連想配列.
593     */
594    function enablePlugin($plugin) {
595        $arrErr = array();
596        // クラスファイルを読み込み.
597        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
598        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
599        if ($this->isError($arrErr) === true) {
600            return $arrErr;
601        }
602        // 有効化処理を実行します.
603        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'enable');
604        if ($this->isError($arrErr) === true) {
605            return $arrErr;
606        }
607        // プラグインを有効にします.
608        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_TRUE);
609
610        return $arrErr;
611    }
612
613    /**
614     * プラグインを無効にします.
615     *
616     * @param array $plugin プラグイン情報を確認した連想配列.
617     * @return array $arrErr エラー情報を格納した連想配列.
618     */
619    function disablePlugin($plugin) {
620        $arrErr = array();
621        // クラスファイルを読み込み.
622        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
623        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
624        if ($this->isError($arrErr) === true) {
625            return $arrErr;
626        }
627
628        // 無効化処理を実行します.
629        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'disable');
630        if ($this->isError($arrErr) === true) {
631            return $arrErr;
632        }
633        // プラグインを無効にします.
634        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_FALSE);
635
636        return $arrErr;
637    }
638
639    /**
640     * 優先度を更新します.
641     *
642     * @param int $plugin_id プラグインID
643     * @param int $priority 優先度
644     * @return integer 更新件数
645     */
646    function updatePriority($plugin_id, $priority) {
647        $objQuery =& SC_Query_Ex::getSingletonInstance();
648        // UPDATEする値を作成する。
649        $sqlval['priority'] = $priority;
650        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
651        $where = 'plugin_id = ?';
652        // UPDATEの実行
653        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
654        return $ret;
655    }
656
657    /**
658     * プラグイン情報をDB登録.
659     *
660     * @param ReflectionClass $objReflection リフレクションオブジェクト
661     * @return array エラー情報を格納した連想配列.
662     */
663    function registerData(ReflectionClass $objReflection) {
664
665        // プラグイン情報をDB登録.
666        $objQuery =& SC_Query_Ex::getSingletonInstance();
667        $objQuery->begin();
668        $arr_sqlval_plugin = array();
669        $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id');
670        $arr_sqlval_plugin['plugin_id'] = $plugin_id;
671        $arr_sqlval_plugin['plugin_name'] = $objReflection->getConstant('PLUGIN_NAME');
672        $arr_sqlval_plugin['plugin_code'] = $objReflection->getConstant('PLUGIN_CODE');
673        $arr_sqlval_plugin['class_name'] = $objReflection->getConstant('CLASS_NAME');
674        $arr_sqlval_plugin['author'] = $objReflection->getConstant('AUTHOR');
675        // AUTHOR_SITE_URLが定義されているか判定.
676        $author_site_url = $objReflection->getConstant('AUTHOR_SITE_URL');
677        if($author_site_url !== false) $arr_sqlval_plugin['author_site_url'] = $author_site_url;
678        // PLUGIN_SITE_URLが定義されているか判定.
679        $plugin_site_url = $objReflection->getConstant('PLUGIN_SITE_URL');
680        if($plugin_site_url !== false) $arr_sqlval_plugin['plugin_site_url'] = $plugin_site_url;
681        $arr_sqlval_plugin['plugin_version'] = $objReflection->getConstant('PLUGIN_VERSION');
682        $arr_sqlval_plugin['compliant_version'] = $objReflection->getConstant('COMPLIANT_VERSION');
683        $arr_sqlval_plugin['plugin_description'] = $objReflection->getConstant('DESCRIPTION');
684        $arr_sqlval_plugin['priority'] = 0;
685        $arr_sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE;
686        $arr_sqlval_plugin['update_date'] = 'CURRENT_TIMESTAMP';
687        $objQuery->insert('dtb_plugin', $arr_sqlval_plugin);
688
689        // フックポイントをDB登録.
690        $hook_point = $objReflection->getConstant('HOOK_POINTS');
691        if ($hook_point !== false) {
692            $array_hook_point = explode(',', $hook_point);
693            if (is_array($array_hook_point)) {
694                foreach ($array_hook_point as $hook_point) {
695                    $arr_sqlval_plugin_hookpoint = array();
696                    $id = $objQuery->nextVal('dtb_plugin_hookpoint_id');
697                    $arr_sqlval_plugin_hookpoint['plugin_hookpoint_id'] = $id;
698                    $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
699                    $arr_sqlval_plugin_hookpoint['hook_point'] = $hook_point;
700                    $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
701                    $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint);
702                }
703            }
704        }
705        return $objQuery->commit();
706    }
707
708    /**
709     * ファイルを読み込む.
710     *
711     * @param string $file_path クラスのpath
712     * @param string $key エラー情報のキー.
713     * @return array $arrErr エラー情報を格納した連想配列.
714     */
715    function requirePluginFile($file_path, $key) {
716        $arrErr = array();
717        if (file_exists($file_path)) {
718            require_once $file_path;
719        } else {
720            $arrErr[$key] = '※ ' . $file_path .'の読み込みに失敗しました。<br/>';
721        }
722        return $arrErr;
723    }
724
725    /**
726     * インスタンスを生成し、指定のメソッドを実行する.
727     *
728     * @param integer $plugin プラグイン情報
729     * @param string $plugin_code プラグインコード
730     * @param string $exec_func 実行するメソッド名.
731     * @return array $arrErr エラー情報を格納した連想配列.
732     *
733     */
734    function execPlugin($plugin, $class_name, $exec_func) {
735        $arrErr = array();
736        if (method_exists($class_name, $exec_func) === true) {
737            call_user_func(array($class_name, $exec_func), $plugin);
738        } else {
739            $arrErr['plugin_error'] = '※ ' . $class_name . '.php に' . $exec_func . 'が見つかりません。<br/>';
740        }
741        return $arrErr;
742    }
743
744    /**
745     * plugin_idをキーにdtb_pluginのstatusを更新します.
746     *
747     * @param int $plugin_id プラグインID
748     * @param int $enable_flg 有効フラグ
749     * @return integer 更新件数
750     */
751    function updatePluginEnable($plugin_id, $enable_flg) {
752        $objQuery =& SC_Query_Ex::getSingletonInstance();
753        // UPDATEする値を作成する。
754        $sqlval['enable'] = $enable_flg;
755        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
756        $where = 'plugin_id = ?';
757        // UPDATEの実行
758        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
759        return $ret;
760    }
761
762    /**
763     * plugin_idをキーにdtb_plugin, dtb_plugin_hookpointから物理削除します.
764     *
765     * @param int $plugin_id プラグインID.
766     * @param string $plugin_code プラグインコード.
767     * @return array $arrErr エラー情報を格納した連想配列.
768     */
769    function deletePlugin($plugin_id, $plugin_code) {
770        $arrErr = array();
771
772        $objQuery =& SC_Query_Ex::getSingletonInstance();
773        $objQuery->begin();
774        $where = 'plugin_id = ?';
775        $objQuery->delete('dtb_plugin', $where, array($plugin_id));
776        $objQuery->delete('dtb_plugin_hookpoint', $where, array($plugin_id));
777
778        if ($objQuery->commit()) {
779            if (SC_Utils_Ex::deleteFile($this->getPluginDir($plugin_code)) === false) {
780                // TODO エラー処理
781            }
782
783            if (SC_Utils_Ex::deleteFile($this->getHtmlPluginDir($plugin_code)) === false) {
784                // TODO エラー処理
785            }       
786        }
787        return $arrErr;
788    }
789
790    /**
791     * ファイルがあるかを判定します.
792     *
793     * @param string $plugin_dir 対象ディレクトリ.
794     * @param string $file_name ファイル名.
795     * @return boolean
796     */
797    function isContainsFile($plugin_dir, $file_name) {
798        if (file_exists($plugin_dir) && is_dir($plugin_dir)) {
799            if ($handle = opendir($plugin_dir)) {
800                while (($item = readdir($handle)) !== false) {
801                    if ($item === $file_name) return true;
802                }
803            }
804            closedir($handle);
805        }
806        return false;
807    }
808
809    /**
810     * アーカイブ内に指定のファイルが存在するかを判定します.
811     *
812     * @param Archive_Tar $tar_obj
813     * @param string $file_path 判定するファイルパス
814     * @return boolean
815     */
816    function checkContainsFile($tar_obj, $file_path) {
817        // ファイル一覧を取得
818        $arrayFile = $tar_obj->listContent();
819        foreach ($arrayFile as  $value) {
820            if($value['filename'] === $file_path) return true;
821        }
822        return false;
823    }
824
825    /**
826     * ディレクトリを作成します.
827     *
828     * @param string $dir_path 作成するディレクトリのパス
829     * @return void
830     */
831    function makeDir($dir_path) {
832        // ディレクトリ作成
833        if (!file_exists($dir_path)) {
834            mkdir($dir_path);
835        }
836    }
837
838    /**
839     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
840     *
841     * @param int $plugin_id プラグインID
842     * @return string $conflict_alert_message メッセージ
843     */
844    function checkConflictPlugin($plugin_id) {
845        // フックポイントを取得します.
846        $hookPoints = $this->getHookPoint($plugin_id);
847
848        $conflict_alert_message = '';
849        $arrConflictPluginName = array();
850        $objQuery =& SC_Query_Ex::getSingletonInstance();
851        foreach ($hookPoints as $hookPoint) {
852            // 競合するプラグインを取得する,
853            $table = 'dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 ON T1.plugin_id = T2.plugin_id';
854            $where = 'T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = ' . PLUGIN_ENABLE_TRUE . ' GROUP BY T1.plugin_id';
855            $conflictPlugins = $objQuery->select('T1.plugin_id, T2.plugin_name', $table, $where, array($hookPoint['hook_point'], $hookPoint['plugin_id']));
856
857            // プラグイン名重複を削除する為、専用の配列に格納し直す.
858            foreach ($conflictPlugins as $conflictPlugin) {
859                // プラグイン名が見つからなければ配列に格納
860                if (!in_array($conflictPlugin['plugin_name'], $arrConflictPluginName)) {
861                    $arrConflictPluginName[] = $conflictPlugin['plugin_name'];
862                }
863            }
864        }
865        // メッセージをセットします.
866        foreach ($arrConflictPluginName as $conflictPluginName) {
867            $conflict_alert_message .= '* ' .  $conflictPluginName . 'と競合する可能性があります。<br/>';
868        }
869        return $conflict_alert_message;
870    }
871
872    /**
873     * エラー情報が格納されているか判定します.
874     *
875     * @param array $arrErr エラー情報を格納した連想配列.
876     * @return boolean.
877     */
878    function isError($error) {
879        if (is_array($error) && count($error) > 0) {
880            return true;
881        }
882        return false;
883    }
884
885    /**
886     * プラグインIDからフックポイントを取得します,
887     *
888     * @param string $plugin_id プラグインID
889     * @return array フックポイントの連想配列.
890     */
891    function getHookPoint($plugin_id) {
892        $objQuery =& SC_Query_Ex::getSingletonInstance();
893
894        $table = 'dtb_plugin_hookpoint';
895        $where = 'plugin_id = ?';
896        return $objQuery->select('*', $table, $where, array($plugin_id));
897    }
898}
Note: See TracBrowser for help on using the repository browser.