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

Revision 21490, 35.2 KB checked in by Seasoft, 10 years ago (diff)

#1637 (クラスのオートローディング)

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