Typecho 的一些问题

由于很多不可抗力,要在我自己的服务器上使用 Typecho,就必须对其执行定制,在这个过程以及开发 Citizen 的环节里我发现了一些问题。

关于自定义字段

我发现 Typecho 会开辟一层新的数据表 typecho_fields 来存放所有文章的自定义字段,这个表中每个文章的每个字段都是一条记录。比如假设我的第一篇文章使用了三个自定义字段,那么该表就会有三条 cid 为 1 的记录。对于指定的某条记录,其包含一个 type 字段用来声明自己的类型,可以是 jsonintstr。但实际上对于主题来说,无法引入整型字段,因为 Widget\Contents\Post\Edit.php@line 672 说:

$fields[$key] = [is_array($val) ? 'json' : 'str', $val];
PHP

结合上下文很明显 int 字段只能通过在编辑页面手动添加字段来进行声明。在开发主题时若用到整型内容,受此影响没办法快速实现,只能让用户手动添加,同时意味着没办法自兼容 incrIntField 方法,因为它会强制类型转换并刷新(数据表结构导致),而一旦重新编辑保存文章,这种转换便会失效。

在 Typecho 内核中,themeFieldsthemeCustomFieldsHook 所给出的 $layout 都要被正则 "/^fields\[(.+)\]$/" 清洗,实际上即使 themeCustomFieldsHook 能够绕过清洗也不会起什么作用,因为上面代码的上下文已经把 fieldsfieldNames 作为两个独立的组合分别处理,而在这种有限的逻辑下排除整型字段也无可厚非。

所以我在定制的时候直接就把 typecho_fields 这个体量随文章数量增加而成倍增长的表砍了,在 contents 里面加了一个 MEDIUM_BLOB 型字段 fieldData,其形式想必不用说也能看出来。这样做的缺点是自定义字段不再支持区分三种类型,但事实上不难看出:自定义字段的使用模式并非受其预设的数据类型限制,因为内核提供的方法也就那么几个;貌似正确的打开方式是传递它们的函数本身,因为有关数据类型的处理都可以写在函数里面。

添加新评论

点击评论者的头像,即可对其进行回复。