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

Revision 21501, 35.8 KB checked in by h_yoshimoto, 10 years ago (diff)

#1632 優先度変更処理、各エラー処理、アラート処理の実装

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