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

Revision 21707, 37.4 KB checked in by Yammy, 10 years ago (diff)

プラグイン有効化時のエラー修正

refs #1729

  • 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) {
412            SC_Plugin_Util_Ex::deletePluginByPluginId($plugin_id);
413        }
414        // htmlディレクトリを削除
415        if (empty($plugin_html_dir) === false) {
416            SC_Utils_Ex::deleteFile($plugin_html_dir, true);
417        }
418    }
419
420    /**
421     * プラグインクラス内の定数をチェックします.
422     *
423     * @param ReflectionClass $objReflection リフレクションオブジェクト
424     * @return array エラー情報を格納した連想配列.
425     */
426    function checkPluginConstants(ReflectionClass $objReflection, $unpack_dir) {
427        $arrErr = array();
428        $plugin_code = $objReflection->getConstant('PLUGIN_CODE');
429        if ($plugin_code === false) {
430            $arrErr['plugin_file'] = '※ PLUGIN_CODEが定義されていません。<br/>';
431            return $arrErr;
432        }
433        $plugin_name = $objReflection->getConstant('PLUGIN_NAME');
434        if ($plugin_name === false) {
435            $arrErr['plugin_file'] = '※ PLUGIN_NAMEが定義されていません。<br/>';
436            return $arrErr;
437        }
438        $class_name = $objReflection->getConstant('CLASS_NAME') . '.php';
439        if ($class_name === false ||file_exists($unpack_dir . $class_name) === false) {
440            $arrErr['plugin_file'] = '※ CLASS_NAMEが定義されていません。またはCLASS_NAMEが正しく定義されていません。<br/>';
441            return $arrErr;
442        }
443        if ($objReflection->getConstant('PLUGIN_VERSION') === false) {
444            $arrErr['plugin_file'] = '※ PLUGIN_VERSIONが定義されていません。<br/>';
445            return $arrErr;
446        }
447        if ($objReflection->getConstant('COMPLIANT_VERSION') === false) {
448            $arrErr['plugin_file'] = '※ COMPLIANT_VERSIONが定義されていません。<br/>';
449            return $arrErr;
450        }
451        if ($objReflection->getConstant('AUTHOR') === false) {
452            $arrErr['plugin_file'] = '※ AUTHORが定義されていません。<br/>';
453            return $arrErr;
454        }
455        if ($objReflection->getConstant('DESCRIPTION') === false) {
456            $arrErr['plugin_file'] = '※ DESCRIPTIONが定義されていません。<br/>';
457            return $arrErr;
458        }
459        $objErr = new SC_CheckError_Ex($objReflection->getConstants());
460        $objErr->doFunc(array('PLUGIN_CODE', 'PLUGIN_CODE', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
461        $objErr->doFunc(array('PLUGIN_NAME', 'PLUGIN_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK'));
462        $objErr->doFunc(array('CLASS_NAME', 'CLASS_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
463        $objErr->doFunc(array('PLUGIN_VERSION', 'PLUGIN_VERSION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
464        $objErr->doFunc(array('COMPLIANT_VERSION', 'COMPLIANT_VERSION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
465        $objErr->doFunc(array('AUTHOR', 'AUTHOR', STEXT_LEN), array('MAX_LENGTH_CHECK'));
466        $objErr->doFunc(array('DESCRIPTION', 'DESCRIPTION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
467        if ($objReflection->getConstant('PLUGIN_SITE_URL') !== false) {
468            $objErr->doFunc(array('PLUGIN_SITE_URL', 'PLUGIN_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
469        }
470        if ($objReflection->getConstant('AUTHOR_SITE_URL') !== false) {
471            $objErr->doFunc(array('AUTHOR_SITE_URL', 'AUTHOR_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
472        }
473        // エラー内容を出力用の配列にセットします.
474        if ($this->isError($objErr->arrErr)) {
475            $arrErr['plugin_file'] = '';
476            foreach ($objErr->arrErr as $error) {
477                    $arrErr['plugin_file'] .= $error;
478            }
479        }
480        return $arrErr;
481    }
482
483    /**
484     * プラグインをアップデートします.
485     *
486     * @param string $target_plugin アップデートするプラグインコード.
487     * @param string $upload_file_name アップロードファイル名.
488     * @return array エラー情報を格納した連想配列.
489     */
490    function updatePlugin($target_plugin, $upload_file_name) {
491        $arrErr = array();
492
493        // ファイルをチェックし展開します.
494        $arrErr = $this->unpackPluginFile($upload_file_name, DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, $target_plugin['plugin_code']);
495        if ($this->isError($arrErr) === true) {
496            return $arrErr;
497        }
498
499        // plugin_infoを読み込み.
500        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . 'plugin_info.php', $target_plugin['plugin_code']);
501        if ($this->isError($arrErr) === true) {
502            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
503            return $arrErr;
504        }
505
506        // リフレクションオブジェクトを生成.
507        $objReflection = new ReflectionClass('plugin_info');
508        // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
509        $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
510        if ($this->isError($arrErr) === true) {
511            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
512            return $arrErr;
513        }
514
515        // プラグインのクラス名を取得;
516         $class_name = $objReflection->getConstant('CLASS_NAME');
517
518        // 展開されたディレクトリからプラグインクラスファイルを読み込みます.
519        $update_plugin_class_path = DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . $class_name . '.php';
520        $arrErr = $this->requirePluginFile($update_plugin_class_path, $target_plugin['plugin_code']);
521        if ($this->isError($arrErr) === true) {
522            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
523            return $arrErr;
524        }
525        // プラグインクラスファイルのUPDATE処理を実行.
526        $arrErr = $this->execPlugin($target_plugin, $class_name, 'update');
527
528        // 保存ディレクトリの削除.
529        SC_Utils_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, false);
530
531        return $arrErr;
532    }
533
534    /**
535     * ファイルをアップロードし、解凍先のディレクトリに解凍します.
536     *
537     * @param string $unpack_file_name 解凍ファイル名
538     * @param string $unpack_dir 解凍先ディレクトリ
539     * @param string $file_key ファイルキー
540     * @return array エラー情報を格納した連想配列.
541     */
542    function unpackPluginFile($unpack_file_name, $unpack_dir, $file_key) {
543        $arrErr = array();
544        // 解凍ディレクトリディレクトリを作成し、一時ディレクトリからファイルを移動
545        $objUpFile = new SC_UploadFile_Ex(PLUGIN_TEMP_REALDIR, $unpack_dir);
546        $this->initUploadFile($objUpFile, $file_key);
547        $arrErr = $objUpFile->makeTempFile($file_key, false);
548        if ($this->isError($arrErr) === true) {
549            return $arrErr;
550        }
551
552        // 正常にアップロードされているかをチェック.
553        $arrErr = $objUpFile->checkEXISTS($file_key);
554        if ($this->isError($arrErr) === true) {
555            return $arrErr;
556        }
557        $objUpFile->moveTempFile();
558        // 解凍
559        $update_plugin_file_path = $unpack_dir . $unpack_file_name;
560        if (!SC_Helper_FileManager_Ex::unpackFile($update_plugin_file_path)) {
561            $arrErr['plugin_file'] = '※ 解凍に失敗しました。<br/>';
562            return $arrErr;
563        }
564        return $arrErr;
565    }
566
567    /**
568     * プラグインをアンインストールします.
569     *
570     * @param array $plugin プラグイン情報を確認した連想配列.
571     * @return array エラー情報を格納した連想配列.
572     */
573    function uninstallPlugin($plugin) {
574        $arrErr = array();
575        // プラグインファイルを読み込みます.
576        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
577        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
578        if ($this->isError($arrErr) === true) {
579            return $arrErr;
580        }
581
582        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'uninstall');
583        if ($this->isError($arrErr) === true) {
584            return $arrErr;
585        }
586        // プラグインの削除処理.
587        $arrErr = $this->deletePlugin($plugin['plugin_id'], $plugin['plugin_code']);
588
589        return $arrErr;
590    }
591
592    /**
593     * プラグインを有効にします.
594     *
595     * @param array $plugin プラグイン情報を確認した連想配列.
596     * @return array $arrErr エラー情報を格納した連想配列.
597     */
598    function enablePlugin($plugin) {
599        $arrErr = array();
600        // クラスファイルを読み込み.
601        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
602        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
603        if ($this->isError($arrErr) === true) {
604            return $arrErr;
605        }
606        // 有効化処理を実行します.
607        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'enable');
608        if ($this->isError($arrErr) === true) {
609            return $arrErr;
610        }
611        // プラグインを有効にします.
612        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_TRUE);
613
614        return $arrErr;
615    }
616
617    /**
618     * プラグインを無効にします.
619     *
620     * @param array $plugin プラグイン情報を確認した連想配列.
621     * @return array $arrErr エラー情報を格納した連想配列.
622     */
623    function disablePlugin($plugin) {
624        $arrErr = array();
625        // クラスファイルを読み込み.
626        $plugin_class_file_path = PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'] . '/' . $plugin['class_name'] . '.php';
627        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
628        if ($this->isError($arrErr) === true) {
629            return $arrErr;
630        }
631
632        // 無効化処理を実行します.
633        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'disable');
634        if ($this->isError($arrErr) === true) {
635            return $arrErr;
636        }
637        // プラグインを無効にします.
638        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_FALSE);
639
640        return $arrErr;
641    }
642
643    /**
644     * 優先度を更新します.
645     *
646     * @param int $plugin_id プラグインID
647     * @param int $priority 優先度
648     * @return integer 更新件数
649     */
650    function updatePriority($plugin_id, $priority) {
651        $objQuery =& SC_Query_Ex::getSingletonInstance();
652        // UPDATEする値を作成する。
653        $sqlval['priority'] = $priority;
654        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
655        $where = 'plugin_id = ?';
656        // UPDATEの実行
657        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
658        return $ret;
659    }
660
661    /**
662     * プラグイン情報をDB登録.
663     *
664     * @param ReflectionClass $objReflection リフレクションオブジェクト
665     * @return array エラー情報を格納した連想配列.
666     */
667    function registerData(ReflectionClass $objReflection) {
668
669        // プラグイン情報をDB登録.
670        $objQuery =& SC_Query_Ex::getSingletonInstance();
671        $objQuery->begin();
672        $arr_sqlval_plugin = array();
673        $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id');
674        $arr_sqlval_plugin['plugin_id'] = $plugin_id;
675        $arr_sqlval_plugin['plugin_name'] = $objReflection->getConstant('PLUGIN_NAME');
676        $arr_sqlval_plugin['plugin_code'] = $objReflection->getConstant('PLUGIN_CODE');
677        $arr_sqlval_plugin['class_name'] = $objReflection->getConstant('CLASS_NAME');
678        $arr_sqlval_plugin['author'] = $objReflection->getConstant('AUTHOR');
679        // AUTHOR_SITE_URLが定義されているか判定.
680        $author_site_url = $objReflection->getConstant('AUTHOR_SITE_URL');
681        if ($author_site_url !== false) {
682            $arr_sqlval_plugin['author_site_url'] = $author_site_url;
683        }
684        // PLUGIN_SITE_URLが定義されているか判定.
685        $plugin_site_url = $objReflection->getConstant('PLUGIN_SITE_URL');
686        if ($plugin_site_url !== false) {
687            $arr_sqlval_plugin['plugin_site_url'] = $plugin_site_url;
688        }
689        $arr_sqlval_plugin['plugin_version'] = $objReflection->getConstant('PLUGIN_VERSION');
690        $arr_sqlval_plugin['compliant_version'] = $objReflection->getConstant('COMPLIANT_VERSION');
691        $arr_sqlval_plugin['plugin_description'] = $objReflection->getConstant('DESCRIPTION');
692        $arr_sqlval_plugin['priority'] = 0;
693        $arr_sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE;
694        $arr_sqlval_plugin['update_date'] = 'CURRENT_TIMESTAMP';
695        $objQuery->insert('dtb_plugin', $arr_sqlval_plugin);
696
697        // フックポイントをDB登録.
698        $hook_point = $objReflection->getConstant('HOOK_POINTS');
699        if ($hook_point !== false) {
700            $array_hook_point = explode(',', $hook_point);
701            if (is_array($array_hook_point)) {
702                foreach ($array_hook_point as $hook_point) {
703                    $arr_sqlval_plugin_hookpoint = array();
704                    $id = $objQuery->nextVal('dtb_plugin_hookpoint_plugin_hookpoint_id');
705                    $arr_sqlval_plugin_hookpoint['plugin_hookpoint_id'] = $id;
706                    $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
707                    $arr_sqlval_plugin_hookpoint['hook_point'] = $hook_point;
708                    $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
709                    $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint);
710                }
711            }
712        }
713        return $objQuery->commit();
714    }
715
716    /**
717     * ファイルを読み込む.
718     *
719     * @param string $file_path クラスのpath
720     * @param string $key エラー情報のキー.
721     * @return array $arrErr エラー情報を格納した連想配列.
722     */
723    function requirePluginFile($file_path, $key) {
724        $arrErr = array();
725        if (file_exists($file_path)) {
726            require_once $file_path;
727        } else {
728            $arrErr[$key] = '※ ' . $file_path .'の読み込みに失敗しました。<br/>';
729        }
730        return $arrErr;
731    }
732
733    /**
734     * インスタンスを生成し、指定のメソッドを実行する.
735     *
736     * @param integer $plugin プラグイン情報
737     * @param string $plugin_code プラグインコード
738     * @param string $exec_func 実行するメソッド名.
739     * @return array $arrErr エラー情報を格納した連想配列.
740     *
741     */
742    function execPlugin($plugin, $class_name, $exec_func) {
743        $arrErr = array();
744        if (method_exists($class_name, $exec_func) === true) {
745            call_user_func(array($class_name, $exec_func), $plugin);
746        } else {
747            $arrErr['plugin_error'] = '※ ' . $class_name . '.php に' . $exec_func . 'が見つかりません。<br/>';
748        }
749        return $arrErr;
750    }
751
752    /**
753     * plugin_idをキーにdtb_pluginのstatusを更新します.
754     *
755     * @param int $plugin_id プラグインID
756     * @param int $enable_flg 有効フラグ
757     * @return integer 更新件数
758     */
759    function updatePluginEnable($plugin_id, $enable_flg) {
760        $objQuery =& SC_Query_Ex::getSingletonInstance();
761        // UPDATEする値を作成する。
762        $sqlval['enable'] = $enable_flg;
763        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
764        $where = 'plugin_id = ?';
765        // UPDATEの実行
766        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
767        return $ret;
768    }
769
770    /**
771     * plugin_idをキーにdtb_plugin, dtb_plugin_hookpointから物理削除します.
772     *
773     * @param int $plugin_id プラグインID.
774     * @param string $plugin_code プラグインコード.
775     * @return array $arrErr エラー情報を格納した連想配列.
776     */
777    function deletePlugin($plugin_id, $plugin_code) {
778        $arrErr = array();
779
780        $objQuery =& SC_Query_Ex::getSingletonInstance();
781        $objQuery->begin();
782        $where = 'plugin_id = ?';
783        $objQuery->delete('dtb_plugin', $where, array($plugin_id));
784        $objQuery->delete('dtb_plugin_hookpoint', $where, array($plugin_id));
785
786        if ($objQuery->commit()) {
787            if (SC_Utils_Ex::deleteFile($this->getPluginDir($plugin_code)) === false) {
788                // TODO エラー処理
789            }
790
791            if (SC_Utils_Ex::deleteFile($this->getHtmlPluginDir($plugin_code)) === false) {
792                // TODO エラー処理
793            }       
794        }
795        return $arrErr;
796    }
797
798    /**
799     * ファイルがあるかを判定します.
800     *
801     * @param string $plugin_dir 対象ディレクトリ.
802     * @param string $file_name ファイル名.
803     * @return boolean
804     */
805    function isContainsFile($plugin_dir, $file_name) {
806        if (file_exists($plugin_dir) && is_dir($plugin_dir)) {
807            if ($handle = opendir($plugin_dir)) {
808                while (($item = readdir($handle)) !== false) {
809                    if ($item === $file_name) return true;
810                }
811            }
812            closedir($handle);
813        }
814        return false;
815    }
816
817    /**
818     * アーカイブ内に指定のファイルが存在するかを判定します.
819     *
820     * @param Archive_Tar $tar_obj
821     * @param string $file_path 判定するファイルパス
822     * @return boolean
823     */
824    function checkContainsFile($tar_obj, $file_path) {
825        // ファイル一覧を取得
826        $arrayFile = $tar_obj->listContent();
827        foreach ($arrayFile as  $value) {
828            if ($value['filename'] === $file_path) return true;
829        }
830        return false;
831    }
832
833    /**
834     * ディレクトリを作成します.
835     *
836     * @param string $dir_path 作成するディレクトリのパス
837     * @return void
838     */
839    function makeDir($dir_path) {
840        // ディレクトリ作成
841        if (!file_exists($dir_path)) {
842            mkdir($dir_path);
843        }
844    }
845
846    /**
847     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
848     *
849     * @param int $plugin_id プラグインID
850     * @return string $conflict_alert_message メッセージ
851     */
852    function checkConflictPlugin($plugin_id) {
853        // フックポイントを取得します.
854        $hookPoints = $this->getHookPoint($plugin_id);
855
856        $conflict_alert_message = '';
857        $arrConflictPluginName = array();
858        $objQuery =& SC_Query_Ex::getSingletonInstance();
859        foreach ($hookPoints as $hookPoint) {
860            // 競合するプラグインを取得する,
861            $table = 'dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 USING(plugin_id)';
862            $where = 'T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = ' . PLUGIN_ENABLE_TRUE;
863            $objQuery->setGroupBy('T1.plugin_id, T2.plugin_name');
864            $conflictPlugins = $objQuery->select('T1.plugin_id, T2.plugin_name', $table, $where, array($hookPoint['hook_point'], $hookPoint['plugin_id']));
865
866            // プラグイン名重複を削除する為、専用の配列に格納し直す.
867            foreach ($conflictPlugins as $conflictPlugin) {
868                // プラグイン名が見つからなければ配列に格納
869                if (!in_array($conflictPlugin['plugin_name'], $arrConflictPluginName)) {
870                    $arrConflictPluginName[] = $conflictPlugin['plugin_name'];
871                }
872            }
873        }
874        // メッセージをセットします.
875        foreach ($arrConflictPluginName as $conflictPluginName) {
876            $conflict_alert_message .= '* ' .  $conflictPluginName . 'と競合する可能性があります。<br/>';
877        }
878        return $conflict_alert_message;
879    }
880
881    /**
882     * エラー情報が格納されているか判定します.
883     *
884     * @param array $arrErr エラー情報を格納した連想配列.
885     * @return boolean.
886     */
887    function isError($error) {
888        if (is_array($error) && count($error) > 0) {
889            return true;
890        }
891        return false;
892    }
893
894    /**
895     * プラグインIDからフックポイントを取得します,
896     *
897     * @param string $plugin_id プラグインID
898     * @return array フックポイントの連想配列.
899     */
900    function getHookPoint($plugin_id) {
901        $objQuery =& SC_Query_Ex::getSingletonInstance();
902
903        $table = 'dtb_plugin_hookpoint';
904        $where = 'plugin_id = ?';
905        return $objQuery->select('*', $table, $where, array($plugin_id));
906    }
907}
Note: See TracBrowser for help on using the repository browser.