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

Revision 21603, 36.4 KB checked in by h_yoshimoto, 12 years ago (diff)

#1603 不要な処理を削除

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