typecho 换主题很简单,但是确有一个比较麻烦的事情,就是主题配置在切换主题的同时也就被删除了。于是,今天我下决心要弄一个备份恢复的功能出来。网上查了很久,都没有找到适合的(不过还是有参考价值的)。最后,只能自己构思,一步一步的落实了。
备份功能:对当前主题进行备份
备份方式:用的是文件备份
实现步骤:
- 确定文件备份的路径
- 对备份的主题和已保存的主题做个对比,数据相同则不出现备份和恢复信息,否则提醒备份
- 备份和恢复后,刷新界面(用了个不太理想的效果)
接下来是代码实现部分:
一、确定文件备份的路径
我因为之前用订阅 rss ,在当前主题目录下建立了 tmp 目录,因此就选他了。不过,一定记得要赋予可写权限,linux 系统赋权命令如下:
chmod 777 -R tmp/
二、在主题 funcitons.php 文件的 themeConfig($form){}
方法中添加编写代码
通常将备份恢复的模块放在网页的最前面,将下面的代码,复制到themeConfig($form){}
最前面就可以。
// 主题配置备份和恢复--开始//
echo '<div style="border:1px dashed green;padding:1rem;">';
echo '<div style="color:red;font-weight:700;margin-bottom:.5rem">备份前请确保主题目录下建立了tmp目录,并且被赋予可写权限</div>';
$theTheme = Helper::options()->theme;
$db = Typecho_Db::get();
// 设置备份及恢复目录
$backPath = __DIR__ . '/tmp/' . $theTheme . '.txt';
// 获取保存的主题配置信息
$themeConfStr = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $theTheme))['value'];
// 判断是否要备份配置
if (file_exists($backPath)) {
$backstr = file_get_contents($backPath); //将整个文件内容读入到一个字符串中
} else {
$backstr = '';
}
if (strcmp($backstr, $themeConfStr) === 0) {
echo '当前主题保存的配置信息与备份的配置信息一致,无需备份和恢复';
} else {
echo '<div style="font-weight:700;margin-bottom:.5rem;">当前主题保存的配置信息与备份的配置信息<span style="color:red;">不一致,请确认是否需要备份或恢复</span> </div><form action="" method="post"><input id="backupbtn" type="submit" name="backup" value="备份主题配置"><input id="restorebtn" type="submit" name="restore" value="恢复主题配置"></form><br>';
}
if ($_POST["backup"]) {
$backThemeCon = file_put_contents($backPath, $themeConfStr);
if ($backThemeCon) {
echo '<script>alert("备份成功")</script>';
echo "<script>window.location.replace(window.location.href)</script>";
} else {
echo '备份失败,请检查 tmp 目录是否有可写权限';
}
}
if ($_POST["restore"]) {
if (file_exists($backPath)) {
$str = file_get_contents($backPath); //将整个文件内容读入到一个字符串中
$updateThemeConQuery = $db->update('table.options')->rows(array('value' => $str))->where('name = ?', 'theme:' . $theTheme);
$updateThemCon = $db->query($updateThemeConQuery);
if ($updateThemCon) {
echo '<script>alert("恢复成功")</script>';
echo "<script>window.location.replace(window.location.href)</script>";
} else {
echo '恢复失败,请检查主题配置备份数据是否合格';
}
}
}
echo '</div>';
// 主题配置恢复备份--结束//
三、下面是两个状态的显示。
备份的主题信息与保存的主题信息一致:
备份的主题信息与保存的主题信息不一致:
上面的代码没用其他的链接样式,因此拿来即用。