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

Revision 21455, 30.9 KB checked in by h_yoshimoto, 12 years ago (diff)

#1603 #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                $plugin_file = $_FILES[$file_key];
83                $this->arrErr = $this->checkUploadFile($plugin_file, $file_key);
84                if($this->isError($this->arrErr) === false){
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                    $file_key = "update_plugin_file";
162                    $update_plugin_file = $_FILES[$file_key];
163                   
164                    $this->arrErr = $this->checkUploadFile($update_plugin_file, $file_key);
165                    if($this->isError($this->arrErr) === false){
166                        $update_plugin_file_name = $update_plugin_file['name']; // アップデートファイルのファイル名.
167                        $update_plugin_code = $this->getPluginCode($update_plugin_file_name); // アップデートファイルのプラグインコード.
168                        $plugin_code = $objFormParam->getValue('plugin_code'); // アップデート対象のプラグインコード
169                       
170                        // インストールされているプラグインかを判定.
171                        if($this->isInstalledPlugin($update_plugin_code) === true && $update_plugin_code === $plugin_code){
172                            // インストール処理.
173                            $this->arrErr = $this->updatePlugin($plugin_code, $update_plugin_file_name, $file_key, $objFormParam->getValue('plugin_id'));
174                            if($this->isError($this->arrErr) === false) {
175                                // テンプレート再生成.
176                                $this->remakeTemplate();
177                                $this->tpl_onload = "alert('プラグインをアップデートしました。');";
178                            }
179                        } else {
180                            $this->arrErr[$file_key] = "※ プラグインファイルが不正です。<br/>";
181                        }
182                    }
183                }
184
185                break;
186            // 優先度.
187            case 'priority':
188                // TODO 優先度の変更処理.
189//                // 優先度を取得
190//                $priority_array = $objFormParam->getValue('priority');
191//               
192//                // 優先度の更新
193//                $objQuery =& SC_Query_Ex::getSingletonInstance();
194//                foreach ($priority_array as $key => $value) {
195//                    $sqlval['rank'] = $value;
196//                    $objQuery->update("dtb_plugin", $sqlval, "plugin_id = ?", array($key));
197//                }
198//                break;
199            default:
200                break;
201        }
202
203        // DBからプラグイン情報を取得
204        $plugins = SC_Helper_Plugin_Ex::getAllPlugin();
205
206        foreach ($plugins as $key => $plugin) {
207            // 設定ファイルがあるかを判定.
208            $plugins[$key]['config_flg'] = $this->isContainsFile(PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'], "config.php");
209            if($plugins[$key]['enable'] === PLUGIN_ENABLE_TRUE){
210                // 競合するプラグインがあるかを判定.
211                $plugins[$key]['conflict_message']= $this->checkConflictPlugin($plugin['plugin_id']);
212            }
213        }
214        $this->plugins = $plugins;
215    }
216
217    /**
218     * デストラクタ.
219     *
220     * @return void
221     */
222    function destroy() {
223        parent::destroy();
224    }
225
226    /**
227     * パラメーター初期化.
228     *
229     * @param object $objFormParam
230     * @return void
231     *
232     */
233    function lfInitParam(&$objFormParam) {
234        $objFormParam->addParam('mode', 'mode', INT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
235        $objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
236        $objFormParam->addParam('plugin_code', 'plugin_code', MTEXT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
237        $objFormParam->addParam("優先順位", "priority", INT_LEN, 'n', array("NUM_CHECK", 'MAX_LENGTH_CHECK'));
238    }
239
240    /**
241     * ファイルパラメーター初期化.
242     *
243     * @param object $objUpFile SC_UploadFileのインスタンス.
244     * @param string $key 登録するキー.
245     * @return void
246     */
247    function lfInitUploadFile(&$objUpFile, $key) {
248        $objUpFile->addFile("プラグインファイル", $key, array('tar', 'tar.gz'), FILE_SIZE, true, 0, 0, false);
249    }
250
251    /**
252     * ファイルが指定されている事をチェックします.
253     *
254     * @param string $file ファイル
255     * @param string $file_key ファイルキー
256     * @return array エラー情報を格納した連想配列.
257     */
258    function checkUploadFile($file, $file_key) {
259        $arrErr = array();
260       
261        if ($file['size'] <= 0) {
262            $arrErr[$file_key] = '※ ファイルがアップロードされていません';
263        }
264        return $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     * @param string $upload_file_name アップロードファイル名
313     * @return string プラグインコード.
314     */
315    function getPluginCode($upload_file_name) {
316        $array_ext = explode(".", $upload_file_name);
317        return $array_ext[0];
318    }
319
320    /**
321     * プラグイン保存ディレクトリのパスを取得する.
322     *
323     * @param string $plugin_code プラグインコード
324     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
325     */
326    function getPluginDir($plugin_code) {
327        $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/';
328        return $plugin_dir_path;
329    }
330   
331    /**
332     * プラグインHTMLディレクトリのパスを取得する.
333     *
334     * @param string $plugin_code プラグインコード
335     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
336     */
337    function getHtmlPluginDir($plugin_code) {
338        $plugin_dir_path = PLUGIN_HTML_REALDIR . $plugin_code . '/';
339        return $plugin_dir_path;
340    }
341
342    /**
343     * プラグインファイルのパスを取得する.
344     *
345     * @param string $plugin_code プラグインコード
346     * @return string $plugin_file_path クラスファイルのパス.
347     */
348    function getPluginFilePath($plugin_code) {
349        $plugin_file_path = $this->getPluginDir($plugin_code) . $plugin_code . '.php';
350        return $plugin_file_path;
351    }
352   
353    /**
354     * プラグインをインストールします.
355     *
356     * @param string $plugin_code プラグインコード.
357     * @param string $plugin_file_name プラグインファイル名.
358     * @return array エラー情報を格納した連想配列.
359     */
360    function installPlugin($plugin_code, $plugin_file_name) {
361       
362        $arrErr = array();
363        // 保存ディレクトリ.
364        $plugin_dir = $this->getPluginDir($plugin_code);
365       
366        // ファイルをチェックし展開します.
367        $arrErr = $this->unpackPluginFile($plugin_file_name, $plugin_dir, $plugin_code, "plugin_file");
368        if ($this->isError($arrErr) === true) {
369            return $arrErr;
370        }
371       
372        // プラグインファイルを読み込み.
373        $plugin_class_file_path = $this->getPluginFilePath($plugin_code);
374        $arrErr = $this->requirePluginFile($plugin_class_file_path, "plugin_file");
375        if ($this->isError($arrErr) === true) {
376            return $arrErr;
377        }
378
379        // プラグイン情報をDB登録
380        if ($this->registData($plugin_code) === false) {
381            $arrErr['plugin_file'] = "※ DB登録に失敗しました。<br/>";
382            return $arrErr;
383        }
384
385        // プラグインhtmlディレクトリ作成
386        $plugin_html_dir = PLUGIN_HTML_REALDIR . $plugin_code;
387        $this->makeDir($plugin_html_dir);
388       
389        $plugin = SC_Helper_Plugin_Ex::getPluginByPluginCode($plugin_code);
390        $arrErr = $this->execPlugin($plugin['plugin_id'], $plugin_code, "install");
391
392        return $arrErr;
393    }
394   
395    /**
396     * プラグインをアップデートします.
397     *
398     * @param string $plugin_code プラグインコード.
399     * @param string $plugin_file_name プラグインファイル名.
400     * @param string $file_key ファイルキー.
401     * @param string $plugin_id プラグインID.
402     * @return array エラー情報を格納した連想配列.
403     */
404    function updatePlugin($plugin_code, $plugin_file_name, $file_key, $plugin_id) {
405        // アップロードしたファイルのエラーチェック.
406        $arrErr = array();
407       
408        // 展開先ディレクトリ.
409        $temp_plugin_dir = DOWNLOADS_TEMP_DIR . $plugin_code;
410       
411        // ファイルをチェックし展開します.
412        $arrErr = $this->unpackPluginFile($plugin_file_name, $temp_plugin_dir, $plugin_code, $file_key);
413        if ($this->isError($arrErr) === true) {
414            return $arrErr;
415        }
416       
417        // 展開されたディレクトリからプラグインクラスファイルを読み込みます.
418        $update_plugin_class_path = $temp_plugin_dir . "/" . $plugin_code . ".php";
419        $arrErr = $this->requirePluginFile($update_plugin_class_path, $file_key);
420        if ($this->isError($arrErr) === true) {
421            return $arrErr;
422        }
423        // プラグインクラスファイルのUPDATE処理を実行.
424        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "update");
425       
426        // 保存ディレクトリの削除.
427        SC_Utils_Ex::deleteFile($temp_plugin_dir);
428
429        return $arrErr;
430    }
431   
432    /**
433     * ファイルをアップロードし、解凍先のディレクトリに解凍します.
434     *
435     * @param string $unpack_file_name ファイル名
436     * @param string $unpack_dir 解凍ディレクトリ
437     * @param string $plugin_code プラグインコード.
438     * @param string $file_key ファイルキー
439     * @return array エラー情報を格納した連想配列.
440     */
441    function unpackPluginFile($unpack_file_name, $unpack_dir, $plugin_code, $file_key) {
442        $arrErr = array();
443        // 解凍ディレクトリディレクトリを作成し、一時ディレクトリからファイルを移動
444        $objUpFile = new SC_UploadFile_Ex(PLUGIN_TEMP_REALDIR, $unpack_dir);
445        $this->lfInitUploadFile($objUpFile, $file_key);
446        $arrErr = $objUpFile->makeTempFile($file_key, false);
447        if ($this->isError($arrErr) === true) {
448            return $arrErr;
449        }
450
451        // 正常にアップロードされているかをチェック.
452        $arrErr = $objUpFile->checkEXISTS($file_key);
453        if ($this->isError($arrErr) === true) {
454            return $arrErr;
455        }
456
457        // 圧縮ファイルの中をチェック.
458        $plugin_file_path = PLUGIN_TEMP_REALDIR . $unpack_file_name;
459        $arrErr = $this->checkPluginFile($plugin_file_path, $plugin_code, $file_key);
460        if ($this->isError($arrErr) === true) {
461            return $arrErr;
462        }
463
464        // 展開用ディレクトリを作成し、一時ディレクトリから移動
465        $this->makeDir($unpack_dir);
466        $objUpFile->moveTempFile();
467       
468        // 解凍
469        $update_plugin_file_path = $unpack_dir . "/" . $unpack_file_name;
470        if (!SC_Helper_FileManager_Ex::unpackFile($update_plugin_file_path)) {
471            $arrErr['plugin_file'] = "※ 解凍に失敗しました。<br/>";
472            return $arrErr;
473        }
474        return $arrErr;
475    }
476   
477    /**
478     * プラグインをアンインストールします.
479     *
480     * @param int $plugin_id プラグインID.
481     * @param string $plugin_code プラグインコード.
482     * @return array エラー情報を格納した連想配列.
483     */
484    function uninstallPlugin($plugin_id, $plugin_code) {
485        $arrErr = array();
486        // プラグインファイルを読み込みます.
487        $plugin_class_path = $this->getPluginFilePath($plugin_code);
488        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
489        if ($this->isError($arrErr) === true) {
490            return $arrErr;
491        }
492       
493        // modeで指定されたメソッドを実行.
494        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "uninstall");
495        if ($this->isError($arrErr) === true) {
496            return $arrErr;
497        }
498        // プラグインの削除処理.
499        $arrErr = $this->deletePlugin($plugin_id, $plugin_code);
500       
501        return $arrErr;
502    }
503   
504    /**
505     * プラグインを有効にします.
506     *
507     * @param int $plugin_id プラグインID.
508     * @param string $plugin_code プラグインコード.
509     * @return array $arrErr エラー情報を格納した連想配列.
510     */
511    function enablePlugin($plugin_id, $plugin_code) {
512        $arrErr = array();
513        // クラスファイルを読み込み.
514        $plugin_class_path = $this->getPluginFilePath($plugin_code);
515        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
516        if ($this->isError($arrErr) === true) {
517            return $arrErr;
518        }
519        // 無効化処理を実行します.
520        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "enable");
521        if ($this->isError($arrErr) === true) {
522            return $arrErr;
523        }
524        // プラグインを有効にします.
525        $this->updatePluginEnable($plugin_id, PLUGIN_ENABLE_TRUE);
526       
527        return $arrErr;
528    }
529   
530    /**
531     * プラグインを無効にします.
532     *
533     * @param int $plugin_id プラグインID.
534     * @param string $plugin_code プラグインコード.
535     * @return array エラー情報を格納した連想配列.
536     */
537    function disablePlugin($plugin_id, $plugin_code) {
538        $arrErr = array();
539        // クラスファイルを読み込み.
540        $plugin_class_path = $this->getPluginFilePath($plugin_code);
541        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
542        if ($this->isError($arrErr) === true) {
543            return $arrErr;
544        }
545       
546        // 無効化処理を実行します.
547        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "disable");
548        if ($this->isError($arrErr) === true) {
549            return $arrErr;
550        }
551        // プラグインを無効にします.
552        $this->updatePluginEnable($plugin_id, PLUGIN_ENABLE_FALSE);
553       
554        return $arrErr;
555    }
556
557    /**
558     * プラグイン情報をDB登録.
559     *
560     * @param string $plugin_code プラグインコード.
561     * @return array エラー情報を格納した連想配列.
562     */
563    function registData($plugin_code) {
564       
565        // プラグイン情報をDB登録.
566        // TODO:エラーチェック.
567        $objQuery =& SC_Query_Ex::getSingletonInstance();
568        $objQuery->begin();
569        $sqlval_plugin = array();
570        $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id');
571        $sqlval_plugin['plugin_id'] = $plugin_id;
572        $sqlval_plugin['plugin_name'] = $plugin_code::PLUGIN_NAME;
573        $sqlval_plugin['plugin_code'] = $plugin_code;
574        $sqlval_plugin['author'] = $plugin_code::AUTHOR;
575        $sqlval_plugin['plugin_site_url'] = $plugin_code::PLUGIN_SITE_URL;
576        $sqlval_plugin['plugin_version'] = $plugin_code::PLUGIN_VERSION;
577        $sqlval_plugin['compliant_version'] = $plugin_code::COMPLIANT_VERSION;
578        $sqlval_plugin['plugin_description'] = $plugin_code::DESCRIPTION;
579        $sqlval_plugin['rank'] = 1 + $objQuery->max('rank', 'dtb_plugin');
580        $sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE;
581        $sqlval_plugin['update_date'] = 'CURRENT_TIMESTAMP';
582        $objQuery->insert('dtb_plugin', $sqlval_plugin);
583
584        // フックポイントをDB登録.
585        $array_hook_point = explode(",", $plugin_code::HOOK_POINTS);
586        if(is_array($array_hook_point)){
587            foreach ($array_hook_point as $hook_point) {
588                $sqlval_plugin_hookpoint = array();
589                $sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
590                $sqlval_plugin_hookpoint['hook_point'] = $hook_point;
591                $sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
592                $objQuery->insert('dtb_plugin_hookpoint', $sqlval_plugin_hookpoint);
593            }
594        }
595        return $objQuery->commit();
596    }
597
598    /**
599     * ファイルを読み込む.
600     *
601     * @param string $file_path クラスのpath
602     * @param string $key エラー情報のキー.
603     * @return array エラー情報を格納した連想配列.
604     */
605    function requirePluginFile($file_path, $key) {
606        $arrErr = array();
607        if(file_exists($file_path)) {
608            require_once $file_path;
609        } else {
610            $arrErr[$key] = "※ " . $file_path ."の読み込みに失敗しました。<br/>";
611        }
612        return $arrErr;
613    }
614
615    /**
616     * インスタンスを生成し、指定のメソッドを実行する.
617     *
618     * @param integer $plugin_id プラグインID
619     * @param string $plugin_code プラグインコード
620     * @param string $exec_func 実行するメソッド名.
621     * @return array $arrErr エラー情報を格納した連想配列.
622     *
623     */
624    function execPlugin($plugin_id, $plugin_code, $exec_func) {
625        $arrErr = array();
626            // インスタンスの生成.
627            $objPlugin = new $plugin_code();
628            if(method_exists($objPlugin, $exec_func) === true){
629                $arrErr = $objPlugin->$exec_func($plugin_id);
630            } else {
631                $arrErr['plugin_error'] = "※ " . $plugin_code . ".php に" . $exec_func . "が見つかりません。<br/>";
632            }
633
634        return $arrErr;
635    }
636
637    /**
638     * 管理者側 テンプレート再生成
639     *
640     * @return void
641     */
642    function remakeTemplate() {
643        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
644        $objPlugin->remakeAllTemplates();
645    }
646
647    /**
648     * plugin_idをキーにdtb_pluginのstatusを更新します.
649     *
650     * @param int $plugin_id プラグインID
651     * @param int $enable_flg 有効フラグ
652     * @return integer 更新件数
653     */
654    function updatePluginEnable($plugin_id, $enable_flg) {
655        $objQuery =& SC_Query_Ex::getSingletonInstance();
656        // UPDATEする値を作成する。
657        $sqlval['enable'] = $enable_flg;
658        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
659        $where = "plugin_id = ?";
660        // UPDATEの実行
661        $ret = $objQuery->update("dtb_plugin", $sqlval, $where, array($plugin_id));
662        return $ret;
663    }
664
665    /**
666     * plugin_idをキーにdtb_plugin, dtb_plugin_hookpointから物理削除します.
667     *
668     * @param int $plugin_id プラグインID.
669     * @param string $plugin_code プラグインコード.
670     * @return array $arrErr エラー情報を格納した連想配列.
671     */
672    function deletePlugin($plugin_id, $plugin_code) {
673        $arrErr = array();
674       
675        $objQuery =& SC_Query_Ex::getSingletonInstance();
676        $objQuery->begin();
677        $where = "plugin_id = ?";
678        $objQuery->delete("dtb_plugin", $where, array($plugin_id));
679        $objQuery->delete("dtb_plugin_hookpoint", $where, array($plugin_id));
680       
681        if($objQuery->commit()){
682            if(SC_Utils_Ex::deleteFile($this->getPluginDir($plugin_code)) === false){
683                // TODO エラー処理
684            }
685           
686            if(SC_Utils_Ex::deleteFile($this->getHtmlPluginDir($plugin_code)) === false){
687                // TODO エラー処理
688            }       
689        }
690       return $arrErr;
691    }
692   
693    /**
694     * ファイルがあるかを判定します.
695     *
696     * @param string $plugin_dir 対象ディレクトリ.
697     * @param string $file_name ファイル名.
698     * @return boolean
699     */
700    function isContainsFile($plugin_dir, $file_name) {
701        if (file_exists($plugin_dir) && is_dir($plugin_dir)) {
702            if($handle = opendir($plugin_dir)){
703                while(($item = readdir($handle)) !== false) {
704                    if ($item === $file_name) return true;
705                }
706            }
707            closedir($handle);
708        }
709        return false;
710    }
711   
712     /**
713     * アーカイブ内に指定のファイルが存在するかを判定します.
714     *
715     * @param Archive_Tar $tar_obj
716     * @param string $file_path 判定するファイルパス
717     * @return boolean
718     */
719    function checkContainsFile($tar_obj, $file_path) {
720        $arrayFile = $tar_obj->listContent();
721        foreach ($arrayFile as  $value) {
722            if($value["filename"] === $file_path) return true;
723        }
724        return false;
725    }
726
727    /**
728     * 圧縮ファイル名と中のディレクトリ名が同じであるかをチェックします..
729     *
730     * @param Archive_Tar $tar_obj Archive_Tarクラスのオブジェクト
731     * @param string $dir_name ディレクトリ名.
732     * @return boolean
733     */
734    function checkUploadFileName($tar_obj, $dir_name){
735        $arrayFile = $tar_obj->listContent();
736        // ディレクトリ名と圧縮ファイル名が同じかをチェック.
737        $pattern = ("/^". $dir_name ."\/(.*?)/");
738        foreach ($arrayFile as $value) {
739            if(preg_match($pattern, $value["filename"])) return true;
740        }
741        return false;;
742    }
743   
744    /**
745     * ディレクトリを作成します.
746     *
747     * @param string $dir_path 作成するディレクトリのパス
748     */
749    function makeDir($dir_path){
750        // ディレクトリ作成
751        if(!file_exists($dir_path)) {
752             mkdir($dir_path);
753        }
754    }
755
756    /**
757     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
758     *
759     * @param int $plugin_id プラグインID
760     * @return string $conflict_alert_message メッセージ
761     */
762    function checkConflictPlugin($plugin_id){
763        $objQuery =& SC_Query_Ex::getSingletonInstance();
764        $table = "dtb_plugin_hookpoint";
765        $where = "plugin_id = ?";
766        $conflictHookPoints = $objQuery->select( "*", $table, $where, array($plugin_id));
767       
768        $conflict_alert_message = "";
769        foreach ($conflictHookPoints as $conflictHookPoint) {
770            // 登録商品のチェック
771            $table = "dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 ON T1.plugin_id = T2.plugin_id";
772            $where = "T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = " . PLUGIN_ENABLE_TRUE . " GROUP BY T1.plugin_id";
773            $conflictPlugins = $objQuery->select( "T1.plugin_id, T2.plugin_name", $table, $where, array($conflictHookPoint['hook_point'], $conflictHookPoint['plugin_id']));
774           
775            foreach ($conflictPlugins as $conflictPlugin) {
776                $conflict_alert_message =+ "* " .  $conflictPlugin['plugin_name'] . "と競合する可能性があります。<br/>";
777            }
778        }
779        return $conflict_alert_message;
780    }
781   
782    /**
783     * エラー情報が格納されているか判定します.
784     *
785     * @param array $arrErr エラー情報を格納した連想配列.
786     * @return boolean.
787     */
788    function isError($arrErr) {
789        if(is_array($arrErr) && count($arrErr) > 0){
790            return true;
791        }
792        return false;
793    }
794}
Note: See TracBrowser for help on using the repository browser.