phpcms后台的设定时间数据时间控件,默认只输出当前时间。增加但做数据迁移或者内容定时发布时,设定时间数据你往往需要手动把发布时间改成过去某个节点,增加或者未来某个时刻。设定时间数据直接改数据库?增加太粗暴,而且容易连带出缓存问题。设定时间数据我试过好几次,增加改完库里数据,设定时间数据前台页面纹丝不动,增加最后发现是设定时间数据模型字段的格式化输出卡住了。
真正靠谱的增加做法,是设定时间数据在模型字段的“更新时间”或者“发布时间”上做文章。phpcms的增加字段类型里有个“日期时间”选项,它绑定的设定时间数据是`datetime`格式。你如果只靠后台表单的默认值,那永远是`date('Y-m-d H:i:s')`。但有个细节——这个默认值是在`form::date()`函数里写死的。你要是能拿到这个函数的调用点,在传参前把时间戳改掉,就全通了。
具体路径在`phpcms/modules/content/fields/datetime/form.inc.php`。打开看,里面无非是`$value = $value ? $value : date('Y-m-d H:i:s');`。问题就出在这个三元判断上——只要`$value`不为空,它就不走当前时间。所以你在新增内容时,如果能在提交数据前把`$_POST['addtime']`这类字段塞进一个自定义时间,后续的入库操作根本不会拦你。
我用过一个笨办法,但挺管用。在内容模块的`add`方法里,找到`$this->content_db->insert($data)`之前,加一段判断:如果某个隐藏域传了`custom_time`,就直接覆盖掉`$data['inputtime']`和`$data['updatetime']`。注意,`updatetime`在phpcms里经常被当作最后修改时间,你要是把它也改了,后台列表的排序就会跟着变。所以只动`inputtime`更安全。
还有个坑——phpcms的列表页排序默认按`inputtime`倒序。你批量改历史数据时,如果时间设得太靠前,那些文章会直接沉底,前台栏目页翻几十页都看不到。这时候别慌,去后台“内容->栏目管理”里把该栏目的排序字段改成`id`或者`listorder`,问题马上解决。我上次迁移一批2008年的老文章,就是靠这个组合拳搞定的。
顺便提一句,如果你需要的是“定时发布”,别在表单层死磕。给`add`方法挂个`before_add`行为,把发布时间设为未来的时间戳,然后让cron脚本定期扫`inputtime`大于当前时间且`status=1`的内容,把它们改成`status=99`(正常发布状态)。这样既不用改核心文件,也能实现效果。phpcms的模型层其实留了很多钩子,只是文档里没写透,得自己翻代码找。
最后给你个实在建议:动手前先备份数据库。别嫌麻烦,我见过有人直接在线上环境改字段默认值,结果把整张表的`inputtime`全刷成同一秒,前台列表直接乱套。时间数据这东西,差一秒排序就错位,谨慎点总没错。