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

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