Index: branches/version-2_12-dev/data/require_base.php
===================================================================
--- branches/version-2_12-dev/data/require_base.php	(revision 21395)
+++ branches/version-2_12-dev/data/require_base.php	(revision 21455)
@@ -47,4 +47,7 @@
     $sessionFactory = SC_SessionFactory::getInstance();
     $sessionFactory->initSession();
+    
+    // プラグインを読み込む
+    require_once DATA_REALDIR . 'require_plugin.php';
 
     /*
@@ -54,6 +57,4 @@
     $objSession->adminAuthorization();
 
-    // プラグインを読み込む
-    require_once DATA_REALDIR . 'require_plugin.php';
 }
 ?>
Index: branches/version-2_12-dev/data/class/helper/SC_Helper_Plugin.php
===================================================================
--- branches/version-2_12-dev/data/class/helper/SC_Helper_Plugin.php	(revision 21450)
+++ branches/version-2_12-dev/data/class/helper/SC_Helper_Plugin.php	(revision 21455)
@@ -54,9 +54,10 @@
         foreach ($arrPluginDataList as $arrPluginData) {
             // プラグイン本体ファイル名が取得したプラグインディレクトリ一覧にある事を確認
-            if (array_search($arrPluginData['class_name'], $arrPluginDirectory) !== false) {
+            if (array_search($arrPluginData['plugin_code'], $arrPluginDirectory) !== false ) {
                 // プラグイン本体ファイルをrequire.
-                require_once PLUGIN_UPLOAD_REALDIR . $arrPluginData['class_name'] . '/' . $arrPluginData['class_name'] . '.php';
+                require_once(PLUGIN_UPLOAD_REALDIR . $arrPluginData['plugin_code'] . '/' . $arrPluginData['plugin_code'] . '.php');
+                
                 // プラグインのインスタンス生成.
-                $objPlugin = new $arrPluginData['class_name']($arrPluginData);
+                $objPlugin = new $arrPluginData['plugin_code']($arrPluginData);
                 // メンバ変数にプラグインのインスタンスを登録.
                 $this->arrPluginInstances[$arrPluginData['plugin_id']] = $objPlugin;
@@ -118,5 +119,5 @@
         $col = '*';
         $table = 'dtb_plugin';
-        $where = 'enable = 1 AND del_flg = 0';
+        $where = 'enable = 1';
         // XXX 2.11.0 互換のため
         $arrCols = $objQuery->listTableFields($table);
@@ -130,4 +131,6 @@
     /**
      * インストールされているプラグインを取得する。
+     * 
+     * @return array $arrRet インストールされているプラグイン.
      */
     function getAllPlugin(){
@@ -135,12 +138,51 @@
         $col = '*';
         $table = 'dtb_plugin';
-        $where = 'del_flg = 0';
         // XXX 2.11.0 互換のため
         $arrCols = $objQuery->listTableFields($table);
         if (in_array('rank', $arrCols)) {
-            $objQuery->setOrder('rank DESC');
-        }
-        $arrRet = $objQuery->select($col,$table,$where);
+            $objQuery->setOrder('plugin_id ASC');
+        }
+        $arrRet = $objQuery->select($col,$table);
         return $arrRet;
+    }
+
+    /**
+     * プラグインIDをキーにプラグインを取得する。
+     * 
+     * @param int $plugin_id プラグインID.
+     * @return array プラグインの基本情報.
+     */
+    function getPluginByPluginId($plugin_id){
+        $objQuery = new SC_Query_Ex();
+        $col = '*';
+        $table = 'dtb_plugin';
+        $where = 'plugin_id = ?';
+        // XXX 2.11.0 互換のため
+        $arrCols = $objQuery->listTableFields($table);
+        if (in_array('rank', $arrCols)) {
+            $objQuery->setOrder('rank ASC');
+        }
+        $arrRet = $objQuery->select($col, $table, $where, array($plugin_id));
+        return $arrRet[0];
+    }
+    
+    /**
+     * プラグインコードをキーにプラグインを取得する。
+     * 
+     * @param string $plugin_code プラグインコード.
+     * @return array プラグインの基本情報.
+     */
+    function getPluginByPluginCode($plugin_code){
+        $objQuery = new SC_Query_Ex();
+        $col = '*';
+        $table = 'dtb_plugin';
+        $where = 'plugin_code = ?';
+        // XXX 2.11.0 互換のため
+        $arrCols = $objQuery->listTableFields($table);
+        if (in_array('rank', $arrCols)) {
+            $objQuery->setOrder('rank ASC');
+        }
+        $arrRet = $objQuery->select($col, $table, $where, array($plugin_code));
+        return $arrRet[0];
     }
 
@@ -266,5 +308,5 @@
         // キャッシュテンプレートを削除
         if ($test_mode === false) {
-            $this->unlinkRecurse(PLUGIN_TMPL_CACHE_REALDIR, false);
+            SC_Utils_Ex::deleteFile(PLUGIN_TMPL_CACHE_REALDIR, false);
         }
         $objTemplateTransformList = SC_Plugin_Template_Transform_List::getSingletonInstance();
@@ -279,37 +321,4 @@
 
     /**
-     * 指定されたパスの配下を再帰的に unlink
-     *
-     * @param string  $path       削除対象のディレクトリまたはファイルのパス
-     * @param boolean $del_myself $pathそのものを削除するか. true なら削除する.
-     * @return void
-     */
-    function unlinkRecurse($path, $del_myself = true) {
-        if (!file_exists($path)) {
-            // TODO エラー処理; パスが存在しません
-        } elseif (is_dir($path)) {
-            // ディレクトリ
-            $handle = opendir($path);
-            if (!$handle) {
-                // TODO エラー処理; ディレクトリが開けませんでした
-            }
-
-            while (($item = readdir($handle)) !== false) {
-                if ($item === '.' || $item === '..') continue;
-                $cur_path = $path . '/' . $item;
-                if (is_dir($cur_path)) SC_Helper_Plugin::unlinkRecurse($cur_path);
-                else @unlink($cur_path);
-            }
-            closedir($handle);
-
-            // ディレクトリを削除
-            if ($del_myself) @rmdir($path);
-        } else {
-            // ファイルが指定された
-            @unlink($path);
-        }
-    }
-
-    /**
      * テンプレートキャッシュファイルのフルパスを返す.
      *
@@ -319,13 +328,13 @@
     function getPluginTemplateCachePath($objPage) {
         // main_template の差し替え
-    if (strpos($objPage->tpl_mainpage, SMARTY_TEMPLATES_REALDIR) === 0) {
-    // フルパスで指定された
-    $dir = '';
-    $default_tpl_mainpage = str_replace(SMARTY_TEMPLATES_REALDIR, '', $objPage->tpl_mainpage);
-    } else {
+        if (strpos($objPage->tpl_mainpage, SMARTY_TEMPLATES_REALDIR) === 0) {
+            // フルパスで指定された
+            $dir = '';
+            $default_tpl_mainpage = str_replace(SMARTY_TEMPLATES_REALDIR, '', $objPage->tpl_mainpage);
+        } else {
             // フロントページ or 管理画面を判定
-        $dir = ($objPage instanceof LC_Page_Admin) ? 'admin/' : TEMPLATE_NAME . '/';
-    $default_tpl_mainpage = $objPage->tpl_mainpage;
-    }
+            $dir = ($objPage instanceof LC_Page_Admin) ? 'admin/' : TEMPLATE_NAME . '/';
+            $default_tpl_mainpage = $objPage->tpl_mainpage;
+        }
         return PLUGIN_TMPL_CACHE_REALDIR . $dir . $default_tpl_mainpage;
     }
Index: branches/version-2_12-dev/data/class/util/SC_Utils.php
===================================================================
--- branches/version-2_12-dev/data/class/util/SC_Utils.php	(revision 21452)
+++ branches/version-2_12-dev/data/class/util/SC_Utils.php	(revision 21455)
@@ -2135,3 +2135,46 @@
         return true;
     }
+
+    /**
+     * 指定されたパスの配下を再帰的に削除.
+     *
+     * @param string  $path       削除対象のディレクトリまたはファイルのパス
+     * @param boolean $del_myself $pathそのものを削除するか. true なら削除する.
+     * @return void
+     */
+    function deleteFile($path, $del_myself = true) {
+        $flg = false;
+        // 対象が存在するかを検証.
+        if (file_exists($path) === false) {
+            GC_Utils_Ex::gfPrintLog($path . " が存在しません.");
+        } elseif (is_dir($path)) {
+            // ディレクトリが指定された場合
+            $handle = opendir($path);
+            if (!$handle) {
+                GC_Utils_Ex::gfPrintLog($path . " が開けませんでした.");
+            }
+            while (($item = readdir($handle)) !== false) {
+                if ($item === '.' || $item === '..') continue;
+                $cur_path = $path . '/' . $item;
+                if (is_dir($cur_path)) {
+                    // ディレクトリの場合、再帰処理
+                    $flg = SC_Utils_Ex::deleteFile($cur_path);
+                } else {
+                    // ファイルの場合、unlink
+                    $flg = @unlink($cur_path);
+                }
+            }
+            closedir($handle);
+            // ディレクトリを削除
+            GC_Utils_Ex::gfPrintLog($path . " を削除します.");
+            if ($del_myself) {
+                $flg = @rmdir($path);
+            }
+        } else {
+            // ファイルが指定された場合.
+            GC_Utils_Ex::gfPrintLog($path . " を削除します.");
+            $flg = @unlink($path);
+        }
+        return $flg;
+    }
 }
