* fix for task #456 and #346

This commit is contained in:
wangyidong
2011-04-23 06:31:32 +00:00
parent 63b3ed32b4
commit 603273b499
6 changed files with 171 additions and 28 deletions
+50 -7
View File
@@ -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();
}
+3 -1
View File
@@ -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>&nbsp;&nbsp;<a href="#" onclick=parent.location.href="%s">取消</a></h3>';
$lang->extension->errorChangeFile = '有以下安装文件做过改动:<br />%s。<h3>是否继续,<a href="%s">确定删除</a>&nbsp;&nbsp;<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>不存在。';
+78 -2
View File
@@ -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;
}
}
+11 -4
View File
@@ -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>
+11 -4
View File
@@ -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>
+18 -10
View File
@@ -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>