Ignore:
Timestamp:
2012/02/08 13:55:06 (12 years ago)
Author:
h_yoshimoto
Message:

#1603 #1632 プラグインの管理画面を作成しました。それに伴うエンジン部分の修正。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php

    r21441 r21455  
    7474        $objFormParam->setParam($_POST); 
    7575 
    76         $mode = $this->getMode(); 
     76        $mode = $this->getMode();         
    7777 
    7878        switch ($mode) { 
    79         case 'install': 
    80         case 'uninstall': 
    81         case 'enable': 
    82         case 'disable': 
    83             // エラーチェック 
    84             $this->arrErr = $objFormParam->checkError(); 
    85  
    86             if (count($this->arrErr) == 0) { 
    87                 $plugin_id = $objFormParam->getValue('plugin_id'); 
    88                 $plugin_code = $objFormParam->getValue('plugin_code'); 
    89  
    90                 // プラグインファイルを読み込み、modeで指定されたメソッドを実行 
    91                 $this->arrErr = $this->lfExecPlugin($plugin_id, $plugin_code, $mode); 
    92             } 
    93             break; 
    94         case 'upload': 
    95             // プラグイン情報を設定 
    96             $plugin_code = $this->lfGetPluginCode($_FILES['plugin_file']['name']); 
    97             $plugin_dir = $this->lfGetPluginDir($plugin_code); 
    98  
    99             // ファイルアップロード情報を設定 
    100             $objUpFile = new SC_UploadFile_Ex(TEMPLATE_TEMP_REALDIR, $plugin_dir); 
    101             $this->lfInitUploadFile($objUpFile); 
    102  
    103             // エラーチェック 
    104             $this->arrErr = $this->lfCheckErrorUploadFile($plugin_code, $plugin_dir); 
    105  
    106             if (count($this->arrErr) == 0) { 
    107                 // 一時ディレクトリへアップロード 
    108                 $this->arrErr['plugin_file'] = $objUpFile->makeTempFile('plugin_file', false); 
    109  
    110                 if ($this->arrErr['plugin_file'] == "") { 
    111                     // プラグイン保存ディレクトリへ解凍 
    112                     $this->arrErr = $this->lfUploadPlugin($objUpFile, $plugin_dir, $plugin_code, $_FILES['plugin_file']['name']); 
    113  
    114                     // 完了メッセージアラート設定 
    115                     if (count($this->arrErr) == 0) { 
    116                         $this->tpl_onload = "alert('プラグインをアップロードしました。');"; 
     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/>"; 
    11799                    } 
    118100                } 
     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']); 
    119212            } 
    120             break; 
    121         case 'up': 
    122             $this->arrErr = $objFormParam->checkError(); 
    123             if (count($this->arrErr) == 0) { 
    124                 $plugin_id = $objFormParam->getValue('plugin_id'); 
    125                 SC_Helper_DB_Ex::sfRankUp("dtb_plugin", "plugin_id", $plugin_id); 
    126                 SC_Response_Ex::reload(); 
    127             } 
    128             break; 
    129         case 'down': 
    130             $this->arrErr = $objFormParam->checkError(); 
    131             if (count($this->arrErr) == 0) { 
    132                 $plugin_id = $objFormParam->getValue('plugin_id'); 
    133                 SC_Helper_DB_Ex::sfRankDown("dtb_plugin", "plugin_id", $plugin_id); 
    134                 SC_Response_Ex::reload(); 
    135             } 
    136             break; 
    137  
    138         default: 
    139             break; 
    140         } 
    141  
    142         // DBからプラグイン情報を取得 
    143         $this->plugins = SC_Helper_Plugin_Ex::getAllPlugin(); 
     213        } 
     214        $this->plugins = $plugins; 
    144215    } 
    145216 
     
    164235        $objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK')); 
    165236        $objFormParam->addParam('plugin_code', 'plugin_code', MTEXT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK')); 
    166     } 
    167  
    168     /** 
    169      * アップロードファイルパラメーター初期化. 
     237        $objFormParam->addParam("優先順位", "priority", INT_LEN, 'n', array("NUM_CHECK", 'MAX_LENGTH_CHECK')); 
     238    } 
     239 
     240    /** 
     241     * ファイルパラメーター初期化. 
    170242     * 
    171243     * @param object $objUpFile SC_UploadFileのインスタンス. 
     244     * @param string $key 登録するキー. 
    172245     * @return void 
    173246     */ 
    174     function lfInitUploadFile(&$objUpFile) { 
    175         $objUpFile->addFile("プラグイン", 'plugin_file', array('tar', 'tar.gz'), TEMPLATE_SIZE, true, 0, 0, false); 
    176     } 
    177  
    178     /** 
    179      * アップロードファイルのエラーチェック. 
    180      *  
    181      * @param string $plugin_code 
    182      * @param string $plugin_dir 
    183      * @return array エラー情報を格納した連想配列. 
    184      *  
    185      */ 
    186     function lfCheckErrorUploadFile($plugin_code, $plugin_dir) { 
    187         $arrErr = array(); 
    188  
    189         // プラグイン重複チェック 
    190         $plugins = SC_Helper_Plugin_Ex::getAllPlugin(); 
    191         foreach ($plugins as $val) { 
    192             if ($val['plugin_code'] == $plugin_code) { 
    193                 $arrErr['plugin_file'] = "※ 同名のプラグインがすでに登録されています。<br/>"; 
    194             } 
    195         } 
    196  
    197         return $arrErr; 
    198     } 
    199  
    200     /** 
    201      * プラグイン名(物理名)を取得する. 
    202      * (アップロードされたファイル名をプラグイン名(物理名)とする). 
    203      *  
    204      * @param string $upload_file_name 
    205      * @return string プラグイン名(物理名). 
    206      *  
    207      */ 
    208     function lfGetPluginCode($upload_file_name) { 
     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) { 
    209316        $array_ext = explode(".", $upload_file_name); 
    210317        return $array_ext[0]; 
     
    214321     * プラグイン保存ディレクトリのパスを取得する. 
    215322     * 
    216      * @param string $plugin_code 
    217      * @return string プラグイン保存ディレクトリ. 
    218      *  
    219      */ 
    220     function lfGetPluginDir($plugin_code) { 
    221         $plugin_dir = DATA_REALDIR . 'plugin/' . $plugin_code . '/'; 
    222         return $plugin_dir; 
     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; 
    223340    } 
    224341 
     
    226343     * プラグインファイルのパスを取得する. 
    227344     *  
    228      * @param string $plugin_code 
    229      * @return string プラグインファイルパス. 
    230      */ 
    231     function lfGetPluginFilePath($plugin_code) { 
    232         $plugin_file_path = $this->lfGetPluginDir($plugin_code) . $plugin_code . '.php'; 
     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'; 
    233350        return $plugin_file_path; 
    234351    } 
    235     /** 
    236      * プラグインをアップロードする. 
    237      *  
    238      * @param object $objUpFile 
    239      * @param string $plugin_dir 
    240      * @param string $plugin_code 
    241      * @param string $plugin_file_name 
    242      * @return array エラー情報を格納した連想配列. 
    243      *  
    244      */ 
    245     function lfUploadPlugin(&$objUpFile, $plugin_dir, $plugin_code, $plugin_file_name) { 
    246         $arrErr = array(); 
    247  
    248         // 必須チェック 
    249         $arrErr = $objUpFile->checkEXISTS('plugin_file'); 
    250  
    251         if (count($arrErr) == 0) { 
    252             // プラグイン保存ディレクトリ作成 
    253             if (file_exists($plugin_dir)) { 
    254                 $arrErr['plugin_file'] = "※ 同名のディレクトリがすでに存在します。<br/>"; 
     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); 
    255630            } else { 
    256                 mkdir($plugin_dir); 
     631                $arrErr['plugin_error'] = "※ " . $plugin_code . ".php に" . $exec_func . "が見つかりません。<br/>"; 
    257632            } 
    258633 
    259             if (count($arrErr) == 0) { 
    260                 // 一時ディレクトリからプラグイン保存ディレクトリへ移動 
    261                 $objUpFile->moveTempFile(); 
    262  
    263                 // プラグイン保存ディレクトリへ解凍 
    264                 SC_Helper_FileManager_Ex::unpackFile($plugin_dir . $plugin_file_name); 
    265  
    266                 // プラグイン情報をDB登録 
    267                 $this->lfRegistData($plugin_dir, $plugin_code); 
     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                } 
    268706            } 
    269         } 
    270  
    271         return $arrErr; 
    272     } 
    273  
    274     /** 
    275      * プラグイン情報をDB登録. 
    276      * 
    277      * @param string $plugin_dir 
    278      * @param string $plugin_code 
    279      * @return void 
    280      * 
    281      */ 
    282     function lfRegistData($plugin_dir, $plugin_code) { 
    283         $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    284         $sqlval = array(); 
    285  
    286         $sqlval['plugin_id'] = $objQuery->nextVal('dtb_plugin_plugin_id'); 
    287         $sqlval['plugin_code'] = $plugin_code; 
    288         $sqlval['rank'] = 1 + $objQuery->max('rank', 'dtb_plugin'); 
    289         $sqlval['status'] = PLUGIN_STATUS_UPLOADED; 
    290         $sqlval['enable'] = PLUGIN_ENABLE_FALSE; 
    291         $sqlval['update_date'] = 'CURRENT_TIMESTAMP'; 
    292         $objQuery->insert('dtb_plugin', $sqlval); 
    293     } 
    294  
    295     /** 
    296      * プラグインファイルを読み込む. 
    297      *  
    298      * @param string $plugin_code 
    299      * @return array エラー情報を格納した連想配列. 
    300      */ 
    301     function lfRequirePluginFile($plugin_code) { 
    302         $arrErr = array(); 
    303         $plugin_file_path = $this->lfGetPluginFilePath($plugin_code); 
    304  
    305         if (file_exists($plugin_file_path)) { 
    306             require_once $plugin_file_path; 
    307         } else { 
    308             $arrErr['plugin_error'] = "※ " . $plugin_code . ".phpが存在しないため実行できません。<br/>"; 
    309         } 
    310  
    311         return $arrErr; 
    312     } 
    313  
    314     /** 
    315      * プラグインファイルを読み込み、指定されたメソッドを実行する. 
    316      * 
    317      * @param integer $plugin_id 
    318      * @param string $plugin_code 
    319      * @param string $exec_mode プラグイン実行メソッド名. 
    320      * @return array エラー情報を格納した連想配列. 
    321      * 
    322      */ 
    323     function lfExecPlugin($plugin_id, $plugin_code, $exec_mode) { 
    324         $arrErr = array(); 
    325  
    326         // プラグインファイル読み込み 
    327         $arrErr = $this->lfRequirePluginFile($plugin_code); 
    328  
    329         if (count($arrErr) == 0) { 
    330             $plugin = new $plugin_code(); 
    331             $arrErr = $plugin->$exec_mode($plugin_id); 
    332         } 
    333  
    334         return $arrErr; 
     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; 
    335793    } 
    336794} 
Note: See TracChangeset for help on using the changeset viewer.