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

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