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.
179 lines
5.7 KiB
179 lines
5.7 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 |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
*/ |
|
class Widget_Themes_Edit extends Widget_Abstract_Options implements Widget_Interface_Do |
|
{ |
|
/** |
|
* 更换外观 |
|
* |
|
* @access public |
|
* @param string $theme 外观名称 |
|
* @return void |
|
* @throws Typecho_Widget_Exception |
|
*/ |
|
public function changeTheme($theme) |
|
{ |
|
$theme = trim($theme, './'); |
|
if (is_dir($this->options->themeFile($theme))) { |
|
/** 删除原外观设置信息 */ |
|
$this->delete($this->db->sql()->where('name = ?', 'theme:' . $this->options->theme)); |
|
|
|
$this->update(array('value' => $theme), $this->db->sql()->where('name = ?', 'theme')); |
|
|
|
/** 解除首页关联 */ |
|
if (0 === strpos($this->options->frontPage, 'file:')) { |
|
$this->update(array('value' => 'recent'), $this->db->sql()->where('name = ?', 'frontPage')); |
|
} |
|
|
|
$configFile = $this->options->themeFile($theme, 'functions.php'); |
|
|
|
if (file_exists($configFile)) { |
|
require_once $configFile; |
|
|
|
if (function_exists('themeConfig')) { |
|
$form = new Typecho_Widget_Helper_Form(); |
|
themeConfig($form); |
|
$options = $form->getValues(); |
|
|
|
if ($options && !$this->configHandle($options, true)) { |
|
$this->insert(array( |
|
'name' => 'theme:' . $theme, |
|
'value' => serialize($options), |
|
'user' => 0 |
|
)); |
|
} |
|
} |
|
} |
|
|
|
$this->widget('Widget_Notice')->highlight('theme-' . $theme); |
|
$this->widget('Widget_Notice')->set(_t("外观已经改变"), 'success'); |
|
$this->response->goBack(); |
|
} else { |
|
throw new Typecho_Widget_Exception(_t('您选择的风格不存在')); |
|
} |
|
} |
|
|
|
/** |
|
* 编辑外观文件 |
|
* |
|
* @access public |
|
* @param string $theme 外观名称 |
|
* @param string $file 文件名 |
|
* @return void |
|
* @throws Typecho_Widget_Exception |
|
*/ |
|
public function editThemeFile($theme, $file) |
|
{ |
|
$path = $this->options->themeFile($theme, $file); |
|
|
|
if (file_exists($path) && is_writeable($path) && !Typecho_Common::isAppEngine() |
|
&& (!defined('__TYPECHO_THEME_WRITEABLE__') || __TYPECHO_THEME_WRITEABLE__)) { |
|
$handle = fopen($path, 'wb'); |
|
if ($handle && fwrite($handle, $this->request->content)) { |
|
fclose($handle); |
|
$this->widget('Widget_Notice')->set(_t("文件 %s 的更改已经保存", $file), 'success'); |
|
} else { |
|
$this->widget('Widget_Notice')->set(_t("文件 %s 无法被写入", $file), 'error'); |
|
} |
|
$this->response->goBack(); |
|
} else { |
|
throw new Typecho_Widget_Exception(_t('您编辑的文件不存在')); |
|
} |
|
} |
|
|
|
/** |
|
* 配置外观 |
|
* |
|
* @access public |
|
* @param string $theme 外观名 |
|
* @return void |
|
*/ |
|
public function config($theme) |
|
{ |
|
// 已经载入了外观函数 |
|
$form = $this->widget('Widget_Themes_Config')->config(); |
|
|
|
/** 验证表单 */ |
|
if ($form->validate()) { |
|
$this->response->goBack(); |
|
} |
|
|
|
$settings = $form->getAllRequest(); |
|
|
|
if (!$this->configHandle($settings, false)) { |
|
if ($this->options->__get('theme:' . $theme)) { |
|
$this->update(array('value' => serialize($settings)), |
|
$this->db->sql()->where('name = ?', 'theme:' . $theme)); |
|
} else { |
|
$this->insert(array( |
|
'name' => 'theme:' . $theme, |
|
'value' => serialize($settings), |
|
'user' => 0 |
|
)); |
|
} |
|
} |
|
|
|
/** 设置高亮 */ |
|
$this->widget('Widget_Notice')->highlight('theme-' . $theme); |
|
|
|
/** 提示信息 */ |
|
$this->widget('Widget_Notice')->set(_t("外观设置已经保存"), 'success'); |
|
|
|
/** 转向原页 */ |
|
$this->response->redirect(Typecho_Common::url('options-theme.php', $this->options->adminUrl)); |
|
} |
|
|
|
/** |
|
* 用自有函数处理配置信息 |
|
* |
|
* @access public |
|
* @param array $settings 配置值 |
|
* @param boolean $isInit 是否为初始化 |
|
* @return boolean |
|
*/ |
|
public function configHandle(array $settings, $isInit) |
|
{ |
|
if (function_exists('themeConfigHandle')) { |
|
themeConfigHandle($settings, $isInit); |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
/** |
|
* 绑定动作 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function action() |
|
{ |
|
/** 需要管理员权限 */ |
|
$this->user->pass('administrator'); |
|
$this->security->protect(); |
|
$this->on($this->request->is('change'))->changeTheme($this->request->filter('slug')->change); |
|
$this->on($this->request->is('edit&theme')) |
|
->editThemeFile($this->request->filter('slug')->theme, $this->request->edit); |
|
$this->on($this->request->is('config'))->config($this->options->theme); |
|
$this->response->redirect($this->options->adminUrl); |
|
} |
|
}
|
|
|