QQ爹の博客 QQ爹の博客

typecho模板设置数据备份与恢复

in Typecho 文章转载请注明来源!

typecho模板设置数据会在你换模板的时候被清空,这样的设置其实我还是蛮喜欢的,不会有数据残留。
然而WP用户转到typecho后跟我抱怨,说模板换成别的然后再切换回来,之前设置好的数据都没了,希望我再yodu模板上动动手脚解决这个问题。

然而我是有些迟疑的,东西不是你说做我就要做的,我必须试一下...否则答应太快又搞不出来,岂不是很难受!

不过既然发了这篇文章,就说明已经搞定了

typecho模板备份设置.png

代码
themeConfig($form)函数里添加

$db = Typecho_Db::get();
$sjdq=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodu'));
$ysj = $sjdq['value'];
if(isset($_POST['type']))
{ 
if($_POST["type"]=="备份模板数据"){
if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){
$update = $db->update('table.options')->rows(array('value'=>$ysj))->where('name = ?', 'theme:Yodubf');
$updateRows= $db->query($update);
echo '<div class="tongzhi">备份已更新,请等待自动刷新!如果等不到请点击';
?>    
<a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div>
<script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script>
<?php
}else{
if($ysj){
     $insert = $db->insert('table.options')
    ->rows(array('name' => 'theme:Yodubf','user' => '0','value' => $ysj));
     $insertId = $db->query($insert);
echo '<div class="tongzhi">备份完成,请等待自动刷新!如果等不到请点击';
?>    
<a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div>
<script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script>
<?php
}
}
        }
if($_POST["type"]=="还原模板数据"){
if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){
$sjdub=$db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'));
$bsj = $sjdub['value'];
$update = $db->update('table.options')->rows(array('value'=>$bsj))->where('name = ?', 'theme:Yodu');
$updateRows= $db->query($update);
echo '<div class="tongzhi">检测到模板备份数据,恢复完成,请等待自动刷新!如果等不到请点击';
?>    
<a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div>
<script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2000);</script>
<?php
}else{
echo '<div class="tongzhi">没有模板备份数据,恢复不了哦!</div>';
}
}
if($_POST["type"]=="删除备份数据"){
if($db->fetchRow($db->select()->from ('table.options')->where ('name = ?', 'theme:Yodubf'))){
$delete = $db->delete('table.options')->where ('name = ?', 'theme:Yodubf');
$deletedRows = $db->query($delete);
echo '<div class="tongzhi">删除成功,请等待自动刷新,如果等不到请点击';
?>    
<a href="<?php Helper::options()->adminUrl('options-theme.php'); ?>">这里</a></div>
<script language="JavaScript">window.setTimeout("location=\'<?php Helper::options()->adminUrl('options-theme.php'); ?>\'", 2500);</script>
<?php
}else{
echo '<div class="tongzhi">不用删了!备份不存在!!!</div>';
}
}
    }
echo '<span style="font-weight: bold;font-size: 16px;">高级操作:</span>
<input type="submit" name="type" class="btn btn-s" value="备份模板数据" />&nbsp;&nbsp;<input type="submit" name="type" class="btn btn-s" value="还原模板数据" />&nbsp;&nbsp;<input type="submit" name="type" class="btn btn-s" value="删除备份数据" />';

然后将里面出现的所有“yodu”改成你的模板名字,如果拿不准就去数据库里看看模板名字。

备份
当用户点击备份时,先判断是否已经存在备份,如果不存在就插入一条新的数据,数据name为yodubf,value为模板原本的数据。此时就存在了一条备份数据。
如果再次点击备份按钮会发生什么呢?会触发更新数据的语句,就是读取模板的设置数据,然后将备份的模板数据更新。

还原
当用户点击还原按钮时,会判断是否存在备份,如果不存在就发出提示说不存在数据无法恢复;如果存在,就会进行一个反向的更新操作,将备份的数据更新到模板默认设置数据。

这个操作完成后会触发个小问题,比较影响体验的。就是在点击还原按钮时网页是先刷新后执行php还原语句的,也就是说还原完成后,你看到的模板设置页面数据并没有还原,但是实际数据库里面已经还原好了的,这一点很影响体验。

于是乎,我鸡贼的弄了个js自动刷新语句,并发出提示文字,这样一下子就友好多了,注意文章中代码方面我并未给出css样式,所以美观度上需要自行优化。

删除
删除就简单了,判断是否存在备份,不存在就告诉用户不用删了,你压根就没有备份数据,如果有备份就执行删除语句,发出提示。

一些没用的说明
1,其实这东西应该可以写成懒人版的,模板名字什么的用php获取下,就不用我这样写死了,但是当时我处于试一试的心态写的,所以就能简单就简单了,现在又懒得弄了,要不是为了水文,这个我都懒得贴出来。
2,别看文章中代码这么乱,条例就不清晰,其实我当时找了张纸写的逻辑然后才按照顺序一步一步的写的,也测试了很多回。
3,最开始想写自动还原模板数据来着,就是检测到模板启用就自动还原曾经的备份数据,然而当时想不通如果去判断模板启用。
4,当你想将本文章代码投入使用时,最好再测试博客进行测试,以免伤害你的数据库,同时建议测试时打开数据库管理页面,观看数据库对应表的变化

jrotty WeChat Pay

微信打赏

jrotty Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

typecho数据库函数备份
发表新评论
已有 9 条评论
  1. 权那他
    权那他 72345浏览器
    回复

    我上个星期也在想方法,不过看到你的了。就借鉴一下。

  2. 沉默是金
    沉默是金Chrome 66
    回复

    你blog的表情怎么没有了

  3. True
    True 10Chrome 66
    回复

    酷。。。。表情呢。。。。

  4. Sakura
    SakuraEdge 13
    回复

    膜拜大佬

    1. Jrotty
      Jrotty本文作者 10Chrome 66
      回复

      @Sakura 都是被用户逼的233

  5. 变态鹅
    变态鹅 10Chrome 66
    回复

    哇,周末起床这么早

    1. Jrotty
      Jrotty本文作者 10Chrome 66
      回复

      @变态鹅 你以为我起来了吗,并没有哦

      1. 变态鹅
        变态鹅 10Chrome 66
        回复

        @Jrotty 这是一篇定时文章

        1. Jrotty
          Jrotty本文作者 10Chrome 66
          回复

          @变态鹅 不是哈,躺床上玩电脑而已,我有个小床桌

前篇 后篇
雷姆
拉姆