source: branches/version-2_13-dev/data/class/pages/admin/ownersstore/LC_Page_Admin_OwnersStore.php @ 23303

Revision 23303, 44.8 KB checked in by dkazuto, 10 years ago (diff)

#2479 COMPLIANT_VERSION の許容文字数が不足

  • 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
RevLine 
[19661]1<?php
2/*
3 * This file is part of EC-CUBE
4 *
[22206]5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
[19661]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.
[20041]13 *
[19661]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
[20534]24require_once CLASS_EX_REALDIR . 'page_extends/admin/LC_Page_Admin_Ex.php';
[19661]25
26/**
[21783]27 * オーナーズストア:プラグイン管理 のページクラス.
[19661]28 *
29 * @package Page
30 * @author LOCKON CO.,LTD.
[20116]31 * @version $Id$
[19661]32 */
[22856]33class LC_Page_Admin_OwnersStore extends LC_Page_Admin_Ex
[22567]34{
[19661]35    /**
36     * Page を初期化する.
37     *
38     * @return void
39     */
[23124]40    public function init()
[22567]41    {
[19661]42        parent::init();
[21782]43        $this->tpl_mainpage = 'ownersstore/plugin.tpl';
44        $this->tpl_subno    = 'index';
45        $this->tpl_mainno   = 'ownersstore';
46        $this->tpl_maintitle = 'オーナーズストア';
[19661]47        $this->tpl_subtitle = 'プラグイン管理';
48    }
49
50    /**
51     * Page のプロセス.
52     *
53     * @return void
54     */
[23124]55    public function process()
[22567]56    {
[19661]57        $this->action();
58        $this->sendResponse();
59    }
60
61    /**
62     * Page のアクション.
63     *
64     * @return void
65     */
[23124]66    public function action()
[22567]67    {
[20970]68        // パラメーター管理クラス
[20501]69        $objFormParam = new SC_FormParam_Ex();
[21743]70        $mode = $this->getMode();
[20970]71        // パラメーター情報の初期化
[21555]72        $this->initParam($objFormParam, $mode);
[20246]73        $objFormParam->setParam($_POST);
[21981]74
[21441]75        switch ($mode) {
[21455]76            // インストール
77            case 'install':
[21481]78                $file_key = 'plugin_file';
[21467]79                $this->arrErr = $this->checkUploadFile($file_key);
[21478]80                if ($this->isError($this->arrErr) === false) {
[22034]81                    $archive_file_name = $_FILES[$file_key]['name'];
[21555]82                    // インストール処理.
[22034]83                    $this->arrErr = $this->installPlugin($archive_file_name, 'plugin_file');
[21555]84                    if ($this->isError($this->arrErr) === false) {
85                        // コンパイルファイルのクリア処理
86                        SC_Utils_Ex::clearCompliedTemplate();
87                        $this->tpl_onload = "alert('プラグインをインストールしました。');";
[21455]88                    }
89                }
90                break;
91            // 削除
92            case 'uninstall':
93                // エラーチェック
94                $this->arrErr = $objFormParam->checkError();
[21478]95                if ($this->isError($this->arrErr) === false) {
[21455]96                    $plugin_id = $objFormParam->getValue('plugin_id');
[21681]97                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
[21555]98                    $this->arrErr = $this->uninstallPlugin($plugin);
[21478]99                    if ($this->isError($this->arrErr) === false) {
[21731]100                        // TODO 全プラグインのインスタンスを保持したまま後続処理が実行されるので、全てのインスタンスを解放する。
101                        unset($GLOBALS['_SC_Helper_Plugin_instance']);
[21546]102                        // コンパイルファイルのクリア処理
103                        SC_Utils_Ex::clearCompliedTemplate();
[21455]104                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] ."を削除しました。');";
[20246]105                    }
[19661]106                }
[21455]107                break;
108            // 有効化
109            case 'enable':
110                // エラーチェック
[21522]111                $this->arrErr = $objFormParam->checkError();
112                if ($this->isError($this->arrErr) === false) {
[21455]113                    $plugin_id = $objFormParam->getValue('plugin_id');
114                    // プラグイン取得.
[21681]115                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
[21743]116                    $this->arrErr = $this->enablePlugin($plugin);
[21522]117                    if ($this->isError($this->arrErr) === false) {
[21731]118                        // TODO 全プラグインのインスタンスを保持したまま後続処理が実行されるので、全てのインスタンスを解放する。
119                        unset($GLOBALS['_SC_Helper_Plugin_instance']);
[21546]120                        // コンパイルファイルのクリア処理
121                        SC_Utils_Ex::clearCompliedTemplate();
[21522]122                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] . "を有効にしました。');";
[21455]123                    }
124                }
125                break;
126            // 無効化
127            case 'disable':
128                // エラーチェック
[21522]129                $this->arrErr = $objFormParam->checkError();
130                if ($this->isError($this->arrErr) === false) {
[21455]131                    $plugin_id = $objFormParam->getValue('plugin_id');
132                    // プラグイン取得.
[21681]133                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
134                    $this->arrErr = $this->disablePlugin($plugin);
[21522]135                    if ($this->isError($this->arrErr) === false) {
[21731]136                        // TODO 全プラグインのインスタンスを保持したまま後続処理が実行されるので、全てのインスタンスを解放する。
137                        unset($GLOBALS['_SC_Helper_Plugin_instance']);
[21546]138                        // コンパイルファイルのクリア処理
139                        SC_Utils_Ex::clearCompliedTemplate();
[21522]140                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] . "を無効にしました。');";
[21455]141                    }
142                }
143                break;
144            // アップデート.
145            case 'update':
146                // エラーチェック
147                $this->arrErr = $objFormParam->checkError();
[21478]148                if ($this->isError($this->arrErr) === false) {
[22036]149                    $plugin_id = $objFormParam->getValue('plugin_id');
150                    $plugin = SC_Plugin_Util_Ex::getPluginByPluginId($plugin_id);
151                    $target_plugin_code = $plugin['plugin_code']; // アップデート対象のプラグインコード
[21555]152                    $this->arrErr = $this->checkUploadFile($target_plugin_code);
[21563]153
[21478]154                    if ($this->isError($this->arrErr) === false) {
[21555]155                        $update_plugin_file = $_FILES[$target_plugin_code];
[21455]156                        $update_plugin_file_name = $update_plugin_file['name']; // アップデートファイルのファイル名.
[21555]157                        // インストール処理.
[21681]158                        $target_plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($target_plugin_code);
[21555]159                        $this->arrErr = $this->updatePlugin($target_plugin, $update_plugin_file_name, $target_plugin_code);
160                        if ($this->isError($this->arrErr) === false) {
161                            // コンパイルファイルのクリア処理
162                            SC_Utils_Ex::clearCompliedTemplate();
163                            $this->tpl_onload = "alert('プラグインをアップデートしました。');";
[21527]164                        }
[21455]165                    }
166                }
167                break;
168            // 優先度.
169            case 'priority':
[21501]170                // エラーチェック
171                $arrErr = $objFormParam->checkError();
172                $plugin_id = $objFormParam->getValue('plugin_id');
173                if ($this->isError($arrErr) === false) {
174                    // 優先度の更新
175                    $priority = $objFormParam->getValue('priority');
176                    $this->updatePriority($plugin_id, $priority);
[21546]177                    // コンパイルファイルのクリア処理
178                    SC_Utils_Ex::clearCompliedTemplate();
[21501]179                } else {
180                    // エラーメッセージを詰め直す.
181                    $this->arrErr['priority'][$plugin_id] = $arrErr['priority'];
182                }
[21981]183
[21501]184                break;
[21455]185            default:
186                break;
[19661]187        }
[20246]188        // DBからプラグイン情報を取得
[21681]189        $plugins = SC_Plugin_Util_Ex::getAllPlugin();
[21981]190
[21455]191        foreach ($plugins as $key => $plugin) {
[21854]192            // ロゴファイルへのパスを生成(ロゴが無い場合はNO_IMAGEを表示)
[23124]193            if (file_exists(PLUGIN_HTML_REALDIR . $plugins[$key]['plugin_code'] . '/logo.png') === true) {
[21981]194                $plugins[$key]['logo'] = ROOT_URLPATH . 'plugin/' . $plugins[$key]['plugin_code'] . '/logo.png';
[21854]195            } else {
[22038]196                $plugins[$key]['logo'] = IMAGE_SAVE_URLPATH . 'noimage_plugin_list.png';
[21854]197            }
[21981]198
[21455]199            // 設定ファイルがあるかを判定.
[21515]200            $plugins[$key]['config_flg'] = $this->isContainsFile(PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'], 'config.php');
[21478]201            if ($plugins[$key]['enable'] === PLUGIN_ENABLE_TRUE) {
[21455]202                // 競合するプラグインがあるかを判定.
[22978]203                //$plugins[$key]['conflict_message']= $this->checkConflictPlugin($plugin['plugin_id']);
204                $plugins[$key]['conflict_message'] = SC_Plugin_Util_Ex::checkConflictPlugin($plugin['plugin_id']);
[21455]205            }
206        }
207        $this->plugins = $plugins;
[19661]208    }
209
210    /**
[20970]211     * パラメーター初期化.
[19661]212     *
[23124]213     * @param  SC_FormParam_Ex $objFormParam
214     * @param  string          $mode         モード
[20246]215     * @return void
[19661]216     */
[23124]217    public function initParam(&$objFormParam, $mode)
[22567]218    {
[20246]219        $objFormParam->addParam('mode', 'mode', INT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
220        $objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
[21552]221        if ($mode === 'priority') {
[21546]222            $objFormParam->addParam('優先度', 'priority', INT_LEN, '', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
223        }
[20246]224    }
[19661]225
[20246]226    /**
[21455]227     * ファイルパラメーター初期化.
[20246]228     *
[23124]229     * @param  SC_UploadFile_Ex $objUpFile SC_UploadFileのインスタンス.
230     * @param  string           $key       登録するキー.
[20246]231     * @return void
232     */
[23124]233    public function initUploadFile(&$objUpFile, $key)
[22567]234    {
[21514]235        $objUpFile->addFile('プラグインファイル', $key, explode(',', PLUGIN_EXTENSION), FILE_SIZE, true, 0, 0, false);
[20246]236    }
[19661]237
[20246]238    /**
[21455]239     * ファイルが指定されている事をチェックします.
[21743]240     *
[23124]241     * @param  string $file     ファイル
242     * @param  string $file_key ファイルキー
243     * @return array  エラー情報を格納した連想配列.
[20246]244     */
[23124]245    public function checkUploadFile($file_key)
[22567]246    {
[21467]247        $objErr = new SC_CheckError_Ex();
248        // 拡張子チェック
[21514]249        $objErr->doFunc(array('プラグインファイル', $file_key, explode(',', PLUGIN_EXTENSION)), array('FILE_EXT_CHECK'));
[21467]250        // ファイルサイズチェック
[21480]251        $objErr->doFunc(array('プラグインファイル', $file_key, FILE_SIZE), array('FILE_SIZE_CHECK'));
[21467]252        // ファイル名チェック
[21480]253        $objErr->doFunc(array('プラグインファイル', $file_key), array('FILE_NAME_CHECK'));
[21478]254
[21467]255        return $objErr->arrErr;
[21455]256    }
[21478]257
[21455]258    /**
259     * 既にインストールされているプラグインかを判定します.
260     *
[23124]261     * @param  string  $plugin_code プラグインコード
[21743]262     * @return boolean インストール済の場合true インストールされていない場合false
[21455]263     */
[23124]264    public function isInstalledPlugin($plugin_code)
[22567]265    {
[21681]266        $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($plugin_code);
[21478]267        if (!empty($plugin)) {
[21455]268            return true;
269        }
[22856]270
[21455]271        return false;
272    }
[20246]273
[21455]274    /**
[21467]275     * ファイル名からプラグインコードを取得する.
[21743]276     *
[21467]277     * ファイル名を「.」で配列に分解.
278     * 配列内から拡張子として格納される可能性のある「tar」「gz」を除外すし、再度結合する.
[21743]279     *
[23124]280     * @param  string $file_name ファイル名
[21467]281     * @return string $plugin_code プラグインコード.
[20246]282     */
[23124]283    public function getPluginCode($file_name)
[22567]284    {
[21467]285        // 分解
[21514]286        $array_ext = explode('.', $file_name);
[21467]287        $array_file_name = array_diff($array_ext, array('tar','gz'));
288        // 結合
[21478]289        $plugin_code = implode('.', $array_file_name);
[22856]290
[21467]291        return $plugin_code;
[20246]292    }
293
294    /**
295     * プラグイン保存ディレクトリのパスを取得する.
296     *
[23124]297     * @param  string $plugin_code プラグインコード
[21455]298     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
[20246]299     */
[23124]300    public function getPluginDir($plugin_code)
[22567]301    {
[21455]302        $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/';
[22856]303
[21455]304        return $plugin_dir_path;
[20246]305    }
[21478]306
[21455]307    /**
308     * プラグインHTMLディレクトリのパスを取得する.
309     *
[23124]310     * @param  string $plugin_code プラグインコード
[21455]311     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
312     */
[23124]313    public function getHtmlPluginDir($plugin_code)
[22567]314    {
[22034]315        $plugin_html_dir_path = PLUGIN_HTML_REALDIR . $plugin_code . '/';
[22856]316
[22034]317        return $plugin_html_dir_path;
[21455]318    }
[20246]319
320    /**
321     * プラグインファイルのパスを取得する.
[21743]322     *
[23124]323     * @param  string $plugin_code  プラグインコード
324     * @param  string $plugin_class プラグインクラス名
[21455]325     * @return string $plugin_file_path クラスファイルのパス.
[20246]326     */
[23124]327    public function getPluginFilePath($plugin_code , $plugin_class)
[22567]328    {
[22034]329        $plugin_file_path = $this->getPluginDir($plugin_code) . $plugin_class . '.php';
[22856]330
[20246]331        return $plugin_file_path;
332    }
[21478]333
[20246]334    /**
[21455]335     * プラグインをインストールします.
[21743]336     *
[23124]337     * @param  string $archive_file_name アーカイブファイル名.
338     * @param  string $key               キー.
339     * @return array  エラー情報を格納した連想配列.
[20246]340     */
[23124]341    public function installPlugin($archive_file_name, $key)
[22567]342    {
[22978]343        $objQuery =& SC_Query_Ex::getSingletonInstance();
344        $objQuery->begin();
[23124]345
[22034]346        // 一時展開ディレクトリにファイルがある場合は事前に削除.
347        $arrFileHash = SC_Helper_FileManager_Ex::sfGetFileList(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[22093]348        if (count($arrFileHash) > 0) {
[22034]349            SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false);
350        }
[22093]351
[21877]352        //シンタックスエラーがあるtar.gzをアップ後、削除するとたまにディレクトリが消えるので追加
353        $this->makeDir(PLUGIN_UPLOAD_REALDIR);
354
[20246]355        $arrErr = array();
[21884]356        // 必須拡張モジュールのチェック
[21971]357        $arrErr = SC_Plugin_Util_Ex::checkExtension($key);
[21884]358        if ($this->isError($arrErr) === true) {
359            return $arrErr;
360        }
[21555]361        // ファイルをチェックし一時展開用ディレクトリに展開します.
[22034]362        $arrErr = $this->unpackPluginFile($archive_file_name, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $key);
[21455]363        if ($this->isError($arrErr) === true) {
364            return $arrErr;
365        }
[21555]366        // plugin_infoを読み込み.
[21563]367        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR . 'plugin_info.php', $key);
[21455]368        if ($this->isError($arrErr) === true) {
[21555]369            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[23124]370
[21455]371            return $arrErr;
372        }
[21563]373
[21467]374        // リフレクションオブジェクトを生成.
[21563]375        $objReflection = new ReflectionClass('plugin_info');
[21794]376        $arrPluginInfo = $this->getPluginInfo($objReflection);
[21555]377        // プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
378        $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[21467]379        if ($this->isError($arrErr) === true) {
[21555]380            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[23124]381
[21467]382            return $arrErr;
383        }
[21563]384
[21555]385        // 既にインストールされていないかを判定.
[22034]386        if ($this->isInstalledPlugin($arrPluginInfo['PLUGIN_CODE']) === true) {
[21555]387            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[22034]388            $arrErr['plugin_file'] = '※ ' . $arrPluginInfo['PLUGIN_NAME'] . 'は既にインストールされています。<br/>';
[23124]389
[21555]390            return $arrErr;
391        }
[21981]392
[21455]393        // プラグイン情報をDB登録
[21794]394        if ($this->registerData($arrPluginInfo) === false) {
[21555]395            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[21514]396            $arrErr['plugin_file'] = '※ DB登録に失敗しました。<br/>';
[23124]397
[21455]398            return $arrErr;
399        }
[21563]400
[21555]401        // プラグイン保存ディレクトリを作成し、一時展開用ディレクトリから移動します.
[22034]402        $plugin_dir_path = $this->getPluginDir($arrPluginInfo['PLUGIN_CODE']);
[21555]403        $this->makeDir($plugin_dir_path);
404        SC_Utils_Ex::copyDirectory(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin_dir_path);
[21592]405
[21555]406        // プラグイン情報を取得
[22034]407        $plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($arrPluginInfo['PLUGIN_CODE']);
[21563]408
[21555]409        // クラスファイルを読み込み.
[22034]410        $plugin_class_file_path = $this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']);
[21555]411        $arrErr = $this->requirePluginFile($plugin_class_file_path, $key);
412        if ($this->isError($arrErr) === true) {
413            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id']);
[23124]414
[21555]415            return $arrErr;
416        }
[21455]417        // プラグインhtmlディレクトリ作成
[22034]418        $plugin_html_dir_path = $this->getHtmlPluginDir($plugin['plugin_code']);
419        $this->makeDir($plugin_html_dir_path);
[21592]420
[21566]421        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'install');
[21555]422        if ($this->isError($arrErr) === true) {
[22978]423            // エラー時, transactionがabortしてるのでロールバック
424            $objQuery->rollback();
[22034]425            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $plugin['plugin_id'], $plugin_html_dir_path);
[23124]426
[21555]427            return $arrErr;
428        }
[21563]429
[22978]430        $objQuery->commit();
[23124]431
[21555]432        // 不要なファイルの削除
[21848]433        SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, false);
[22856]434
[21455]435        return $arrErr;
436    }
[21563]437
[21555]438    /**
439     * ロールバック処理
440     * インストール失敗時などに不要な一時ファイルを削除します.
[21743]441     *
[23124]442     * @param string $temp_dir             インストール・アップデート時の一時展開用ディレクトリのパス.
443     * @param string $plugin_id            プラグインID.
[22034]444     * @param string $plugin_html_dir_path プラグイン毎に生成されるhtmlディレクトリのパス.
[21555]445     */
[23124]446    public function rollBack($temp_dir, $plugin_id = '', $plugin_html_dir_path ='')
[22567]447    {
[21555]448        // 一時ディレクトリを削除.
[21757]449        SC_Helper_FileManager_Ex::deleteFile($temp_dir, false);
[21555]450        // DBからプラグイン情報を削除
[21684]451        if (empty($plugin_id) === false) {
452            SC_Plugin_Util_Ex::deletePluginByPluginId($plugin_id);
453        }
[21555]454        // htmlディレクトリを削除
[22034]455        if (empty($plugin_html_dir_path) === false) {
456            SC_Helper_FileManager_Ex::deleteFile($plugin_html_dir_path, true);
[21684]457        }
[21555]458    }
[21478]459
[21455]460    /**
[21794]461     * プラグイン情報を取得します.
[22856]462     *
[23124]463     * @param  ReflectionClass $objReflection
464     * @return array           プラグイン情報の配列
[21794]465     */
[23124]466    public function getPluginInfo(ReflectionClass $objReflection)
[22567]467    {
[21794]468        $arrStaticProps = $objReflection->getStaticProperties();
469        $arrConstants   = $objReflection->getConstants();
470
471        $arrPluginInfoKey = array(
472            'PLUGIN_CODE',
473            'PLUGIN_NAME',
474            'CLASS_NAME',
475            'PLUGIN_VERSION',
476            'COMPLIANT_VERSION',
477            'AUTHOR',
478            'DESCRIPTION',
479            'PLUGIN_SITE_URL',
480            'AUTHOR_SITE_URL',
481            'HOOK_POINTS',
482        );
483        $arrPluginInfo = array();
484        foreach ($arrPluginInfoKey as $key) {
485            // クラス変数での定義を優先
486            if (isset($arrStaticProps[$key])) {
487                $arrPluginInfo[$key] = $arrStaticProps[$key];
488            // クラス変数定義がなければ, クラス定数での定義を読み込み.
489            } elseif ($arrConstants[$key]) {
490                $arrPluginInfo[$key] = $arrConstants[$key];
491            } else {
492                $arrPluginInfo[$key] = null;
493            }
494        }
[22856]495
[21794]496        return $arrPluginInfo;
497    }
[21829]498
[21794]499    /**
[21467]500     * プラグインクラス内の定数をチェックします.
[21743]501     *
[23124]502     * @param  ReflectionClass $objReflection リフレクションオブジェクト
503     * @param  string          $dir_path      チェックするプラグインディレクトリ
504     * @return array           エラー情報を格納した連想配列.
[21467]505     */
[23124]506    public function checkPluginConstants(ReflectionClass $objReflection, $dir_path)
[22567]507    {
[21467]508        $arrErr = array();
[21794]509        // プラグイン情報を取得
510        $arrPluginInfo = $this->getPluginInfo($objReflection);
511
512        if (!isset($arrPluginInfo['PLUGIN_CODE'])) {
[21555]513            $arrErr['plugin_file'] = '※ PLUGIN_CODEが定義されていません。<br/>';
[23124]514
[21555]515            return $arrErr;
516        }
[21794]517        if (!isset($arrPluginInfo['PLUGIN_NAME'])) {
[21514]518            $arrErr['plugin_file'] = '※ PLUGIN_NAMEが定義されていません。<br/>';
[23124]519
[21467]520            return $arrErr;
521        }
[21794]522        if (!isset($arrPluginInfo['CLASS_NAME'])) {
523            $arrErr['plugin_file'] = '※ CLASS_NAMEが定義されていません。<br/>';
[23124]524
[21555]525            return $arrErr;
526        }
[22034]527        $plugin_class_file_path = $dir_path . $arrPluginInfo['CLASS_NAME'] . '.php';
528        if (file_exists($plugin_class_file_path) === false) {
[21794]529            $arrErr['plugin_file'] = '※ CLASS_NAMEが正しく定義されていません。<br/>';
[23124]530
[21794]531            return $arrErr;
532        }
533        if (!isset($arrPluginInfo['PLUGIN_VERSION'])) {
[21514]534            $arrErr['plugin_file'] = '※ PLUGIN_VERSIONが定義されていません。<br/>';
[23124]535
[21467]536            return $arrErr;
537        }
[21794]538        if (!isset($arrPluginInfo['COMPLIANT_VERSION'])) {
[21514]539            $arrErr['plugin_file'] = '※ COMPLIANT_VERSIONが定義されていません。<br/>';
[23124]540
[21467]541            return $arrErr;
542        }
[21794]543        if (!isset($arrPluginInfo['AUTHOR'])) {
[21514]544            $arrErr['plugin_file'] = '※ AUTHORが定義されていません。<br/>';
[23124]545
[21467]546            return $arrErr;
547        }
[21794]548        if (!isset($arrPluginInfo['DESCRIPTION'])) {
[21514]549            $arrErr['plugin_file'] = '※ DESCRIPTIONが定義されていません。<br/>';
[23124]550
[21467]551            return $arrErr;
552        }
[21794]553        $objErr = new SC_CheckError_Ex($arrPluginInfo);
[21555]554        $objErr->doFunc(array('PLUGIN_CODE', 'PLUGIN_CODE', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
555        $objErr->doFunc(array('PLUGIN_NAME', 'PLUGIN_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK'));
556        $objErr->doFunc(array('CLASS_NAME', 'CLASS_NAME', STEXT_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
[21480]557        $objErr->doFunc(array('PLUGIN_VERSION', 'PLUGIN_VERSION', STEXT_LEN), array('MAX_LENGTH_CHECK'));
[23303]558        $objErr->doFunc(array('COMPLIANT_VERSION', 'COMPLIANT_VERSION', LTEXT_LEN), array('MAX_LENGTH_CHECK'));
[21480]559        $objErr->doFunc(array('AUTHOR', 'AUTHOR', STEXT_LEN), array('MAX_LENGTH_CHECK'));
[21725]560        $objErr->doFunc(array('DESCRIPTION', 'DESCRIPTION', MTEXT_LEN), array('MAX_LENGTH_CHECK'));
[21794]561        if (isset($arrPluginInfo['PLUGIN_SITE_URL'])) {
[21480]562            $objErr->doFunc(array('PLUGIN_SITE_URL', 'PLUGIN_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
[21467]563        }
[21794]564        if (isset($arrPluginInfo['AUTHOR_SITE_URL'])) {
[21480]565            $objErr->doFunc(array('AUTHOR_SITE_URL', 'AUTHOR_SITE_URL', URL_LEN), array('MAX_LENGTH_CHECK','GRAPH_CHECK'));
[21467]566        }
567        // エラー内容を出力用の配列にセットします.
[21478]568        if ($this->isError($objErr->arrErr)) {
[21514]569            $arrErr['plugin_file'] = '';
[21478]570            foreach ($objErr->arrErr as $error) {
[21467]571                    $arrErr['plugin_file'] .= $error;
572            }
573        }
[22856]574
[21467]575        return $arrErr;
576    }
[21478]577
[21467]578    /**
[21455]579     * プラグインをアップデートします.
[21743]580     *
[23124]581     * @param  array  $target_plugin    アップデートするプラグイン情報の配列.
582     * @param  string $upload_file_name アップロードファイル名.
583     * @return array  エラー情報を格納した連想配列.
[21455]584     */
[23124]585    public function updatePlugin($target_plugin, $upload_file_name)
[22567]586    {
[21848]587        // アップデート前に不要なファイルを消しておきます.
588        SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, false);
[21981]589
[21455]590        $arrErr = array();
[21734]591
[21455]592        // ファイルをチェックし展開します.
[21555]593        $arrErr = $this->unpackPluginFile($upload_file_name, DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, $target_plugin['plugin_code']);
[21455]594        if ($this->isError($arrErr) === true) {
595            return $arrErr;
596        }
[21843]597        // plugin_infoを読み込み.
598        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . 'plugin_info.php', $target_plugin['plugin_code']);
599        if ($this->isError($arrErr) === true) {
600            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
[23124]601
[21843]602            return $arrErr;
603        }
604        // リフレクションオブジェクトを生成.
605        $objReflection = new ReflectionClass('plugin_info');
606        $arrPluginInfo = $this->getPluginInfo($objReflection);
607        if ($arrPluginInfo['PLUGIN_CODE'] != $target_plugin['plugin_code']) {
608            $arrErr[$target_plugin['plugin_code']] = '※ プラグインコードが一致しません。<br/>';
[23124]609
[21843]610            return $arrErr;
611        }
[21981]612
[21712]613        // plugin_update.phpを読み込み.
614        $arrErr = $this->requirePluginFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR . 'plugin_update.php', $target_plugin['plugin_code']);
[21555]615        if ($this->isError($arrErr) === true) {
616            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
[23124]617
[21555]618            return $arrErr;
619        }
[21455]620        // プラグインクラスファイルのUPDATE処理を実行.
[21794]621        $arrErr = $this->execPlugin($target_plugin, 'plugin_update', 'update');
[21563]622
[23012]623        // プラグイン情報を更新
624        if ($this->registerData($arrPluginInfo, 'update') === false) {
625            $this->rollBack(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR);
626            $arrErr['plugin_file'] = '※ プラグイン情報の更新に失敗しました。<br/>';
[23124]627
[23012]628            return $arrErr;
629        }
630
[21455]631        // 保存ディレクトリの削除.
[21757]632        SC_Helper_FileManager_Ex::deleteFile(DOWNLOADS_TEMP_PLUGIN_UPDATE_DIR, false);
[21563]633
[21455]634        return $arrErr;
635    }
[21478]636
[21455]637    /**
638     * ファイルをアップロードし、解凍先のディレクトリに解凍します.
[21743]639     *
[23124]640     * @param  string $unpack_file_name 解凍ファイル名
641     * @param  string $unpack_dir_path  解凍先ディレクトリパス
642     * @param  string $file_key         ファイルキー
643     * @return array  エラー情報を格納した連想配列.
[21455]644     */
[23124]645    public function unpackPluginFile($unpack_file_name, $unpack_dir_path, $file_key)
[22567]646    {
[21455]647        $arrErr = array();
648        // 解凍ディレクトリディレクトリを作成し、一時ディレクトリからファイルを移動
[22034]649        $objUpFile = new SC_UploadFile_Ex(PLUGIN_TEMP_REALDIR, $unpack_dir_path);
[21555]650        $this->initUploadFile($objUpFile, $file_key);
[21455]651        $arrErr = $objUpFile->makeTempFile($file_key, false);
652        if ($this->isError($arrErr) === true) {
653            return $arrErr;
654        }
[21563]655
[21455]656        // 正常にアップロードされているかをチェック.
[21894]657        $arrErr = $objUpFile->checkExists($file_key);
[21455]658        if ($this->isError($arrErr) === true) {
659            return $arrErr;
[20246]660        }
[21455]661        $objUpFile->moveTempFile();
662        // 解凍
[22034]663        $unpack_file_path = $unpack_dir_path . $unpack_file_name;
664        if (!$this->unpackPluginArchive($unpack_file_path)) {
[21514]665            $arrErr['plugin_file'] = '※ 解凍に失敗しました。<br/>';
[23124]666
[21455]667            return $arrErr;
668        }
[22856]669
[20246]670        return $arrErr;
671    }
[21478]672
[21455]673    /**
674     * プラグインをアンインストールします.
[21743]675     *
[23124]676     * @param  array $plugin プラグイン情報を確認した連想配列.
[21455]677     * @return array エラー情報を格納した連想配列.
678     */
[23124]679    public function uninstallPlugin($plugin)
[22567]680    {
[21455]681        $arrErr = array();
682        // プラグインファイルを読み込みます.
[22034]683        $plugin_class_file_path = $this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']);
[21972]684        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
685        if ($this->isError($arrErr) === true) {
686            return $arrErr;
687        }
[21981]688
[21842]689        // プラグインが有効な場合に無効化処理を実行
[23124]690        if ($plugin['enable'] == PLUGIN_ENABLE_TRUE) {
[21842]691            // 無効化処理を実行します.
692            $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'disable');
693            if ($this->isError($arrErr) === true) {
694                return $arrErr;
695            }
696            // プラグインを無効にします.
697            $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_FALSE);
698        }
[21981]699
[21842]700        // アンインストール処理を実行します.
[21566]701        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'uninstall');
[21455]702        // プラグインの削除処理.
[21555]703        $arrErr = $this->deletePlugin($plugin['plugin_id'], $plugin['plugin_code']);
[21478]704
[21455]705        return $arrErr;
706    }
[21478]707
[21455]708    /**
709     * プラグインを有効にします.
[21743]710     *
[23124]711     * @param  array $plugin プラグイン情報を確認した連想配列.
[21455]712     * @return array $arrErr エラー情報を格納した連想配列.
713     */
[23124]714    public function enablePlugin($plugin)
[22567]715    {
[21455]716        $arrErr = array();
717        // クラスファイルを読み込み.
[22034]718        $plugin_class_file_path = $this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']);
[21555]719        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
[21455]720        if ($this->isError($arrErr) === true) {
721            return $arrErr;
722        }
[21555]723        // 有効化処理を実行します.
[21569]724        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'enable');
[21455]725        if ($this->isError($arrErr) === true) {
726            return $arrErr;
727        }
728        // プラグインを有効にします.
[21569]729        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_TRUE);
[21478]730
[21455]731        return $arrErr;
732    }
[21478]733
[21455]734    /**
735     * プラグインを無効にします.
[21743]736     *
[23124]737     * @param  array $plugin プラグイン情報を確認した連想配列.
[21555]738     * @return array $arrErr エラー情報を格納した連想配列.
[21455]739     */
[23124]740    public function disablePlugin($plugin)
[22567]741    {
[21455]742        $arrErr = array();
743        // クラスファイルを読み込み.
[22034]744        $plugin_class_file_path =$this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']);
[21555]745        $arrErr = $this->requirePluginFile($plugin_class_file_path, 'plugin_error');
[21455]746        if ($this->isError($arrErr) === true) {
747            return $arrErr;
748        }
[21478]749
[21455]750        // 無効化処理を実行します.
[21569]751        $arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'disable');
[21455]752        if ($this->isError($arrErr) === true) {
753            return $arrErr;
754        }
755        // プラグインを無効にします.
[21569]756        $this->updatePluginEnable($plugin['plugin_id'], PLUGIN_ENABLE_FALSE);
[21478]757
[21455]758        return $arrErr;
759    }
[21509]760
[21501]761    /**
762     * 優先度を更新します.
[21743]763     *
[23124]764     * @param  int     $plugin_id プラグインID
765     * @param  int     $priority  優先度
[21501]766     * @return integer 更新件数
767     */
[23124]768    public function updatePriority($plugin_id, $priority)
[22567]769    {
[21501]770        $objQuery =& SC_Query_Ex::getSingletonInstance();
771        // UPDATEする値を作成する。
[21512]772        $sqlval['priority'] = $priority;
[21501]773        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
[21514]774        $where = 'plugin_id = ?';
[21501]775        // UPDATEの実行
776        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
[22856]777
[21501]778        return $ret;
779    }
[20246]780
781    /**
782     * プラグイン情報をDB登録.
783     *
[23124]784     * @param  array  $arrPluginInfo プラグイン情報を格納した連想配列.
785     * @param  string $mode          モード
786     * @return array  エラー情報を格納した連想配列.
[20246]787     */
[23124]788    public function registerData($arrPluginInfo, $mode = 'install')
[22567]789    {
[21455]790        // プラグイン情報をDB登録.
[20507]791        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21458]792        $arr_sqlval_plugin = array();
[21794]793        $arr_sqlval_plugin['plugin_name'] = $arrPluginInfo['PLUGIN_NAME'];
794        $arr_sqlval_plugin['plugin_code'] = $arrPluginInfo['PLUGIN_CODE'];
795        $arr_sqlval_plugin['class_name'] = $arrPluginInfo['CLASS_NAME'];
796        $arr_sqlval_plugin['author'] = $arrPluginInfo['AUTHOR'];
[21467]797        // AUTHOR_SITE_URLが定義されているか判定.
[21794]798        $author_site_url = $arrPluginInfo['AUTHOR_SITE_URL'];
799        if ($author_site_url !== null) {
[21872]800            $arr_sqlval_plugin['author_site_url'] = $arrPluginInfo['AUTHOR_SITE_URL'];
[21684]801        }
[21467]802        // PLUGIN_SITE_URLが定義されているか判定.
[21794]803        $plugin_site_url = $arrPluginInfo['PLUGIN_SITE_URL'];
804        if ($plugin_site_url !== null) {
[21684]805            $arr_sqlval_plugin['plugin_site_url'] = $plugin_site_url;
806        }
[21794]807        $arr_sqlval_plugin['plugin_version'] = $arrPluginInfo['PLUGIN_VERSION'];
808        $arr_sqlval_plugin['compliant_version'] = $arrPluginInfo['COMPLIANT_VERSION'];
809        $arr_sqlval_plugin['plugin_description'] = $arrPluginInfo['DESCRIPTION'];
[21512]810        $arr_sqlval_plugin['priority'] = 0;
[21458]811        $arr_sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE;
812        $arr_sqlval_plugin['update_date'] = 'CURRENT_TIMESTAMP';
[23012]813        if ($mode === 'install') {
814            // 新規登録
815            $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id');
816            $arr_sqlval_plugin['plugin_id'] = $plugin_id;
817            $objQuery->insert('dtb_plugin', $arr_sqlval_plugin);
[23124]818        } elseif ($mode === 'update') {
[23012]819            // 情報を更新
820            $plugin_id = $objQuery->get('plugin_id', 'dtb_plugin', 'plugin_code = ? ', array($arrPluginInfo['PLUGIN_CODE']));
821            $arrUnsetKeys = array('plugin_code', 'priority', 'enable');
822            foreach ($arrUnsetKeys as $key) {
823                unset($arr_sqlval_plugin[$key]);
824            }
825            $objQuery->update('dtb_plugin', $arr_sqlval_plugin, 'plugin_id = ?', array($plugin_id));
826            // 該当プラグインのフックポイントを一旦削除
827            $objQuery->delete('dtb_plugin_hookpoint', 'plugin_id = ? ', array($plugin_id));
828        } else {
829            GC_Utils_Ex::gfPrintLog("モードの指定が不正($mode)", ERROR_LOG_REALFILE);
[23124]830
[23012]831            return false;
832        }
[23124]833
[21455]834        // フックポイントをDB登録.
[21794]835        $hook_point = $arrPluginInfo['HOOK_POINTS'];
836        if ($hook_point !== null) {
837            /**
838             * FIXME コードが重複しているため、要修正
839             */
840            // フックポイントが配列で定義されている場合
841            if (is_array($hook_point)) {
842                foreach ($hook_point as $h) {
[21467]843                    $arr_sqlval_plugin_hookpoint = array();
[21706]844                    $id = $objQuery->nextVal('dtb_plugin_hookpoint_plugin_hookpoint_id');
[21602]845                    $arr_sqlval_plugin_hookpoint['plugin_hookpoint_id'] = $id;
[21467]846                    $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
[21794]847                    $arr_sqlval_plugin_hookpoint['hook_point'] = $h[0];
848                    $arr_sqlval_plugin_hookpoint['callback'] = $h[1];
[21467]849                    $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
850                    $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint);
851                }
[21794]852            // 文字列定義の場合
853            } else {
854                $array_hook_point = explode(',', $hook_point);
855                foreach ($array_hook_point as $h) {
856                    $arr_sqlval_plugin_hookpoint = array();
857                    $id = $objQuery->nextVal('dtb_plugin_hookpoint_plugin_hookpoint_id');
858                    $arr_sqlval_plugin_hookpoint['plugin_hookpoint_id'] = $id;
859                    $arr_sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
860                    $arr_sqlval_plugin_hookpoint['hook_point'] = $h;
861                    $arr_sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
862                    $objQuery->insert('dtb_plugin_hookpoint', $arr_sqlval_plugin_hookpoint);
863                }
[21455]864            }
865        }
[22856]866
[21455]867        return $objQuery->commit();
[20246]868    }
869
870    /**
[21455]871     * ファイルを読み込む.
[21743]872     *
[23124]873     * @param  string $file_path クラスのpath
874     * @param  string $key       エラー情報のキー.
875     * @return array  $arrErr エラー情報を格納した連想配列.
[20246]876     */
[23124]877    public function requirePluginFile($file_path, $key)
[22567]878    {
[20246]879        $arrErr = array();
[21478]880        if (file_exists($file_path)) {
[22856]881            require_once $file_path;
[20246]882        } else {
[21563]883            $arrErr[$key] = '※ ' . $file_path .'の読み込みに失敗しました。<br/>';
[20246]884        }
[22856]885
[20246]886        return $arrErr;
887    }
888
889    /**
[21455]890     * インスタンスを生成し、指定のメソッドを実行する.
[20246]891     *
[23124]892     * @param  object $obj        インスタンス
893     * @param  string $class_name クラス名
894     * @param  string $exec_func  実行するメソッド名.
895     * @return array  $arrErr エラー情報を格納した連想配列.
[20246]896     *
897     */
[23124]898    public function execPlugin($obj, $class_name, $exec_func)
[22567]899    {
[22978]900        $objPluginInstaller = new SC_Plugin_Installer($exec_func, $obj);
901
[20246]902        $arrErr = array();
[21555]903        if (method_exists($class_name, $exec_func) === true) {
[22978]904            $ret = call_user_func_array(
905                    array($class_name, $exec_func),
906                    array($obj, $objPluginInstaller));
[21918]907            if (!(is_null($ret) || $ret === true)) {
908                $arrErr[$obj['plugin_code']] = $ret;
909            }
[22978]910            $arrInstallErr = $objPluginInstaller->execPlugin();
911            if ($arrInstallErr) {
[22994]912                $arrErr['plugin_file'] = "プラグインのインストールに失敗しました.<br/>";
[22978]913            }
[21501]914        } else {
[22978]915            $arrErr['plugin_file'] = '※ ' . $class_name . '.php に' . $exec_func . 'が見つかりません。<br/>';
[21501]916        }
[23124]917
[21455]918        return $arrErr;
919    }
[21981]920
[21860]921    /**
922     * プラグインアーカイブを解凍する.
923     *
[23124]924     * @param  string  $path アーカイブパス
[21860]925     * @return boolean Archive_Tar::extractModify()のエラー
926     */
[23124]927    public function unpackPluginArchive($path)
[22567]928    {
[21860]929        // 圧縮フラグTRUEはgzip解凍をおこなう
930        $tar = new Archive_Tar($path, true);
[20540]931
[21860]932        $dir = dirname($path);
933        $file_name = basename($path);
934
935        // 拡張子を切り取る
936        $unpacking_name = preg_replace("/(\.tar|\.tar\.gz)$/", '', $file_name);
937
938        // 指定されたフォルダ内に解凍する
939        $result = $tar->extractModify($dir. '/', $unpacking_name);
940        GC_Utils_Ex::gfPrintLog('解凍:' . $dir.'/'.$file_name.'->'.$dir.'/'.$unpacking_name);
[22033]941        // 解凍元のファイルを削除する.
942        unlink($path);
[22093]943
[21860]944        return $result;
945    }
946
[21455]947    /**
948     * plugin_idをキーにdtb_pluginのstatusを更新します.
949     *
[23124]950     * @param  int     $plugin_id  プラグインID
951     * @param  int     $enable_flg 有効フラグ
[21455]952     * @return integer 更新件数
953     */
[23124]954    public function updatePluginEnable($plugin_id, $enable_flg)
[22567]955    {
[21455]956        $objQuery =& SC_Query_Ex::getSingletonInstance();
957        // UPDATEする値を作成する。
958        $sqlval['enable'] = $enable_flg;
959        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
[21514]960        $where = 'plugin_id = ?';
[21455]961        // UPDATEの実行
[21481]962        $ret = $objQuery->update('dtb_plugin', $sqlval, $where, array($plugin_id));
[22856]963
[21455]964        return $ret;
965    }
966
967    /**
968     * plugin_idをキーにdtb_plugin, dtb_plugin_hookpointから物理削除します.
[21743]969     *
[23124]970     * @param  int    $plugin_id   プラグインID.
971     * @param  string $plugin_code プラグインコード.
972     * @return array  $arrErr エラー情報を格納した連想配列.
[21455]973     */
[23124]974    public function deletePlugin($plugin_id, $plugin_code)
[22567]975    {
[21455]976        $arrErr = array();
977        $objQuery =& SC_Query_Ex::getSingletonInstance();
978        $objQuery->begin();
[21735]979
[21724]980        SC_Plugin_Util_Ex::deletePluginByPluginId($plugin_id);
[21478]981
[21757]982        if (SC_Helper_FileManager_Ex::deleteFile($this->getPluginDir($plugin_code)) === false) {
[21724]983            // TODO エラー処理
984        }
[21478]985
[21757]986        if (SC_Helper_FileManager_Ex::deleteFile($this->getHtmlPluginDir($plugin_code)) === false) {
[21724]987            // TODO エラー処理
[20246]988        }
[21735]989
[21724]990        $objQuery->commit();
[21735]991
[21527]992        return $arrErr;
[21455]993    }
[21478]994
[21455]995    /**
996     * ファイルがあるかを判定します.
997     *
[23124]998     * @param  string  $plugin_dir 対象ディレクトリ.
999     * @param  string  $file_name  ファイル名.
[21455]1000     * @return boolean
1001     */
[23124]1002    public function isContainsFile($plugin_dir, $file_name)
[22567]1003    {
[21455]1004        if (file_exists($plugin_dir) && is_dir($plugin_dir)) {
[21478]1005            if ($handle = opendir($plugin_dir)) {
1006                while (($item = readdir($handle)) !== false) {
[21455]1007                    if ($item === $file_name) return true;
1008                }
1009            }
1010            closedir($handle);
1011        }
[22856]1012
[21455]1013        return false;
1014    }
[21478]1015
[21527]1016    /**
[21455]1017     * アーカイブ内に指定のファイルが存在するかを判定します.
1018     *
[23124]1019     * @param  Archive_Tar $tar_obj
1020     * @param  string      $file_path 判定するファイルパス
[21455]1021     * @return boolean
1022     */
[23124]1023    public function checkContainsFile($tar_obj, $file_path)
[22567]1024    {
[21458]1025        // ファイル一覧を取得
[21455]1026        $arrayFile = $tar_obj->listContent();
1027        foreach ($arrayFile as  $value) {
[21684]1028            if ($value['filename'] === $file_path) return true;
[21455]1029        }
[22856]1030
[21455]1031        return false;
1032    }
[20246]1033
[21455]1034    /**
1035     * ディレクトリを作成します.
1036     *
[23124]1037     * @param  string $dir_path 作成するディレクトリのパス
[21546]1038     * @return void
[21455]1039     */
[23124]1040    public function makeDir($dir_path)
[22567]1041    {
[21455]1042        // ディレクトリ作成
[21478]1043        if (!file_exists($dir_path)) {
[21527]1044            mkdir($dir_path);
[21455]1045        }
1046    }
1047
1048    /**
1049     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
[21743]1050     *
[23124]1051     * @param  int    $plugin_id プラグインID
[21455]1052     * @return string $conflict_alert_message メッセージ
1053     */
[23124]1054    public function checkConflictPlugin($plugin_id)
[22567]1055    {
[21670]1056        // フックポイントを取得します.
1057        $hookPoints = $this->getHookPoint($plugin_id);
[21478]1058
[21514]1059        $conflict_alert_message = '';
[21670]1060        $arrConflictPluginName = array();
1061        $objQuery =& SC_Query_Ex::getSingletonInstance();
1062        foreach ($hookPoints as $hookPoint) {
1063            // 競合するプラグインを取得する,
[21809]1064            $table = 'dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 ON T1.plugin_id = T2.plugin_id';
[21707]1065            $where = 'T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = ' . PLUGIN_ENABLE_TRUE;
1066            $objQuery->setGroupBy('T1.plugin_id, T2.plugin_name');
[21670]1067            $conflictPlugins = $objQuery->select('T1.plugin_id, T2.plugin_name', $table, $where, array($hookPoint['hook_point'], $hookPoint['plugin_id']));
[21478]1068
[21670]1069            // プラグイン名重複を削除する為、専用の配列に格納し直す.
[21683]1070            foreach ($conflictPlugins as $conflictPlugin) {
[21670]1071                // プラグイン名が見つからなければ配列に格納
[21683]1072                if (!in_array($conflictPlugin['plugin_name'], $arrConflictPluginName)) {
[21670]1073                    $arrConflictPluginName[] = $conflictPlugin['plugin_name'];
1074                }
[21455]1075            }
1076        }
[21670]1077        // メッセージをセットします.
1078        foreach ($arrConflictPluginName as $conflictPluginName) {
1079            $conflict_alert_message .= '* ' .  $conflictPluginName . 'と競合する可能性があります。<br/>';
1080        }
[22856]1081
[21455]1082        return $conflict_alert_message;
1083    }
[21478]1084
[21455]1085    /**
1086     * エラー情報が格納されているか判定します.
1087     *
[23124]1088     * @param  array    $arrErr エラー情報を格納した連想配列.
[21455]1089     * @return boolean.
1090     */
[23124]1091    public function isError($error)
[22567]1092    {
[21555]1093        if (is_array($error) && count($error) > 0) {
[21455]1094            return true;
1095        }
[22856]1096
[21455]1097        return false;
1098    }
[21683]1099
[21670]1100    /**
1101     * プラグインIDからフックポイントを取得します,
[21743]1102     *
[23124]1103     * @param  string $plugin_id プラグインID
1104     * @return array  フックポイントの連想配列.
[21670]1105     */
[23124]1106    public function getHookPoint($plugin_id)
[22567]1107    {
[21743]1108        $objQuery =& SC_Query_Ex::getSingletonInstance();
[21683]1109
[21670]1110        $table = 'dtb_plugin_hookpoint';
1111        $where = 'plugin_id = ?';
[22856]1112
[21670]1113        return $objQuery->select('*', $table, $where, array($plugin_id));
1114    }
[19661]1115}
Note: See TracBrowser for help on using the repository browser.