Index: branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php	(revision 21441)
+++ branches/version-2_12-dev/data/class/pages/admin/system/LC_Page_Admin_System_Plugin.php	(revision 21455)
@@ -74,72 +74,143 @@
         $objFormParam->setParam($_POST);
 
-        $mode = $this->getMode();
+        $mode = $this->getMode();        
 
         switch ($mode) {
-        case 'install':
-        case 'uninstall':
-        case 'enable':
-        case 'disable':
-            // エラーチェック
-            $this->arrErr = $objFormParam->checkError();
-
-            if (count($this->arrErr) == 0) {
-                $plugin_id = $objFormParam->getValue('plugin_id');
-                $plugin_code = $objFormParam->getValue('plugin_code');
-
-                // プラグインファイルを読み込み、modeで指定されたメソッドを実行
-                $this->arrErr = $this->lfExecPlugin($plugin_id, $plugin_code, $mode);
-            }
-            break;
-        case 'upload':
-            // プラグイン情報を設定
-            $plugin_code = $this->lfGetPluginCode($_FILES['plugin_file']['name']);
-            $plugin_dir = $this->lfGetPluginDir($plugin_code);
-
-            // ファイルアップロード情報を設定
-            $objUpFile = new SC_UploadFile_Ex(TEMPLATE_TEMP_REALDIR, $plugin_dir);
-            $this->lfInitUploadFile($objUpFile);
-
-            // エラーチェック
-            $this->arrErr = $this->lfCheckErrorUploadFile($plugin_code, $plugin_dir);
-
-            if (count($this->arrErr) == 0) {
-                // 一時ディレクトリへアップロード
-                $this->arrErr['plugin_file'] = $objUpFile->makeTempFile('plugin_file', false);
-
-                if ($this->arrErr['plugin_file'] == "") {
-                    // プラグイン保存ディレクトリへ解凍
-                    $this->arrErr = $this->lfUploadPlugin($objUpFile, $plugin_dir, $plugin_code, $_FILES['plugin_file']['name']);
-
-                    // 完了メッセージアラート設定
-                    if (count($this->arrErr) == 0) {
-                        $this->tpl_onload = "alert('プラグインをアップロードしました。');";
+            // インストール
+            case 'install':
+                $file_key = "plugin_file";
+                $plugin_file = $_FILES[$file_key];
+                $this->arrErr = $this->checkUploadFile($plugin_file, $file_key);
+                if($this->isError($this->arrErr) === false){
+                    $plugin_file_name = $plugin_file['name'];
+                    $plugin_code = $this->getPluginCode($plugin_file_name);
+
+                    // 既に登録されていないか判定.
+                    if($this->isInstalledPlugin($plugin_code) === false){
+                        // インストール処理.
+                        $this->arrErr = $this->installPlugin($plugin_code, $plugin_file_name);
+                        if($this->isError($this->arrErr) === false) {
+                            // テンプレート再生成.
+                            $this->remakeTemplate();
+                            $this->tpl_onload = "alert('プラグインをインストールしました。');";
+                        }
+                    } else {
+                        $this->arrErr[$file_key] = "※ 既にインストールされているプラグインです。<br/>";
                     }
                 }
+                break;
+            // 削除
+            case 'uninstall':
+                // エラーチェック
+                $this->arrErr = $objFormParam->checkError();
+                if($this->isError($this->arrErr) === false) {
+                    $plugin_code = $objFormParam->getValue('plugin_code');
+                    $plugin_id = $objFormParam->getValue('plugin_id');
+
+                    $this->arrErr = $this->uninstallPlugin( $plugin_id, $plugin_code);
+                    // 完了メッセージアラート設定.
+                    if($this->isError($this->arrErr) === false) {
+                        $plugin = SC_Helper_Plugin_Ex::getPluginByPluginId($plugin_id);
+                        // テンプレート再生成.
+                        $this->remakeTemplate();
+                        $this->tpl_onload = "alert('" . $plugin['plugin_name'] ."を削除しました。');";
+                    }
+                }
+                break;
+            // 有効化
+            case 'enable':
+                // エラーチェック
+                $arrErr = $objFormParam->checkError();
+                if($this->isError($arrErr) === false) {
+                    $plugin_id = $objFormParam->getValue('plugin_id');
+                    // プラグイン取得.
+                    $plugin = SC_Helper_Plugin_Ex::getPluginByPluginId($plugin_id);
+                    // ステータス更新
+                    $arrErr = $this->enablePlugin($plugin_id, $plugin['plugin_code']);                    
+                    if($this->isError($arrErr) === false) {
+                        // テンプレート再生成.
+                        $this->remakeTemplate();
+                        echo SC_Utils_Ex::jsonEncode(array('message' => $plugin['plugin_name'] . "を有効にしました。"));
+                    }
+                }
+                exit;
+                break;
+            // 無効化
+            case 'disable':
+                // エラーチェック
+                $arrErr = $objFormParam->checkError();
+                if($this->isError($arrErr) === false) {
+                    $plugin_id = $objFormParam->getValue('plugin_id');
+                    // プラグイン取得.
+                    $plugin = SC_Helper_Plugin_Ex::getPluginByPluginId($plugin_id);
+                    // プラグインを無効にします
+                    $arrErr = $this->disablePlugin($plugin_id, $plugin['plugin_code']);                    
+                    if($this->isError($arrErr) === false) {
+                        // テンプレート再生成.
+                        $this->remakeTemplate();
+                        echo SC_Utils_Ex::jsonEncode(array('message' => $plugin['plugin_name'] . "を無効にしました。"));
+                    }
+                }
+                exit;
+                break;
+            // アップデート.
+            case 'update':
+                // エラーチェック
+                $this->arrErr = $objFormParam->checkError();
+                if($this->isError($this->arrErr) === false){
+                    $file_key = "update_plugin_file";
+                    $update_plugin_file = $_FILES[$file_key];
+                    
+                    $this->arrErr = $this->checkUploadFile($update_plugin_file, $file_key);
+                    if($this->isError($this->arrErr) === false){
+                        $update_plugin_file_name = $update_plugin_file['name']; // アップデートファイルのファイル名.
+                        $update_plugin_code = $this->getPluginCode($update_plugin_file_name); // アップデートファイルのプラグインコード.
+                        $plugin_code = $objFormParam->getValue('plugin_code'); // アップデート対象のプラグインコード
+                       
+                        // インストールされているプラグインかを判定.
+                        if($this->isInstalledPlugin($update_plugin_code) === true && $update_plugin_code === $plugin_code){
+                            // インストール処理.
+                            $this->arrErr = $this->updatePlugin($plugin_code, $update_plugin_file_name, $file_key, $objFormParam->getValue('plugin_id'));
+                            if($this->isError($this->arrErr) === false) {
+                                // テンプレート再生成.
+                                $this->remakeTemplate();
+                                $this->tpl_onload = "alert('プラグインをアップデートしました。');";
+                            }
+                        } else {
+                            $this->arrErr[$file_key] = "※ プラグインファイルが不正です。<br/>";
+                        }
+                    }
+                }
+
+                break;
+            // 優先度.
+            case 'priority':
+                // TODO 優先度の変更処理.
+//                // 優先度を取得
+//                $priority_array = $objFormParam->getValue('priority');
+//                
+//                // 優先度の更新
+//                $objQuery =& SC_Query_Ex::getSingletonInstance();
+//                foreach ($priority_array as $key => $value) {
+//                    $sqlval['rank'] = $value;
+//                    $objQuery->update("dtb_plugin", $sqlval, "plugin_id = ?", array($key));
+//                }
+//                break;
+            default:
+                break;
+        }
+
+        // DBからプラグイン情報を取得
+        $plugins = SC_Helper_Plugin_Ex::getAllPlugin();
+
+        foreach ($plugins as $key => $plugin) {
+            // 設定ファイルがあるかを判定.
+            $plugins[$key]['config_flg'] = $this->isContainsFile(PLUGIN_UPLOAD_REALDIR . $plugin['plugin_code'], "config.php");
+            if($plugins[$key]['enable'] === PLUGIN_ENABLE_TRUE){
+                // 競合するプラグインがあるかを判定.
+                $plugins[$key]['conflict_message']= $this->checkConflictPlugin($plugin['plugin_id']);
             }
-            break;
-        case 'up':
-            $this->arrErr = $objFormParam->checkError();
-            if (count($this->arrErr) == 0) {
-                $plugin_id = $objFormParam->getValue('plugin_id');
-                SC_Helper_DB_Ex::sfRankUp("dtb_plugin", "plugin_id", $plugin_id);
-                SC_Response_Ex::reload();
-            }
-            break;
-        case 'down':
-            $this->arrErr = $objFormParam->checkError();
-            if (count($this->arrErr) == 0) {
-                $plugin_id = $objFormParam->getValue('plugin_id');
-                SC_Helper_DB_Ex::sfRankDown("dtb_plugin", "plugin_id", $plugin_id);
-                SC_Response_Ex::reload();
-            }
-            break;
-
-        default:
-            break;
-        }
-
-        // DBからプラグイン情報を取得
-        $this->plugins = SC_Helper_Plugin_Ex::getAllPlugin();
+        }
+        $this->plugins = $plugins;
     }
 
@@ -164,47 +235,83 @@
         $objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
         $objFormParam->addParam('plugin_code', 'plugin_code', MTEXT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
-    }
-
-    /**
-     * アップロードファイルパラメーター初期化.
+        $objFormParam->addParam("優先順位", "priority", INT_LEN, 'n', array("NUM_CHECK", 'MAX_LENGTH_CHECK'));
+    }
+
+    /**
+     * ファイルパラメーター初期化.
      *
      * @param object $objUpFile SC_UploadFileのインスタンス.
+     * @param string $key 登録するキー.
      * @return void
      */
-    function lfInitUploadFile(&$objUpFile) {
-        $objUpFile->addFile("プラグイン", 'plugin_file', array('tar', 'tar.gz'), TEMPLATE_SIZE, true, 0, 0, false);
-    }
-
-    /**
-     * アップロードファイルのエラーチェック.
-     * 
-     * @param string $plugin_code
-     * @param string $plugin_dir
-     * @return array エラー情報を格納した連想配列.
-     * 
-     */
-    function lfCheckErrorUploadFile($plugin_code, $plugin_dir) {
-        $arrErr = array();
-
-        // プラグイン重複チェック
-        $plugins = SC_Helper_Plugin_Ex::getAllPlugin();
-        foreach ($plugins as $val) {
-            if ($val['plugin_code'] == $plugin_code) {
-                $arrErr['plugin_file'] = "※ 同名のプラグインがすでに登録されています。<br/>";
-            }
-        }
-
-        return $arrErr;
-    }
-
-    /**
-     * プラグイン名(物理名)を取得する.
-     * (アップロードされたファイル名をプラグイン名(物理名)とする).
-     * 
-     * @param string $upload_file_name
-     * @return string プラグイン名(物理名).
-     * 
-     */
-    function lfGetPluginCode($upload_file_name) {
+    function lfInitUploadFile(&$objUpFile, $key) {
+        $objUpFile->addFile("プラグインファイル", $key, array('tar', 'tar.gz'), FILE_SIZE, true, 0, 0, false);
+    }
+
+    /**
+     * ファイルが指定されている事をチェックします.
+     * 
+     * @param string $file ファイル
+     * @param string $file_key ファイルキー
+     * @return array エラー情報を格納した連想配列.
+     */
+    function checkUploadFile($file, $file_key) {
+        $arrErr = array();
+        
+        if ($file['size'] <= 0) {
+            $arrErr[$file_key] = '※ ファイルがアップロードされていません';
+        }
+        return $arrErr;
+    }
+    
+    /**
+     * 既にインストールされているプラグインかを判定します.
+     *
+     * @param string $plugin_code プラグインコード
+     * @return boolean インストール済の場合true インストールされていない場合false 
+     */
+    function isInstalledPlugin($plugin_code) {
+        $plugin = SC_Helper_Plugin_Ex::getPluginByPluginCode($plugin_code);
+        if(!empty($plugin)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * アップロードされた圧縮ファイルが正常であるかを検証します.
+     *
+     * @param string $file_path チェックするファイルのパス
+     * @param string $plugin_code プラグインコード
+     * @return array エラー情報を格納した連想配列.
+     */
+    function checkPluginFile($file_path, $plugin_code, $key_file) {
+        $arrErr = array();
+        
+        // Archive_Tarを生成します.
+        $tar_obj = new Archive_Tar($file_path);
+        
+        // 圧縮ファイル名とディレクトリ名が同一であるかを判定します.
+        if($this->checkUploadFileName($tar_obj, $plugin_code) === false) {
+            $arrErr[$key_file] = "※ 圧縮ファイル名 or フォルダ名が不正です。圧縮ファイル名とフォルダ名が同一である事を確認して下さい。<br/>";
+            return $arrErr;
+        }
+        
+        // 必須となるクラスファイルが含まれているかを判定します.
+        $plugin_main_file = $plugin_code . "/" . $plugin_code . ".php";
+        if($this->checkContainsFile($tar_obj, $plugin_main_file) === false) {
+            $arrErr[$key_file] = "※ ファイルに" .  $plugin_code . ".phpが含まれていません。<br/>";
+            return $arrErr;
+        }
+        return $arrErr;
+    }
+
+    /**
+     * プラグインコードを取得する.
+     * 
+     * @param string $upload_file_name アップロードファイル名
+     * @return string プラグインコード.
+     */
+    function getPluginCode($upload_file_name) {
         $array_ext = explode(".", $upload_file_name);
         return $array_ext[0];
@@ -214,11 +321,21 @@
      * プラグイン保存ディレクトリのパスを取得する.
      *
-     * @param string $plugin_code
-     * @return string プラグイン保存ディレクトリ.
-     * 
-     */
-    function lfGetPluginDir($plugin_code) {
-        $plugin_dir = DATA_REALDIR . 'plugin/' . $plugin_code . '/';
-        return $plugin_dir;
+     * @param string $plugin_code プラグインコード
+     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
+     */
+    function getPluginDir($plugin_code) {
+        $plugin_dir_path = PLUGIN_UPLOAD_REALDIR . $plugin_code . '/';
+        return $plugin_dir_path;
+    }
+    
+    /**
+     * プラグインHTMLディレクトリのパスを取得する.
+     *
+     * @param string $plugin_code プラグインコード
+     * @return string $plugin_dir_path プラグイン保存ディレクトリのパス.
+     */
+    function getHtmlPluginDir($plugin_code) {
+        $plugin_dir_path = PLUGIN_HTML_REALDIR . $plugin_code . '/';
+        return $plugin_dir_path;
     }
 
@@ -226,111 +343,452 @@
      * プラグインファイルのパスを取得する.
      * 
-     * @param string $plugin_code
-     * @return string プラグインファイルパス.
-     */
-    function lfGetPluginFilePath($plugin_code) {
-        $plugin_file_path = $this->lfGetPluginDir($plugin_code) . $plugin_code . '.php';
+     * @param string $plugin_code プラグインコード
+     * @return string $plugin_file_path クラスファイルのパス.
+     */
+    function getPluginFilePath($plugin_code) {
+        $plugin_file_path = $this->getPluginDir($plugin_code) . $plugin_code . '.php';
         return $plugin_file_path;
     }
-    /**
-     * プラグインをアップロードする.
-     * 
-     * @param object $objUpFile
-     * @param string $plugin_dir
-     * @param string $plugin_code
-     * @param string $plugin_file_name
-     * @return array エラー情報を格納した連想配列.
-     * 
-     */
-    function lfUploadPlugin(&$objUpFile, $plugin_dir, $plugin_code, $plugin_file_name) {
-        $arrErr = array();
-
-        // 必須チェック
-        $arrErr = $objUpFile->checkEXISTS('plugin_file');
-
-        if (count($arrErr) == 0) {
-            // プラグイン保存ディレクトリ作成
-            if (file_exists($plugin_dir)) {
-                $arrErr['plugin_file'] = "※ 同名のディレクトリがすでに存在します。<br/>";
+    
+    /**
+     * プラグインをインストールします.
+     * 
+     * @param string $plugin_code プラグインコード.
+     * @param string $plugin_file_name プラグインファイル名.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function installPlugin($plugin_code, $plugin_file_name) {
+        
+        $arrErr = array();
+        // 保存ディレクトリ.
+        $plugin_dir = $this->getPluginDir($plugin_code);
+        
+        // ファイルをチェックし展開します.
+        $arrErr = $this->unpackPluginFile($plugin_file_name, $plugin_dir, $plugin_code, "plugin_file");
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        
+        // プラグインファイルを読み込み.
+        $plugin_class_file_path = $this->getPluginFilePath($plugin_code);
+        $arrErr = $this->requirePluginFile($plugin_class_file_path, "plugin_file");
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+
+        // プラグイン情報をDB登録
+        if ($this->registData($plugin_code) === false) {
+            $arrErr['plugin_file'] = "※ DB登録に失敗しました。<br/>";
+            return $arrErr;
+        }
+
+        // プラグインhtmlディレクトリ作成
+        $plugin_html_dir = PLUGIN_HTML_REALDIR . $plugin_code;
+        $this->makeDir($plugin_html_dir);
+        
+        $plugin = SC_Helper_Plugin_Ex::getPluginByPluginCode($plugin_code);
+        $arrErr = $this->execPlugin($plugin['plugin_id'], $plugin_code, "install");
+
+        return $arrErr;
+    }
+    
+    /**
+     * プラグインをアップデートします.
+     * 
+     * @param string $plugin_code プラグインコード.
+     * @param string $plugin_file_name プラグインファイル名.
+     * @param string $file_key ファイルキー.
+     * @param string $plugin_id プラグインID.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function updatePlugin($plugin_code, $plugin_file_name, $file_key, $plugin_id) {
+        // アップロードしたファイルのエラーチェック.
+        $arrErr = array();
+        
+        // 展開先ディレクトリ.
+        $temp_plugin_dir = DOWNLOADS_TEMP_DIR . $plugin_code;
+        
+        // ファイルをチェックし展開します.
+        $arrErr = $this->unpackPluginFile($plugin_file_name, $temp_plugin_dir, $plugin_code, $file_key);
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        
+        // 展開されたディレクトリからプラグインクラスファイルを読み込みます.
+        $update_plugin_class_path = $temp_plugin_dir . "/" . $plugin_code . ".php";
+        $arrErr = $this->requirePluginFile($update_plugin_class_path, $file_key);
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        // プラグインクラスファイルのUPDATE処理を実行.
+        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "update");
+        
+        // 保存ディレクトリの削除.
+        SC_Utils_Ex::deleteFile($temp_plugin_dir);
+
+        return $arrErr;
+    }
+    
+    /**
+     * ファイルをアップロードし、解凍先のディレクトリに解凍します.
+     * 
+     * @param string $unpack_file_name ファイル名
+     * @param string $unpack_dir 解凍ディレクトリ
+     * @param string $plugin_code プラグインコード.
+     * @param string $file_key ファイルキー
+     * @return array エラー情報を格納した連想配列.
+     */
+    function unpackPluginFile($unpack_file_name, $unpack_dir, $plugin_code, $file_key) {
+        $arrErr = array();
+        // 解凍ディレクトリディレクトリを作成し、一時ディレクトリからファイルを移動
+        $objUpFile = new SC_UploadFile_Ex(PLUGIN_TEMP_REALDIR, $unpack_dir);
+        $this->lfInitUploadFile($objUpFile, $file_key);
+        $arrErr = $objUpFile->makeTempFile($file_key, false);
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+
+        // 正常にアップロードされているかをチェック.
+        $arrErr = $objUpFile->checkEXISTS($file_key);
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+
+        // 圧縮ファイルの中をチェック.
+        $plugin_file_path = PLUGIN_TEMP_REALDIR . $unpack_file_name;
+        $arrErr = $this->checkPluginFile($plugin_file_path, $plugin_code, $file_key);
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+
+        // 展開用ディレクトリを作成し、一時ディレクトリから移動
+        $this->makeDir($unpack_dir);
+        $objUpFile->moveTempFile();
+        
+        // 解凍
+        $update_plugin_file_path = $unpack_dir . "/" . $unpack_file_name;
+        if (!SC_Helper_FileManager_Ex::unpackFile($update_plugin_file_path)) {
+            $arrErr['plugin_file'] = "※ 解凍に失敗しました。<br/>";
+            return $arrErr;
+        }
+        return $arrErr;
+    }
+    
+    /**
+     * プラグインをアンインストールします.
+     * 
+     * @param int $plugin_id プラグインID.
+     * @param string $plugin_code プラグインコード.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function uninstallPlugin($plugin_id, $plugin_code) {
+        $arrErr = array();
+        // プラグインファイルを読み込みます.
+        $plugin_class_path = $this->getPluginFilePath($plugin_code);
+        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        
+        // modeで指定されたメソッドを実行.
+        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "uninstall");
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        // プラグインの削除処理.
+        $arrErr = $this->deletePlugin($plugin_id, $plugin_code);
+        
+        return $arrErr;
+    }
+    
+    /**
+     * プラグインを有効にします.
+     * 
+     * @param int $plugin_id プラグインID.
+     * @param string $plugin_code プラグインコード.
+     * @return array $arrErr エラー情報を格納した連想配列.
+     */
+    function enablePlugin($plugin_id, $plugin_code) {
+        $arrErr = array();
+        // クラスファイルを読み込み.
+        $plugin_class_path = $this->getPluginFilePath($plugin_code);
+        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        // 無効化処理を実行します.
+        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "enable");
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        // プラグインを有効にします.
+        $this->updatePluginEnable($plugin_id, PLUGIN_ENABLE_TRUE);
+        
+        return $arrErr;
+    }
+    
+    /**
+     * プラグインを無効にします.
+     * 
+     * @param int $plugin_id プラグインID.
+     * @param string $plugin_code プラグインコード.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function disablePlugin($plugin_id, $plugin_code) {
+        $arrErr = array();
+        // クラスファイルを読み込み.
+        $plugin_class_path = $this->getPluginFilePath($plugin_code);
+        $arrErr = $this->requirePluginFile($plugin_class_path, 'plugin_error');
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        
+        // 無効化処理を実行します.
+        $arrErr = $this->execPlugin($plugin_id, $plugin_code, "disable");
+        if ($this->isError($arrErr) === true) {
+            return $arrErr;
+        }
+        // プラグインを無効にします.
+        $this->updatePluginEnable($plugin_id, PLUGIN_ENABLE_FALSE);
+        
+        return $arrErr;
+    }
+
+    /**
+     * プラグイン情報をDB登録.
+     *
+     * @param string $plugin_code プラグインコード.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function registData($plugin_code) {
+        
+        // プラグイン情報をDB登録.
+        // TODO：エラーチェック.
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
+        $objQuery->begin();
+        $sqlval_plugin = array();
+        $plugin_id = $objQuery->nextVal('dtb_plugin_plugin_id');
+        $sqlval_plugin['plugin_id'] = $plugin_id;
+        $sqlval_plugin['plugin_name'] = $plugin_code::PLUGIN_NAME;
+        $sqlval_plugin['plugin_code'] = $plugin_code;
+        $sqlval_plugin['author'] = $plugin_code::AUTHOR;
+        $sqlval_plugin['plugin_site_url'] = $plugin_code::PLUGIN_SITE_URL;
+        $sqlval_plugin['plugin_version'] = $plugin_code::PLUGIN_VERSION;
+        $sqlval_plugin['compliant_version'] = $plugin_code::COMPLIANT_VERSION;
+        $sqlval_plugin['plugin_description'] = $plugin_code::DESCRIPTION;
+        $sqlval_plugin['rank'] = 1 + $objQuery->max('rank', 'dtb_plugin');
+        $sqlval_plugin['enable'] = PLUGIN_ENABLE_FALSE;
+        $sqlval_plugin['update_date'] = 'CURRENT_TIMESTAMP';
+        $objQuery->insert('dtb_plugin', $sqlval_plugin);
+
+        // フックポイントをDB登録.
+        $array_hook_point = explode(",", $plugin_code::HOOK_POINTS);
+        if(is_array($array_hook_point)){
+            foreach ($array_hook_point as $hook_point) {
+                $sqlval_plugin_hookpoint = array();
+                $sqlval_plugin_hookpoint['plugin_id'] = $plugin_id;
+                $sqlval_plugin_hookpoint['hook_point'] = $hook_point;
+                $sqlval_plugin_hookpoint['update_date'] = 'CURRENT_TIMESTAMP';
+                $objQuery->insert('dtb_plugin_hookpoint', $sqlval_plugin_hookpoint);
+            }
+        }
+        return $objQuery->commit();
+    }
+
+    /**
+     * ファイルを読み込む.
+     * 
+     * @param string $file_path クラスのpath
+     * @param string $key エラー情報のキー.
+     * @return array エラー情報を格納した連想配列.
+     */
+    function requirePluginFile($file_path, $key) {
+        $arrErr = array();
+        if(file_exists($file_path)) {
+            require_once $file_path;
+        } else {
+            $arrErr[$key] = "※ " . $file_path ."の読み込みに失敗しました。<br/>";
+        }
+        return $arrErr;
+    }
+
+    /**
+     * インスタンスを生成し、指定のメソッドを実行する.
+     *
+     * @param integer $plugin_id プラグインID
+     * @param string $plugin_code プラグインコード
+     * @param string $exec_func 実行するメソッド名.
+     * @return array $arrErr エラー情報を格納した連想配列.
+     *
+     */
+    function execPlugin($plugin_id, $plugin_code, $exec_func) {
+        $arrErr = array();
+            // インスタンスの生成.
+            $objPlugin = new $plugin_code();
+            if(method_exists($objPlugin, $exec_func) === true){
+                $arrErr = $objPlugin->$exec_func($plugin_id);
             } else {
-                mkdir($plugin_dir);
+                $arrErr['plugin_error'] = "※ " . $plugin_code . ".php に" . $exec_func . "が見つかりません。<br/>";
             }
 
-            if (count($arrErr) == 0) {
-                // 一時ディレクトリからプラグイン保存ディレクトリへ移動
-                $objUpFile->moveTempFile();
-
-                // プラグイン保存ディレクトリへ解凍
-                SC_Helper_FileManager_Ex::unpackFile($plugin_dir . $plugin_file_name);
-
-                // プラグイン情報をDB登録
-                $this->lfRegistData($plugin_dir, $plugin_code);
+        return $arrErr;
+    }
+
+    /**
+     * 管理者側 テンプレート再生成
+     *
+     * @return void
+     */
+    function remakeTemplate() {
+        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+        $objPlugin->remakeAllTemplates();
+    }
+
+    /**
+     * plugin_idをキーにdtb_pluginのstatusを更新します.
+     *
+     * @param int $plugin_id プラグインID
+     * @param int $enable_flg 有効フラグ
+     * @return integer 更新件数
+     */
+    function updatePluginEnable($plugin_id, $enable_flg) {
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
+        // UPDATEする値を作成する。
+        $sqlval['enable'] = $enable_flg;
+        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
+        $where = "plugin_id = ?";
+        // UPDATEの実行
+        $ret = $objQuery->update("dtb_plugin", $sqlval, $where, array($plugin_id));
+        return $ret;
+    }
+
+    /**
+     * plugin_idをキーにdtb_plugin, dtb_plugin_hookpointから物理削除します.
+     * 
+     * @param int $plugin_id プラグインID.
+     * @param string $plugin_code プラグインコード.
+     * @return array $arrErr エラー情報を格納した連想配列.
+     */
+    function deletePlugin($plugin_id, $plugin_code) {
+        $arrErr = array();
+        
+        $objQuery =& SC_Query_Ex::getSingletonInstance();
+        $objQuery->begin();
+        $where = "plugin_id = ?";
+        $objQuery->delete("dtb_plugin", $where, array($plugin_id));
+        $objQuery->delete("dtb_plugin_hookpoint", $where, array($plugin_id));
+        
+        if($objQuery->commit()){
+            if(SC_Utils_Ex::deleteFile($this->getPluginDir($plugin_code)) === false){
+                // TODO エラー処理
+            } 
+            
+            if(SC_Utils_Ex::deleteFile($this->getHtmlPluginDir($plugin_code)) === false){
+                // TODO エラー処理
+            }       
+        }
+       return $arrErr;
+    }
+    
+    /**
+     * ファイルがあるかを判定します.
+     *
+     * @param string $plugin_dir 対象ディレクトリ.
+     * @param string $file_name ファイル名.
+     * @return boolean
+     */
+    function isContainsFile($plugin_dir, $file_name) {
+        if (file_exists($plugin_dir) && is_dir($plugin_dir)) {
+            if($handle = opendir($plugin_dir)){
+                while(($item = readdir($handle)) !== false) {
+                    if ($item === $file_name) return true;
+                }
             }
-        }
-
-        return $arrErr;
-    }
-
-    /**
-     * プラグイン情報をDB登録.
-     *
-     * @param string $plugin_dir
-     * @param string $plugin_code
-     * @return void
-     *
-     */
-    function lfRegistData($plugin_dir, $plugin_code) {
-        $objQuery =& SC_Query_Ex::getSingletonInstance();
-        $sqlval = array();
-
-        $sqlval['plugin_id'] = $objQuery->nextVal('dtb_plugin_plugin_id');
-        $sqlval['plugin_code'] = $plugin_code;
-        $sqlval['rank'] = 1 + $objQuery->max('rank', 'dtb_plugin');
-        $sqlval['status'] = PLUGIN_STATUS_UPLOADED;
-        $sqlval['enable'] = PLUGIN_ENABLE_FALSE;
-        $sqlval['update_date'] = 'CURRENT_TIMESTAMP';
-        $objQuery->insert('dtb_plugin', $sqlval);
-    }
-
-    /**
-     * プラグインファイルを読み込む.
-     * 
-     * @param string $plugin_code
-     * @return array エラー情報を格納した連想配列.
-     */
-    function lfRequirePluginFile($plugin_code) {
-        $arrErr = array();
-        $plugin_file_path = $this->lfGetPluginFilePath($plugin_code);
-
-        if (file_exists($plugin_file_path)) {
-            require_once $plugin_file_path;
-        } else {
-            $arrErr['plugin_error'] = "※ " . $plugin_code . ".phpが存在しないため実行できません。<br/>";
-        }
-
-        return $arrErr;
-    }
-
-    /**
-     * プラグインファイルを読み込み、指定されたメソッドを実行する.
-     *
-     * @param integer $plugin_id
-     * @param string $plugin_code
-     * @param string $exec_mode プラグイン実行メソッド名.
-     * @return array エラー情報を格納した連想配列.
-     *
-     */
-    function lfExecPlugin($plugin_id, $plugin_code, $exec_mode) {
-        $arrErr = array();
-
-        // プラグインファイル読み込み
-        $arrErr = $this->lfRequirePluginFile($plugin_code);
-
-        if (count($arrErr) == 0) {
-            $plugin = new $plugin_code();
-            $arrErr = $plugin->$exec_mode($plugin_id);
-        }
-
-        return $arrErr;
+            closedir($handle);
+        }
+        return false;
+    }
+    
+     /**
+     * アーカイブ内に指定のファイルが存在するかを判定します.
+     *
+     * @param Archive_Tar $tar_obj
+     * @param string $file_path 判定するファイルパス
+     * @return boolean
+     */
+    function checkContainsFile($tar_obj, $file_path) {
+        $arrayFile = $tar_obj->listContent();
+        foreach ($arrayFile as  $value) {
+            if($value["filename"] === $file_path) return true;
+        }
+        return false;
+    }
+
+    /**
+     * 圧縮ファイル名と中のディレクトリ名が同じであるかをチェックします..
+     *
+     * @param Archive_Tar $tar_obj Archive_Tarクラスのオブジェクト
+     * @param string $dir_name ディレクトリ名.
+     * @return boolean
+     */
+    function checkUploadFileName($tar_obj, $dir_name){
+        $arrayFile = $tar_obj->listContent();
+        // ディレクトリ名と圧縮ファイル名が同じかをチェック.
+        $pattern = ("/^". $dir_name ."\/(.*?)/");
+        foreach ($arrayFile as $value) {
+            if(preg_match($pattern, $value["filename"])) return true;
+        }
+        return false;;
+    }
+    
+    /**
+     * ディレクトリを作成します.
+     *
+     * @param string $dir_path 作成するディレクトリのパス
+     */
+    function makeDir($dir_path){
+        // ディレクトリ作成
+        if(!file_exists($dir_path)) {
+             mkdir($dir_path);
+        }
+    }
+
+    /**
+     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
+     * 
+     * @param int $plugin_id プラグインID
+     * @return string $conflict_alert_message メッセージ
+     */
+    function checkConflictPlugin($plugin_id){
+        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
+        $table = "dtb_plugin_hookpoint";
+        $where = "plugin_id = ?";
+        $conflictHookPoints = $objQuery->select( "*", $table, $where, array($plugin_id));
+        
+        $conflict_alert_message = "";
+        foreach ($conflictHookPoints as $conflictHookPoint) {
+            // 登録商品のチェック
+            $table = "dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 ON T1.plugin_id = T2.plugin_id";
+            $where = "T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = " . PLUGIN_ENABLE_TRUE . " GROUP BY T1.plugin_id";
+            $conflictPlugins = $objQuery->select( "T1.plugin_id, T2.plugin_name", $table, $where, array($conflictHookPoint['hook_point'], $conflictHookPoint['plugin_id']));
+            
+            foreach ($conflictPlugins as $conflictPlugin) {
+                $conflict_alert_message =+ "* " .  $conflictPlugin['plugin_name'] . "と競合する可能性があります。<br/>";
+            }
+        }
+        return $conflict_alert_message;
+    }
+    
+    /**
+     * エラー情報が格納されているか判定します.
+     *
+     * @param array $arrErr エラー情報を格納した連想配列.
+     * @return boolean.
+     */
+    function isError($arrErr) {
+        if(is_array($arrErr) && count($arrErr) > 0){
+            return true;
+        }
+        return false;
     }
 }
Index: branches/version-2_12-dev/data/class/pages/admin/LC_Page_Admin.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/LC_Page_Admin.php	(revision 21441)
+++ branches/version-2_12-dev/data/class/pages/admin/LC_Page_Admin.php	(revision 21455)
@@ -65,8 +65,10 @@
         $this->objDisplay = new SC_Display_Ex();
 
-        // スーパーフックポイントを実行.
-        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
-        $objPlugin->doAction('lc_page_preProcess', array($this));
-
+        if($_SERVER['PHP_SELF'] !== "/admin/system/plugin.php") {
+            // スーパーフックポイントを実行.
+            $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+            $objPlugin->doAction('lc_page_preProcess', array($this));
+        }
+        
         // トランザクショントークンの検証と生成
         $this->doValidToken(true);
@@ -89,17 +91,20 @@
     function sendResponse() {
 
-        // HeadNaviにpluginテンプレートを追加する.
-        $objTemplateTransformList = SC_Plugin_Template_Transform_List::getSingletonInstance();
-        $objTemplateTransformList->setHeadNaviBlocs($this->arrPageLayout['HeadNavi']);
+        if($_SERVER['PHP_SELF'] !== "/admin/system/plugin.php") {
+            
+            // プラグインによってトランスフォームされたテンプレートがあればセットする
+            $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+            $plugin_tmplpath = $objPlugin->getPluginTemplateCachePath($this);
+            if (file_exists($plugin_tmplpath)) $this->tpl_mainpage = $plugin_tmplpath;
 
-        // プラグインによってトランスフォームされたテンプレートがあればセットする
-        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
-        $plugin_tmplpath = $objPlugin->getPluginTemplateCachePath($this);
-        if (file_exists($plugin_tmplpath)) $this->tpl_mainpage = $plugin_tmplpath;
-
-        // スーパーフックポイントを実行.
-        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
-        $objPlugin->doAction('lc_page_process', array($this));
-
+            // スーパーフックポイントを実行.
+            $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+            $objPlugin->doAction('lc_page_process', array($this));
+            
+            // HeadNaviにpluginテンプレートを追加する.
+            $objTemplateTransformList = SC_Plugin_Template_Transform_List::getSingletonInstance();
+            $objTemplateTransformList->setHeadNaviBlocs($this->arrPageLayout['HeadNavi']);
+        }
+        
         $this->objDisplay->prepare($this, true);
         $this->objDisplay->response->write();
Index: branches/version-2_12-dev/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php	(revision 21441)
+++ branches/version-2_12-dev/data/class/pages/admin/products/LC_Page_Admin_Products_Category.php	(revision 21455)
@@ -78,5 +78,9 @@
         $objFormParam->setParam($_POST);
         $objFormParam->convParam();
-
+        
+        // フックポイントを実行.
+        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+        $objPlugin->doAction('lc_page_admin_products_category_action_start', array($this));
+        
         switch ($this->getMode()) {
         // カテゴリ登録/編集実行
@@ -183,4 +187,8 @@
         $objDb->findTree($this->arrTree, $parent_category_id, $arrBread);
         $this->tpl_bread_crumbs = SC_Utils_Ex::jsonEncode($arrBread);
+
+        // フックポイントを実行.
+        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+        $objPlugin->doAction('lc_page_admin_products_category_action_end', array($this));
     }
 
Index: branches/version-2_12-dev/data/class/pages/products/LC_Page_Products_List.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/products/LC_Page_Products_List.php	(revision 21442)
+++ branches/version-2_12-dev/data/class/pages/products/LC_Page_Products_List.php	(revision 21455)
@@ -3,5 +3,5 @@
  * This file is part of EC-CUBE
  *
- * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
+ * Copyright(c) 2000-2012 LOCKON CO.,LTD. All Rights Reserved.
  *
  * http://www.lockon.co.jp/
@@ -206,4 +206,7 @@
                 break;
         }
+
+        $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
+        $objPlugin->doAction('lc_page_products_list_action_end',array($this));
 
         $this->tpl_rnd          = SC_Utils_Ex::sfGetRandomString(3);
Index: branches/version-2_12-dev/data/Smarty/templates/admin/system/plugin.tpl
===================================================================
--- branches/version-2_12-dev/data/Smarty/templates/admin/system/plugin.tpl	(revision 21343)
+++ branches/version-2_12-dev/data/Smarty/templates/admin/system/plugin.tpl	(revision 21455)
@@ -22,4 +22,50 @@
  */
 *}-->
+<script type="text/javascript">//<![CDATA[
+    $(function() {
+
+        $('input[id^=plugin_enable]').click(function(event) {
+            var data = {};
+            
+            // モード(有効 or 無効)
+            data.mode = event.target.name;
+            // プラグインID
+            data.plugin_id = event.target.value;
+            data['<!--{$smarty.const.TRANSACTION_ID_NAME}-->'] = '<!--{$transactionid}-->';
+            $.ajax({
+                type : 'POST',
+                url : location.pathname,
+                dataType : "json",
+                data: data,
+                cache : false,
+                error : remoteException,
+                success : function(data, dataType) {
+                        alert(data.message);
+                        location.href = location.pathname;
+                }
+            });
+        });
+
+        /**
+         * 通信エラー表示.
+         */
+        function remoteException(XMLHttpRequest, textStatus, errorThrown) {
+            alert('通信中にエラーが発生しました。');
+        }
+
+    $('.update_link').click(function(event) {
+        var plugin_id = event.target.name;
+        $('div[id="plugin_update_' + plugin_id + '"]').toggle("slow");
+        });
+    });
+
+
+    function removeUpdateFile(select_id) {
+        $('input[name="update_plugin_file"]').attr("disabled", "disabled");
+        $('input[id="' + select_id + '"]').removeAttr("disabled");
+    }
+//]]>
+</script>
+
 <!--<form name="form1" id="form1" method="post" action="?">-->
 <form name="form1" method="post" action="?" enctype="multipart/form-data">
@@ -38,77 +84,98 @@
                 <!--{assign var=key value="plugin_file"}-->
                 <span class="attention"><!--{$arrErr[$key]}--></span>
-                <input type="file" name="<!--{$key}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" class="box54" size="64" <!--{if $arrErr[$key]}-->style="background-color:<!--{$smarty.const.ERR_COLOR|h}-->"<!--{/if}-->>
+                <input type="file" name="<!--{$key}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" class="box45" size="43" <!--{if $arrErr[$key]}-->style="background-color:<!--{$smarty.const.ERR_COLOR|h}-->"<!--{/if}--> >
+                <a class="btn-action" href="javascript:;" onclick="fnModeSubmit('install', '', '');return false;"><span class="btn-next">インストール</span></a>
             </td>
         </tr>
     </table>
 
-    <div class="btn-area">
-        <a class="btn-action" href="javascript:;" onclick="fnModeSubmit('upload', '', '');return false;"><span class="btn-next">この内容で登録する</span></a>
-    </div>
-
     <!--▼プラグイン一覧ここから-->
     <h2>プラグイン一覧</h2>
     <!--{if count($plugins) > 0}-->
-        <span class="attention"><!--{$arrErr.plugin_error}--><!--{$arrErr.mode}--><!--{$arrErr.plugin_id}--><!--{$arrErr.plugin_code}--></span>
-        <table class="list" width="900">
-            <col width="15%" />
+        <span class="attention"><!--{$arrErr.plugin_error}--><!--{$arrErr.update_plugin_file}--></span>
+        <table class="system-plugin" width="900">
             <col width="10%" />
-            <col width="25%" />
-            <col width="28%" />
-            <col width="7%" />
-            <col width="5%" />
-            <col width="5%" />
-            <col width="5%" />
+            <col width="80%" />
+            <col width="10%" />
             <tr>
-                <th>プラグイン名</th>
-                <th>作者</th>
-                <th>サイトURL</th>
-                <th>説明</th>
-                <th>商品ステータス</th>
-                <th>操作</th>
-                <th>設定</th>
-                <th>移動</th>
+                <th colspan="2">機能説明</th>
+                <th>優先度<a class="btn-action" href="javascript:;" onclick="fnModeSubmit('priority','','');return false;"><span class="btn-next">反映</span></a></th>
             </tr>
             <!--{section name=data loop=$plugins}-->
-            <tr>
-                <td><!--{$plugins[data].plugin_name|default:$plugins[data].plugin_code|h}--><!--{if $plugins[data].plugin_version != ''}--><br /><!--{$plugins[data].plugin_version|h}--><!--{/if}--></td>
-                <td><!--{$plugins[data].author|default:'-'|h}--></td>
-                <td><!--{$plugins[data].plugin_site_url|default:'-'|h}--></td>
-                <td><!--{$plugins[data].plugin_description|default:'-'|h}--></td>
+            <tr <!--{if $plugins[data].enable == $smarty.const.PLUGIN_ENABLE_FALSE}--> style="background:#C9C9C9;" <!--{/if}-->>
+                <!--ロゴ-->
+                <td class="center plugin_img">
+                    <!--{if $plugins[data].plugin_site_url != '' }-->
+                        <a href="?" onclick="win03('<!--{$plugins[data].plugin_site_url|h}-->','plugin_site_url','620','760'); return false;"><img src="<!--{$smarty.const.HTTP_URL}-->plugin/<!--{$plugins[data].plugin_code}-->/logo.png"/></a>&nbsp;
+                    <!--{else}-->
+                        <img src="<!--{$smarty.const.HTTP_URL}-->plugin/<!--{$plugins[data].plugin_code}-->/logo.png"/>
+                    <!--{/if}-->
+
+                </td>
+                <!--機能説明-->
+                <td class="plugin_info">
+                    
+                        <!-- プラグイン名 -->
+                            <!-- ▼plugin_site_urlが設定されている場合はリンクとして表示 -->
+                            <span class="plugin_name">
+                            <!--{if $plugins[data].plugin_site_url != '' }-->
+                                <a href="?" onclick="win03('<!--{$plugins[data].plugin_site_url|h}-->','plugin_site_url','620','760'); return false;"><!--{$plugins[data].plugin_name|default:$plugins[data].plugin_code|h}--></a>&nbsp;
+                            <!--{else}-->
+                                <!--{$plugins[data].plugin_name|default:$plugins[data].plugin_code|h}-->&nbsp;
+                            <!--{/if}-->
+                            </span>
+                        <!-- プラグインバージョン -->
+                            <!--{if $plugins[data].plugin_version != ''}--><!--{$plugins[data].plugin_version|h}--><!--{/if}-->&nbsp;
+                        <!-- 作者 -->
+                            <!--{if $plugins[data].author != ''}-->
+                                <!-- ▼author_site_urlが設定されている場合はリンクとして表示 -->
+                                <!--{if $plugins[data].author_site_url != '' }-->
+                                    (by <a href="?" onclick="win03('<!--{$plugins[data].author_site_url|h}-->','author_site_url','620','760'); return false;"><!--{$plugins[data].author|default:'-'|h}--></a>)
+                                <!--{else}-->
+                                    (by <!--{$plugins[data].author|default:'-'|h}-->)
+                                <!--{/if}-->
+                            <!--{/if}-->
+                        <br />
+                    
+                    <p class="description"><!--{$plugins[data].plugin_description|default:'-'|h}--></p>
+                    <div>
+                        <span class="ec_cube_version">対応EC-CUBEバージョン ：<!--{$plugins[data].compliant_version|default:'-'|h}--></span><br/>
+                        <!--{if $plugins[data].config_flg == true && $plugins[data].status != $smarty.const.PLUGIN_STATUS_UPLOADED}-->
+                            <a href="?" onclick="win03('<!--{$smarty.const.HTTP_URL}-->plugin/<!--{$plugins[data].plugin_code}-->/config.php','plugin_setting','620','760'); return false;">プラグイン設定</a>&nbsp;|&nbsp;
+                        <!--{else}-->
+                            プラグイン設定&nbsp;|&nbsp;
+                        <!--{/if}-->
+                        <!-- アップデート -->
+                            <a class="update_link" href="#" name="<!--{$plugins[data].plugin_id}-->">アップデート</a>&nbsp;|&nbsp;
+                        <!-- 削除 -->
+                            <a  href="javascript:;" name="uninstall" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('uninstall','plugin_code','<!--{$plugins[data].plugin_code}-->'); return false;">削除</a>&nbsp;|&nbsp;
+                        <!-- 有効/無効 -->
+                            <!--{if $plugins[data].enable == $smarty.const.PLUGIN_ENABLE_TRUE}-->
+                            <input id="plugin_enable" type="checkbox" name="disable" value="<!--{$plugins[data].plugin_id}-->" id="login_memory" checked="checked">有効</input><br/>
+                            <!--{else}-->
+                            <input id="plugin_enable" type="checkbox" name="enable" value="<!--{$plugins[data].plugin_id}-->" id="login_memory" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); return false;">有効にする</input><br/>
+                            <!--{/if}-->
+                            
+                            <!-- アップデートリンク押下時に表示する. -->
+                            <div id="plugin_update_<!--{$plugins[data].plugin_id}-->" style="display: none">                                
+                                <input id="update_file_<!--{$plugins[data].plugin_id}-->" name="update_plugin_file" type="file" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" class="box30" size="30" <!--{if $arrErr[$key]}-->style="background-color:<!--{$smarty.const.ERR_COLOR|h}-->"<!--{/if}--> />
+                                <a class="btn-action" href="javascript:;" onclick="removeUpdateFile('update_file_<!--{$plugins[data].plugin_id}-->'); fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('update','plugin_code','<!--{$plugins[data].plugin_code}-->');return false;"><span class="btn-next">アップデート</span></a>
+                            </div>
+                    </div>
+                </td>
+                <!--優先順位-->
+                <!--{assign var=key value="rank"}-->
                 <td class="center">
-                    <!--{if $plugins[data].enable == $smarty.const.PLUGIN_ENABLE_TRUE}-->
-                    有効
-                    <!--{elseif $plugins[data].enable == $smarty.const.PLUGIN_ENABLE_FALSE}-->
-                    無効
-                    <!--{else}-->-<!--{/if}-->
-                </td>
-                <td class="center">
-                    <!--{if $plugins[data].status == $smarty.const.PLUGIN_STATUS_UPLOADED}-->
-                    <a class="btn-normal" href="javascript:;" name="install" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('install','plugin_code','<!--{$plugins[data].plugin_code}-->'); return false;">install</a>
-                    <!--{else}-->
-                        <!--{if $plugins[data].enable == $smarty.const.PLUGIN_ENABLE_TRUE}-->
-                            <a class="btn-normal" href="javascript:;" name="disable" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('disable','plugin_code','<!--{$plugins[data].plugin_code}-->'); return false;">disable</a><br />
-                        <!--{else}-->
-                            <a class="btn-normal" href="javascript:;" name="enable" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('enable','plugin_code','<!--{$plugins[data].plugin_code}-->'); return false;">enable</a><br />
-                        <!--{/if}-->
-                            <a class="btn-normal" href="javascript:;" name="uninstall" onclick="fnSetFormValue('plugin_id', '<!--{$plugins[data].plugin_id}-->'); fnModeSubmit('uninstall','plugin_code','<!--{$plugins[data].plugin_code}-->'); return false;">uninstall</a>
-                    <!--{/if}-->
-                </td>
-                <td class="center">
-                    <!--{if $plugins[data].plugin_setting_path != ''}-->
-                        <a href="?" onclick="win03('<!--{$plugins[data].plugin_setting_path}-->','plugin_setting','620','760'); return false;">設定</a>
-                    <!--{else}-->
-                        -
-                    <!--{/if}-->
-                </td>
-                <td align="center">
-                <!--{if $smarty.section.data.iteration != 1}-->
-                <a href="?" onclick="fnModeSubmit('up','plugin_id', '<!--{$plugins[data].plugin_id}-->'); return false;">上へ</a>
-                <!--{/if}-->
-                <!--{if $smarty.section.data.iteration != $smarty.section.data.last}-->
-                <a href="?" onclick="fnModeSubmit('down','plugin_id', '<!--{$plugins[data].plugin_id}-->'); return false;">下へ</a>
-                <!--{/if}-->
+                    <input type="text" name="priority[<!--{$plugins[data].plugin_id}-->]" value="<!--{$plugins[data].rank|h}-->" size="1" class="rank" /><br/>
                 </td>
             </tr>
+            <!--{if $plugins[data].conflict_message != ""}-->
+            <tr> 
+                <td class="attention_fookpoint" colspan="3">
+                    <span class="attention"><!--{$plugins[data].conflict_message}--></span>
+                </td>
+            </tr>
+            <!--{/if}-->
+            
             <!--{/section}-->
         </table>
Index: branches/version-2_12-dev/data/mtb_constants_init.php
===================================================================
--- branches/version-2_12-dev/data/mtb_constants_init.php	(revision 21454)
+++ branches/version-2_12-dev/data/mtb_constants_init.php	(revision 21455)
@@ -20,4 +20,6 @@
 /** テンプレートファイル一時保存先 */
 define('TEMPLATE_TEMP_REALDIR', HTML_REALDIR . "upload/temp_template/");
+/** プラグインファイル一時保存先 */
+define('PLUGIN_TEMP_REALDIR', HTML_REALDIR . "upload/temp_plugin/");
 /** ユーザー作成画面のデフォルトPHPファイル */
 define('USER_DEF_PHP_REALFILE', USER_REALDIR . "__default.php");
@@ -26,4 +28,6 @@
 /** ダウンロードモジュール保存ディレクトリ */
 define('MODULE_REALDIR', DATA_REALDIR . MODULE_DIR);
+/** アップロード一時ディレクトリ */
+define('DOWNLOADS_TEMP_DIR', DATA_REALDIR . "downloads/tmp/");
 /** DBセッションの有効期限(秒) */
 define('MAX_LIFETIME', 7200);
@@ -429,4 +433,6 @@
 /** プラグイン・ディレクトリパーミッション */
 define('PLUGIN_DIR_PERMISSION', 0777);
+/** プラグイン 外部ファイルURL */
+define('PLUGIN_HTML_URL', USER_URL . PLUGIN_DIR);
 /** 日数桁数 */
 define('DOWNLOAD_DAYS_LEN', 3);
