@@ -74,7 +74,7 @@ class extension extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function install($extension, $downLink = '', $md5 = '', $forceInstall = 'no')
|
||||
public function install($extension, $downLink = '', $md5 = '', $forceInstall = 'no', $isCheck = true)
|
||||
{
|
||||
$this->view->error = '';
|
||||
$this->view->header->title = $this->lang->extension->install . $this->lang->colon . $extension;
|
||||
@@ -134,12 +134,20 @@ class extension extends control
|
||||
|
||||
/* Extract the package. */
|
||||
$return = $this->extension->extractPackage($extension);
|
||||
if($return->result != 'ok')
|
||||
if($return->result != 'ok')
|
||||
{
|
||||
$this->view->error = sprintf($this->lang->extension->errorExtracted, $packageFile, $return->error);
|
||||
die($this->display());
|
||||
}
|
||||
|
||||
$return = $this->extension->checkFile($extension, 'repeat', $isCheck);
|
||||
if($return->result != 'ok')
|
||||
{
|
||||
$continueLink = inlink('install', "extension=$extension&downLink=&md5=&forecInstall=&isCheck=" . false);
|
||||
$resetLink = inlink('obtain');
|
||||
$this->view->error = sprintf($this->lang->extension->errorRepeatFile, $return->error, $continueLink, $resetLink);
|
||||
die($this->display());
|
||||
}
|
||||
/* Save to database. */
|
||||
$this->extension->saveExtension($extension);
|
||||
|
||||
@@ -179,11 +187,24 @@ class extension extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function uninstall($extension)
|
||||
public function uninstall($extension,$isCheck = true)
|
||||
{
|
||||
$return->return = 'ok';
|
||||
$checkReturn = $this->extension->checkFile($extension, 'change', $isCheck);
|
||||
if($checkReturn->result != 'ok')
|
||||
{
|
||||
$continueLink = inlink('uninstall', "extension=$extension&isCheck=" . false);
|
||||
$resetLink = inlink('browse');
|
||||
$return->removeCommands = sprintf($this->lang->extension->errorChangeFile, $checkReturn->error, $continueLink, $resetLink);
|
||||
$return->return = 'fail';
|
||||
$this->view->return = $return;
|
||||
die($this->display());
|
||||
}
|
||||
|
||||
$this->extension->executeDB($extension, 'uninstall');
|
||||
$this->extension->updateExtension($extension, array('status' => 'available'));
|
||||
$this->view->removeCommands = $this->extension->removePackage($extension);
|
||||
$return->removeCommands = $this->extension->removePackage($extension);
|
||||
$this->view->return = $return;
|
||||
$this->view->header->title = $this->lang->extension->uninstallFinished;
|
||||
$this->display();
|
||||
}
|
||||
@@ -195,8 +216,18 @@ class extension extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function activate($extension)
|
||||
public function activate($extension, $isCheck = true)
|
||||
{
|
||||
$return = $this->extension->checkFile($extension, 'repeat', $isCheck);
|
||||
if($return->result != 'ok')
|
||||
{
|
||||
$continueLink = inlink('activate', "extension=$extension&isCheck=" . false);
|
||||
$resetLink = inlink('browse', 'type=deactivated');
|
||||
$return->error = sprintf($this->lang->extension->errorRepeatFile, $return->error, $continueLink, $resetLink);
|
||||
$this->view->return = $return;
|
||||
die($this->display());
|
||||
}
|
||||
|
||||
$this->extension->copyPackageFiles($extension);
|
||||
$this->extension->updateExtension($extension, array('status' => 'installed'));
|
||||
$this->view->header->title = $this->lang->extension->activateFinished;
|
||||
@@ -210,10 +241,22 @@ class extension extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function deactivate($extension)
|
||||
public function deactivate($extension, $isCheck = true)
|
||||
{
|
||||
$return->return = 'ok';
|
||||
$checkReturn = $this->extension->checkFile($extension, 'change', $isCheck);
|
||||
if($checkReturn->result != 'ok')
|
||||
{
|
||||
$continueLink = inlink('deactivate', "extension=$extension&isCheck=" . false);
|
||||
$resetLink = inlink('browse');
|
||||
$return->removeCommands = sprintf($this->lang->extension->errorChangeFile, $checkReturn->error, $continueLink, $resetLink);
|
||||
$return->return = 'fail';
|
||||
$this->view->return = $return;
|
||||
die($this->display());
|
||||
}
|
||||
$this->extension->updateExtension($extension, array('status' => 'deactivated'));
|
||||
$this->view->removeCommands = $this->extension->removePackage($extension);
|
||||
$return->removeCommands = $this->extension->removePackage($extension);
|
||||
$this->view->return = $return;
|
||||
$this->view->header->title = $this->lang->extension->deactivateFinished;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -65,7 +65,9 @@ $lang->extension->errorDownloadPathNotWritable = '插件下载存储路径<stron
|
||||
$lang->extension->errorPackageFileExists = '下载路径已经有一个名为的<strong>%s</strong>附件。<h3>重新安装,<a href="%s">请点击此链接</a></h3>';
|
||||
$lang->extension->errorDownloadFailed = '下载失败,请重新下载。如果多次重试还不行,请尝试手工下载,然后通过上传功能上传。';
|
||||
$lang->extension->errorMd5Checking = '下载文件不完整,请重新下载。如果多次重试还不行,请尝试手工下载,然后通过上传功能上传。';
|
||||
$lang->extension->errorExtracted = '包文件<strong> %s </strong>解压缩失败,可能不是一个有效的zip文件。错误信息如下:<br />';
|
||||
$lang->extension->errorExtracted = '包文件<strong> %s </strong>解压缩失败,可能不是一个有效的zip文件。错误信息如下:<br />%s';
|
||||
$lang->extension->errorRepeatFile = '有以下安装文件重复:<br />%s。<h3>是否继续安装,<a href="%s">覆盖安装</a> <a href="#" onclick=parent.location.href="%s">取消</a></h3>';
|
||||
$lang->extension->errorChangeFile = '有以下安装文件做过改动:<br />%s。<h3>是否继续,<a href="%s">确定删除</a> <a href="#" onclick=parent.location.href="%s">取消</a></h3>';
|
||||
$lang->extension->errorPackageNotFound = '包文件 <strong>%s </strong>没有找到,可能是因为自动下载失败。您可以尝试再次下载。';
|
||||
$lang->extension->errorTargetPathNotWritable = '目标路径 <strong>%s </strong>不可写。';
|
||||
$lang->extension->errorTargetPathNotExists = '目标路径 <strong>%s </strong>不存在。';
|
||||
|
||||
@@ -352,7 +352,6 @@ class extensionModel extends model
|
||||
if($path == 'db' or $path == 'doc' or $path == '..' or $path == '.') continue;
|
||||
$copiedFiles = $this->copyDir($extensionDir . $path, $appRoot . $path);
|
||||
}
|
||||
|
||||
return $copiedFiles;
|
||||
}
|
||||
|
||||
@@ -513,7 +512,7 @@ class extensionModel extends model
|
||||
$data = (object)$data;
|
||||
$appRoot = $this->app->getAppRoot();
|
||||
|
||||
if(isset($data->dirs) and $data->dirs)
|
||||
if(isset($data->dirs))
|
||||
{
|
||||
foreach($data->dirs as $key => $dir)
|
||||
{
|
||||
@@ -612,4 +611,81 @@ class extensionModel extends model
|
||||
if(!@rmdir($dir)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the file for repeat or changed
|
||||
*
|
||||
* @param string $moveFile
|
||||
* @param string $extensionFile
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function checkFile($extension,$type = 'repeat', $isCheck = true)
|
||||
{
|
||||
$return->result = 'ok';
|
||||
$return->error = '';
|
||||
if(!$isCheck) return $return;
|
||||
|
||||
$extensionFiles = $this->getAllExtensionFile($extension);
|
||||
$appRoot = $this->app->getAppRoot();
|
||||
foreach($extensionFiles as $extensionFile)
|
||||
{
|
||||
$compareFile = $appRoot . str_replace(realpath("ext/$extension") . '/', '', $extensionFile);
|
||||
if(!file_exists($compareFile)) continue;
|
||||
if($type =='repeat' and md5_file($extensionFile) == md5_file($compareFile)) $return->error .= $compareFile . '<br />';
|
||||
elseif($type =='change' and md5_file($extensionFile) != md5_file($compareFile)) $return->error .= $compareFile . '<br />';
|
||||
}
|
||||
if($return->error != '') $return->result = 'fail';
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all extension files
|
||||
*
|
||||
* @param string $extension
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllExtensionFile($extension)
|
||||
{
|
||||
$extensionDir = "ext/$extension/";
|
||||
$files = $this->getFile($extensionDir, array('db', 'doc'));
|
||||
return $files;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Foreach the dir's files
|
||||
*
|
||||
* @param string $dir
|
||||
* @param array $exceptions
|
||||
* @access private
|
||||
* @return array
|
||||
*/
|
||||
private function getFile($dir, $exceptions = array())
|
||||
{
|
||||
static $files = array();
|
||||
|
||||
if(!is_dir($dir)) return $files;
|
||||
|
||||
$dir = realpath($dir) . '/';
|
||||
$entries = scandir($dir);
|
||||
|
||||
foreach($entries as $entry)
|
||||
{
|
||||
if($entry == '.' or $entry == '..') continue;
|
||||
if(in_array($entry, $exceptions)) continue;
|
||||
$fullEntry = $dir . $entry;
|
||||
if(is_file($fullEntry))
|
||||
{
|
||||
$files[] = $dir . $entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextDir = $dir . $entry;
|
||||
$this->getFile($nextDir);
|
||||
}
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,17 @@
|
||||
<caption><?php echo $header->title;?></caption>
|
||||
<tr>
|
||||
<td valign='middle'>
|
||||
<?php
|
||||
echo "<h3 class='a-center success'>{$header->title}</h3>";
|
||||
echo "<p class='a-center'>" . html::commonButton($lang->extension->viewInstalled, 'onclick=parent.location.href="' . inlink('browse', 'type=installed') . '"') . '</p>';
|
||||
?>
|
||||
<?php
|
||||
if(isset($return) and $return->return == 'fail')
|
||||
{
|
||||
echo $return->error;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<h3 class='a-center success'>{$header->title}</h3>";
|
||||
echo "<p class='a-center'>" . html::commonButton($lang->extension->viewInstalled, 'onclick=parent.location.href="' . inlink('browse', 'type=installed') . '"') . '</p>';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -15,15 +15,22 @@
|
||||
<caption><?php echo $header->title;?></caption>
|
||||
<tr>
|
||||
<td valign='middle'>
|
||||
<?php
|
||||
<?php
|
||||
if($return->return == 'fail')
|
||||
{
|
||||
echo $return->removeCommands;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<h3 class='a-center success'>{$header->title}</h3>";
|
||||
if($removeCommands)
|
||||
if($return->removeCommands)
|
||||
{
|
||||
echo "<p class='strong'>{$lang->extension->unremovedFiles}</p>";
|
||||
echo join($removeCommands, '<br />');
|
||||
echo join($retrun->removeCommands, '<br />');
|
||||
}
|
||||
echo "<p class='a-center'>" . html::commonButton($lang->extension->viewDeactivated, 'onclick=parent.location.href="' . inlink('browse', 'type=deactivated') . '"') . '</p>';
|
||||
?>
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -14,16 +14,24 @@
|
||||
<table class='table-1'>
|
||||
<caption><?php echo $header->title;?></caption>
|
||||
<tr>
|
||||
<td valign='middle'>
|
||||
<?php
|
||||
echo "<h3 class='a-center success'>{$header->title}</h3>";
|
||||
if($removeCommands)
|
||||
{
|
||||
echo "<p class='strong'>{$lang->extension->unremovedFiles}</p>";
|
||||
echo join($removeCommands, '<br />');
|
||||
}
|
||||
echo "<p class='a-center'>" . html::commonButton($lang->extension->viewAvailable, 'onclick=parent.location.href="' . inlink('browse', 'type=available') . '"') . '</p>';
|
||||
?>
|
||||
<td valign='middle'>
|
||||
<?php
|
||||
if($return->return == 'fail')
|
||||
{
|
||||
echo $return->removeCommands;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<h3 class='a-center success'>{$header->title}</h3>";
|
||||
if($return->removeCommands)
|
||||
{
|
||||
echo "<p class='strong'>{$lang->extension->unremovedFiles}</p>";
|
||||
echo join($retrun->removeCommands, '<br />');
|
||||
}
|
||||
echo "<p class='a-center'>" . html::commonButton($lang->extension->viewAvailable, 'onclick=parent.location.href="' . inlink('browse', 'type=available') . '"') . '</p>';
|
||||
}
|
||||
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user