必要なものなので、
プラグインアップロード先:
data/downloads/plugin
(たとえば、MaintenanceMode_20120531.tar.gzなら、
data/downloads/plugin/MaintenanceMode以下に解凍したファイルをアップロード)
修正:
1. 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 'installD':
// エラーチェック
$this->arrErr = $objFormParam->checkError();
if ($this->isError($this->arrErr) === false) {
// インストール処理.
$plugin_dir_name = $objFormParam->getValue('plugin_file2');
$this->arrErr = $this->installPluginD($plugin_dir_name, 'plugin_file2');
if ($this->isError($this->arrErr) === false) {
// コンパイルファイルのクリア処理
SC_Utils_Ex::clearCompliedTemplate();
$this->tpl_onload = "alert('プラグインをインストールしました。');";
}
}
// テンプレート(smarty)へ引き継ぐ
$this->plugin_file2 = $plugin_dir_name;
break;
// 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 === 'installD') {
$objFormParam->addParam('ディレクトリ名', 'plugin_file2', 255, '', array('EXIST_CHECK', 'FILE_NAME_CHECK_BY_NOUPLOAD', 'MAX_LENGTH_CHECK'));
}
// added
}
以下の関数を追加
// added
function installPluginD($directory_name, $key) {
$arrErr = array();
// 必須拡張モジュールのチェック
$arrErr = SC_Plugin_Util_Ex::checkExtension($key);
if ($this->isError($arrErr) === true) {
return $arrErr;
}
// pluginディレクトリの存在チェック
$arrParams = array($key => PLUGIN_UPLOAD_REALDIR . $directory_name);
$objErr = new SC_CheckError_Ex($arrParams);
$objErr->doFunc(array('プラグイン(ディレクトリ)', $key), array('DIR_CHECK'));
if ($this->isError($objErr->arrErr) === true) {
return $objErr->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->rollBack2($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->rollBack2($plugin['plugin_id'], $plugin_html_dir_path);
return $arrErr;
}
}
function rollBack2($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
2. data/Smarty/templates/admin/ownerstore/plugin.tpl
/**
* インストール
*/
function install() {
if (window.confirm('プラグインをインストールしても宜しいでしょうか?')){
fnModeSubmit('install','','');
}
}
// added
function installD() {
if (window.confirm('プラグインをインストールしても宜しいでしょうか?')){
fnModeSubmit('installD', '', '');
}
}
// added
<h2>プラグイン登録</h2>
<table class="form">
<tr>
<th>プラグイン<span class="attention"> *</span></th>
<td>
<!--{assign var=key value="plugin_file"}-->
<span class="attention"><!--{$arrErr[$key]}--></span>
<input type="file" name="<!--{ $key }-->" class="box45" size="43" style="<!--{$arrErr[$key]|sfGetErrorColor}--> <!--{if $arrErr[$key]}--> background-color:<!--{$smarty.const.ERR_COLOR|h}--><!--{/if}-->">
<a class="btn-action" href="java script:;" onclick="install(); return false;"><span class="btn-next">インストール</span></a>
</td>
</tr>
<!--{* added *}-->
<tr>
<th>プラグイン(ディレクトリ)</th>
<td>
<!--{assign var=key value="plugin_file2"}-->
<span class="attention"><!--{$arrErr[$key]}--></span>
data/downloads/plugin/<input type="text" name="<!--{ $key }-->" class="box25" value="<!--{$plugin_file2}-->" size="25" maxlength="255" style="<!--{$arrErr[$key]|sfGetErrorColor}--> <!--{if $arrErr[$key]}--> background-color:<!--{$smarty.const.ERR_COLOR|h}--><!--{/if}-->">
<a class="btn-action" href="java script:;" onclick="installD(); return false;"><span class="btn-next">インストールだけ</span></a>
</td>
</tr>
<!--{* added *}-->
</table>
ただし、関数 checkPluginConstants 内でエラーがあった場合、エラーの書き込み先が「plugin_file」固定になっているので、圧縮ファイルの選択部分に表示されます。
6/11 ソースを一部変更しました。
6/11 再度修正しました。(未指定の判定を入れていませんでした。)
もしかして、initParamに「'EXIST_CHECK'」を追加すれば良かったりして。
(チェックされないようです。)
6/12 initParamに「'EXIST_CHECK'」を追加し、チェックをかけようとしたところ、
$modeが、規則「半角英数」「9文字以内」もついでにひっかかてしまいました。
そこで、ソースを最新に入れ替えました。