前回の仕様を変更したものです。
共存しても動作します。
お好きなほうでどうぞ。
(1) 前回
プラグインのディレクトリ名を時下入力
(2) 今回
data/downloads/plugin下のディレクトリ一覧で指示
data/class/pages/admin/ownersstore/LC_Page_Admin_OwnersStore.php
switch ($mode) {
// インストール
case 'install':
$file_key = 'plugin_file';
$this->arrErr = $this->checkUploadFile($file_key);
if ($this->isError($this->arrErr) === false) {
$archive_file_name = $_FILES[$file_key]['name'];
// インストール処理.
$this->arrErr = $this->installPlugin($archive_file_name, 'plugin_file');
if ($this->isError($this->arrErr) === false) {
// コンパイルファイルのクリア処理
SC_Utils_Ex::clearCompliedTemplate();
$this->tpl_onload = "alert('プラグインをインストールしました。');";
}
}
break;
// added
// インストール
case 'installL':
// インストール処理.
$plugin_dir_name = $objFormParam->getValue('dir_name');
$this->arrErr = $this->installPluginL($plugin_dir_name, $plugin_dir_name);
if ($this->isError($this->arrErr) === false) {
// コンパイルファイルのクリア処理
SC_Utils_Ex::clearCompliedTemplate();
$this->tpl_onload = "alert('プラグインをインストールしました。');";
}
if ($this->isError($this->arrErr) === true) {
$this->tpl_onload = "alert('" . $this->arrErr[$plugin_dir_name] . "');";
}
break;
// added
// DBからプラグイン情報を取得
$plugins = SC_Plugin_Util_Ex::getAllPlugin();
foreach ($plugins as $key => $plugin) {
// ロゴファイルへのパスを生成(ロゴが無い場合はNO_IMAGEを表示)
if (file_exists(PLUGIN_HTML_REALDIR . $plugins[$key]['plugin_code'] . '/logo.png') === true){
$plugins[$key]['logo'] = ROOT_URLPATH . 'plugin/' . $plugins[$key]['plugin_code'] . '/logo.png';
} else {
$plugins[$key]['logo'] = IMAGE_SAVE_URLPATH . 'noimage_plugin_list.png';
}
// 設定ファイルがあるかを判定.
$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']);
}
}
$this->plugins = $plugins;
// added
// インストールしていないプラグイン一覧
$arrList = SC_Helper_FileManager_Ex::sfGetFileList(rtrim(PLUGIN_UPLOAD_REALDIR, '/'));
// true : プラグインディレクトリ一覧
// false : インストールしていないプラグインディレクトリ一覧
$dirALL = true;
$arrDirLists = array();
$arrCount = 0;
for ($i=0; $i<count($arrList); $i++) {
// ディレクトリであるかを判定.
if ($arrList[$i]['is_dir'] === true) {
$dirName = $arrList[$i]['file_name'];
// インストール済みのプラグインかを判定.
$foundDirName = FALSE;
for ($j=0; $j<count($plugins); $j++) {
if ($plugins[$j]['plugin_code'] === $dirName) {
$foundDirName = TRUE;
break;
}
}
if ($foundDirName) {
$arrDirLists[$arrCount]['dir_name'] = $dirName;
$arrDirLists[$arrCount]['installed'] = false;
$arrCount++;
} else {
if ($dirALL === true) {
$arrDirLists[$arrCount]['dir_name'] = $dirName;
$arrDirLists[$arrCount]['installed'] = true;
$arrCount++;
}
}
}
}
$this->dirLists = $arrDirLists;
// added
}
function initParam(&$objFormParam, $mode) {
$objFormParam->addParam('mode', 'mode', INT_LEN, '', array('ALPHA_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('plugin_id', 'plugin_id', INT_LEN, '', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
if ($mode === 'priority') {
$objFormParam->addParam('優先度', 'priority', INT_LEN, '', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
}
// added
if ($mode === 'installL') {
$objFormParam->addParam('ディレクトリ名', 'dir_name');
}
// added
}
// リフレクションオブジェクトを生成.
$objReflection = new ReflectionClass('plugin_info');
$arrPluginInfo = $this->getPluginInfo($objReflection);
// プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
// changed
// $arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
// changed
$arrErr = $this->checkPluginConstants($objReflection, DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR, $key);
// changed
if ($this->isError($arrErr) === true) {
$this->rollBack(DOWNLOADS_TEMP_PLUGIN_INSTALL_DIR);
return $arrErr;
}
// added
function installPluginL($directory_name, $key) {
$arrErr = array();
// 必須拡張モジュールのチェック
$arrErr = SC_Plugin_Util_Ex::checkExtension($key);
if ($this->isError($arrErr) === true) {
return $arrErr;
}
// plugin_infoを読み込み.
$arrErr = $this->requirePluginFile(PLUGIN_UPLOAD_REALDIR . $directory_name . '/' . 'plugin_info.php', $key);
if ($this->isError($arrErr) === true) {
return $arrErr;
}
// リフレクションオブジェクトを生成.
$objReflection = new ReflectionClass('plugin_info');
$arrPluginInfo = $this->getPluginInfo($objReflection);
// プラグインクラスに必須となるパラメータが正常に定義されているかチェックします.
$arrErr = $this->checkPluginConstants($objReflection, PLUGIN_UPLOAD_REALDIR . $directory_name . '/', $key);
if ($this->isError($arrErr) === true) {
return $arrErr;
}
// 既にインストールされていないかを判定.
if ($this->isInstalledPlugin($arrPluginInfo['PLUGIN_CODE']) === true) {
$arrErr[$key] = '※ ' . $arrPluginInfo['PLUGIN_NAME'] . 'は既にインストールされています。<br/>';
return $arrErr;
}
// プラグイン情報をDB登録
if ($this->registerData($arrPluginInfo) === false) {
$arrErr[$key] = '※ DB登録に失敗しました。<br/>';
return $arrErr;
}
// プラグイン情報を取得
$plugin = SC_Plugin_Util_Ex::getPluginByPluginCode($arrPluginInfo['PLUGIN_CODE']);
// クラスファイルを読み込み.
$plugin_class_file_path = $this->getPluginFilePath($plugin['plugin_code'], $plugin['class_name']);
$arrErr = $this->requirePluginFile($plugin_class_file_path, $key);
if ($this->isError($arrErr) === true) {
$this->rollbackL($plugin['plugin_id']);
return $arrErr;
}
// プラグインhtmlディレクトリ作成
$plugin_html_dir_path = $this->getHtmlPluginDir($plugin['plugin_code']);
$this->makeDir($plugin_html_dir_path);
$arrErr = $this->execPlugin($plugin, $plugin['class_name'], 'install');
if ($this->isError($arrErr) === true) {
$this->rollbackL($plugin['plugin_id'], $plugin_html_dir_path);
return $arrErr;
}
}
function rollbackL($plugin_id = '', $plugin_html_dir_path ='') {
// DBからプラグイン情報を削除
if (empty($plugin_id) === false) {
SC_Plugin_Util_Ex::deletePluginByPluginId($plugin_id);
}
// htmlディレクトリを削除
if (empty($plugin_html_dir_path) === false) {
SC_Helper_FileManager_Ex::deleteFile($plugin_html_dir_path, true);
}
}
// added
function checkPluginConstantsは、引数を追加
function checkPluginConstants(ReflectionClass $objReflection, $dir_path, $key) {
※運営チーム編集※
XOOPSのシステムエラーが発生していたためこの下の投稿はいったんカットさせていただいております。