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

Revision 21725, 36.2 KB checked in by adachi, 12 years ago (diff)

#1692 Descriptionの文字長をMTEXT_LENへ変更

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