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

Typecho教程 typecho 数据库 函数 备份 2018-05-27

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 '<form class="protected" action="?yodubf" method="post">
<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="删除备份数据" /></form>';

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

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

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

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

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

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

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

23条评论

    依晨博客

    博主,请问一下themeConfig($form)这个函数在什么位置

    游客 安卓派 18天前回复

      泽泽社长
      @依晨博客

      functions.php

      作者 Windows7 18天前回复

        依晨博客
        @泽泽社长

        是不是只要放在那个文件夹里面就行了

        游客 安卓派 18天前回复

          泽泽社长
          @依晨博客

          自己慢慢尝试,如果本身就不是很懂的话就是要多尝试,这样才能进步嘛

          作者 Windows7 18天前回复

    Muze

    已转载
    https://www.npc.ink/6726.html

    游客 Windows10 157天前回复

    mrtcsy

    个人觉得、广告放在文章底部或者网站底部就挺好的,放在文章中间,真的会让人反感的

    游客 Windows7 304天前回复

      Jrotty
      @mrtcsy

      文章中间?可能是谷歌自动广告的锅,懒得弄了(博客懒得打理了)

      作者 Linux 303天前回复

    okfree

    还是没搞懂啊和模版设置的submit冲突了

    游客 Windows7 372天前回复

    okfree

    知道在哪了 呵呵

    游客 Windows7 372天前回复

    okfree

    themeConfig($form)函数在哪个位置 新手不太懂~~

    游客 Windows7 372天前回复

    权那他

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

    游客 Windows7 501天前回复

      凌独๓
      @权那他

      嘿嘿

      游客 Windows10 355天前回复

      Jrotty
      @权那他

      这个功能确实挺有用的,昨天救了我一次,哈哈哈

      作者 Windows10 483天前回复

    沉默是金

    你blog的表情怎么没有了

    游客 MacOS 505天前回复

      Jrotty
      @沉默是金

      之前图床有点不稳,就给关了

      作者 Windows10 483天前回复

    True

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

    游客 Windows10 510天前回复

    Sakura

    膜拜大佬

    游客 Linux 511天前回复

      Jrotty
      @Sakura

      都是被用户逼的233

      作者 Windows10 510天前回复

智能推荐