标签 typecho 下的文章

几个月前,沉寂了多年的typecho终于又更新版本了,先是更新到了1.20,然后没多久又更新到了1.2.1。

当时发现更新后立马就把博客给更新了,结果使用过程中发现配置的复选框一直无法保存。最后查看了github的issue,才找到了问题原因。

在typecho/var/Widget/Themes/Config.php的第74行:

$form->getInput($key)->value($this->options->{$key}); 

这行代码中,从options中拿值,但是因为测试复选框新加入的,options中并没有对应的值,导致给了一个空的值给测试复选框 $this->getInput('testBlock')

当主题选项保存的时候,is_array 中的数据是从 $this->getInput('testBlock') 拿 value,但前面程序已经设置为空值,所以在收集提交选项数据时候,以下代码判断不通过,返回 null ,最终导致保存勾选无效.

解决方案

修改上面的代码为:

if (isset($this->options->{$key})) {
    $form->getInput($key)->value($this->options->{$key});
}

参考

主题启用后,添加复选框选项无效

fix: adding checkbox options after theme initialization cannot be saved.

typecho一直都是用的mysql作为数据库存储,最近因为服务器到期需要迁移网站,所有的服务都转到docker了,迁移起来略显麻烦,因此就想抛弃mysql了,直接使用sqlite作为存储。这样迁移网站只要复制一下db文件就可以了,不用每次都得搭个mysql或者容器,简单方便。

typecho本身就是支持sqlite的,只不过在安装的时候如果选择了mysql,就没有办法在界面上更改数据库类型了,要修改只能通过改代码配置来完成。数据库的配置放在网站根路径下的config.inc.php文件中,有这么一段:

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'tp_');
$db->addServer(array (
  'host' => 'db',
  'user' => 'xxxxx',
  'password' => 'xxxxxx',
  'charset' => 'utf8',
  'port' => '3306',
  'database' => 'typecho',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

要想改成sqlite的方式,只需修改配置为以下内容即可:

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_SQLite', 'tp_');
$db->addServer(array (
  'file' => '/xx/xx/xx/xx.db',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

修改之后即可生效,但这里还缺少了重要的一步:迁移数据。如何迁移数据可参考使用Navicate迁移Mysql到Sqlite

迁移完成后的几处安全建议:

  1. 不要将db文件放到网站目录内,可能导致db文件通过外部链接下载
  2. db文件命名尽量随机,不要轻易被人猜出
  3. 如果db文件放在网站目录内,要在nginx配置设置访问db文件直接返回404

迁移之后如何验证切换成功了:

  1. 确认网站可以正常访问
  2. 每查看一次网站,都会导致db文件更新,可通过后台查看文件更新时间是不是最新

进入到数据库,过滤出当前用户的信息:

select uid, name, password from typecho_users where name = 'xxxx';

imagef8d830a33dd445e8.png

修改第三列的密码为e10adc3949ba59abbe56e057f20f883e

update typecho_users set password = 'e10adc3949ba59abbe56e057f20f883e' where name = 'xxxx';

然后使用密码123456登陆,重新修改密码就可以了。