# typecho模板设置数据备份与恢复
### 前言
**Typecho**模板设置数据会在你换模板的时候被清空,这样的设置其实我还是蛮喜欢的,不会有数据残留。
然而**WP**用户转到**typecho**后,说模板换成别的然后再切换回来,之前设置好的数据都没了很不习惯
于是我写了这个
### 代码
在`themeConfig($form)`函数里添加
```php
$str1 = explode('/themes/', Helper::options()->themeUrl);
$str2 = explode('/', $str1[1]);
$name=$str2[0];//获取到模板文件夹名字也就是模板在数据库中的名字
$db = Typecho_Db::get();
$sjdq=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name));
$ysj = $sjdq['value'];
if(isset($_POST['type']))
{
if($_POST["type"]=="备份模板设置数据"){
if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){
$update = $db->update('table.options')->rows(array('value'=>$ysj))->where('name = ?', 'theme:'.$name.'bf');
$updateRows= $db->query($update);
echo '
备份已更新,请等待自动刷新!如果等不到请点击';
?>
这里
insert('table.options')
->rows(array('name' => 'theme:'.$name.'bf','user' => '0','value' => $ysj));
$insertId = $db->query($insert);
echo '备份完成,请等待自动刷新!如果等不到请点击';
?>
这里
fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){
$sjdub=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'));
$bsj = $sjdub['value'];
$update = $db->update('table.options')->rows(array('value'=>$bsj))->where('name = ?', 'theme:'.$name);
$updateRows= $db->query($update);
echo '检测到模板备份数据,恢复完成,请等待自动刷新!如果等不到请点击';
?>
这里
没有模板备份数据,恢复不了哦!';
}
}
if($_POST["type"]=="删除备份数据"){
if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:'.$name.'bf'))){
$delete = $db->delete('table.options')->where ('name = ?', 'theme:'.$name.'bf');
$deletedRows = $db->query($delete);
echo '删除成功,请等待自动刷新,如果等不到请点击';
?>
这里
不用删了!备份不存在!!!';
}
}
}
echo '';
```
【模板目录文件夹名字不要用中文】
**备份**
当用户点击**备份**时,先判断是否已经存在备份,如果不存在就插入一条新的数据,数据name为yodubf,value为模板原本的数据。此时就存在了一条备份数据。
如果再次点击**备份**按钮会发生什么呢?会触发更新数据的语句,就是读取模板的设置数据,然后将备份的模板数据更新。
**还原**
当用户点击**还原**按钮时,会判断是否存在备份,如果不存在就发出提示说不存在数据无法恢复;如果存在,就会进行一个反向的更新操作,将备份的数据更新到模板默认设置数据。
这个操作完成后会触发个小问题,比较影响体验的。就是在点击**还原**按钮时网页是先刷新后执行php还原语句的,也就是说还原完成后,你看到的模板设置页面数据并没有还原,但是实际数据库里面已经还原好了的,这一点很影响体验。
于是乎,我鸡贼的弄了个js自动刷新语句,并发出提示文字,这样一下子就友好多了,注意文章中代码方面我并未给出css样式,所以美观度上需要自行优化。
**删除**
删除就简单了,判断是否存在备份,不存在就告诉用户不用删了,你压根就没有备份数据,如果有备份就执行删除语句,发出提示。