You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.3 KiB
125 lines
3.3 KiB
<?php |
|
if (!defined('__TYPECHO_ROOT_DIR__')) exit; |
|
/** |
|
* 升级动作 |
|
* |
|
* @category typecho |
|
* @package Widget |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
* @version $Id$ |
|
*/ |
|
|
|
/** |
|
* 升级组件 |
|
* |
|
* @author qining |
|
* @category typecho |
|
* @package Widget |
|
*/ |
|
class Widget_Upgrade extends Widget_Abstract_Options implements Widget_Interface_Do |
|
{ |
|
/** |
|
* 当前内部版本号 |
|
* |
|
* @access private |
|
* @var string |
|
*/ |
|
private $_currentVersion; |
|
|
|
/** |
|
* 对升级包按版本进行排序 |
|
* |
|
* @access public |
|
* @param string $a a版本 |
|
* @param string $b b版本 |
|
* @return integer |
|
*/ |
|
public function sortPackage($a, $b) |
|
{ |
|
list ($ver, $rev) = explode('r', $a); |
|
$a = str_replace('_', '.', $rev); |
|
|
|
list ($ver, $rev) = explode('r', $b); |
|
$b = str_replace('_', '.', $rev); |
|
|
|
return version_compare($a, $b, '>') ? 1 : -1; |
|
} |
|
|
|
/** |
|
* 过滤低版本的升级包 |
|
* |
|
* @access public |
|
* @param string $version 版本号 |
|
* @return boolean |
|
*/ |
|
public function filterPackage($version) |
|
{ |
|
list ($ver, $rev) = explode('r', $version); |
|
$rev = str_replace('_', '.', $rev); |
|
return version_compare($rev, $this->_currentVersion, '>'); |
|
} |
|
|
|
/** |
|
* 执行升级程序 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function upgrade() |
|
{ |
|
list($prefix, $this->_currentVersion) = explode('/', $this->options->generator); |
|
$packages = get_class_methods('Upgrade'); |
|
$packages = array_filter($packages, array($this, 'filterPackage')); |
|
usort($packages, array($this, 'sortPackage')); |
|
|
|
$message = array(); |
|
|
|
foreach ($packages as $package) { |
|
$options = $this->widget('Widget_Options@' . $package); |
|
|
|
/** 执行升级脚本 */ |
|
try { |
|
$result = call_user_func(array('Upgrade', $package), $this->db, $options); |
|
if (!empty($result)) { |
|
$message[] = $result; |
|
} |
|
} catch (Typecho_Exception $e) { |
|
$this->widget('Widget_Notice')->set($e->getMessage(), 'error'); |
|
$this->response->goBack(); |
|
return; |
|
} |
|
|
|
list ($ver, $rev) = explode('r', $package); |
|
$ver = substr(str_replace('_', '.', $ver), 1); |
|
$rev = str_replace('_', '.', $rev); |
|
|
|
/** 更新版本号 */ |
|
$this->update(array('value' => 'Typecho ' . $ver . '/' . $rev), |
|
$this->db->sql()->where('name = ?', 'generator')); |
|
|
|
$this->destory('Widget_Options@' . $package); |
|
} |
|
|
|
/** 更新版本号 */ |
|
$this->update(array('value' => 'Typecho ' . Typecho_Common::VERSION), |
|
$this->db->sql()->where('name = ?', 'generator')); |
|
|
|
$this->widget('Widget_Notice')->set(empty($message) ? _t("升级已经完成") : $message, |
|
empty($message) ? 'success' : 'notice'); |
|
} |
|
|
|
/** |
|
* 初始化函数 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function action() |
|
{ |
|
$this->user->pass('administrator'); |
|
$this->security->protect(); |
|
$this->on($this->request->isPost())->upgrade(); |
|
$this->response->redirect($this->options->adminUrl); |
|
} |
|
}
|
|
|