循环事件(适用于 v7.1 及以下版本)
本文介绍 DHTMLX Scheduler 中循环事件的旧格式。如需了解 DHTMLX Scheduler v7.1 及以上版本的循环事件,请参见此处。
默认情况下,scheduler 不支持循环事件。要添加此功能,需要在页面上启用一个名为 recurring_legacy 的特殊扩展。
scheduler.plugins({
recurring_legacy: true
});
启用循环事件支持后,lightbox 会包含一个额外的部分,如下所示:

配置选项
该库提供了多种选项用于配置循环事件:
- repeat_date - 控制"循环"lightbox 中"结束时间"字段的日期格式
- include_end_by - 设置"结束时间"字段的日期是否包含在内
- recurring_overflow_instances - 管理跨月循环事件的处理方式
- repeat_precise - 避免"每周"循环事件包含过去的日期
- occurrence_timestamp_in_utc - 支持跨时区处理循环事件
scheduler.config.repeat_date = "%m/%d/%Y";
scheduler.config.include_end_by = true;
...
scheduler.init('scheduler_here', new Date(2019, 7, 5), "month");
"循环" Lightbox
启用循环扩展后,lightbox 会新增一个名为"重复事件"的部分。默认的"循环"lightbox 配置如下:
[
{name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
{name:"recurring", height:115, type:"recurring", map_to:"rec_type",
button:"recurring"},
{name:"time", height:72, type:"time", map_to:"auto"}
];
如有需要,可以添加其他部分,但"recurring"和"time"部分必须保留,并且"time"部分应始终位于"recurring"部分之后。
服务端集成
循环事件在数据库中作为一条记录保存,包含所有常规事件字段以及三个额外字段:
- rec_type - (varchar) 定义循环模式;该字段由系统自动填写
- event_length - (long int) 事件持续时间(秒)
- event_pid - (int) 事件系列的父级 ID
典型的 connector 查询如下:
$scheduler->render_table("events_rec","event_id",
"start_date,end_date,text,rec_type,event_pid,event_length");
除了这些必需字段外,还可以从数据库中获取其他数据。
需要注意的是,start_date 和 end_date 的含义如下:
- start_date - 系列中第一个事件的开始日期,格式为 'yyyy-mm-dd hh:mm:ss'(参见 날짜 형식 지정)。
- end_date - 系列中最后一个事件的结束日期,格式为 'yyyy-mm-dd 00:00:00'(参见 날짜 형식 지정)。
例如,一个 2019 年 1 月 3 日 10:00 开始、每天重复、2019 年 1 月 13 日 12:00 结束的循环事件,将以如下方式存储:
id:1,
start_date:"2019-01-03 10:00:00",
end_date:"2019-01-13 00:00:00",
text:"some_text",
details:"",
rec_type:"day_1___",
event_length:"7200",
event_pid:"0" // 父事件为 0,子事件为父事件的 ID
在客户端,rec_type 字段的格式为:
[type]_[count]_[day]_[count2]_[days]#[extra]
其中:
- type - 循环类型:'day'、'week'、'month'、'year'
- count - 事件之间的间隔(以类型单位计)
- day 和 count2 - 指定某月的具体某一天(如每月第一个周一、第三个周五)
- days - 以逗号分隔的受影响星期几列表
- extra - 额外信息,用于调整循环详情显示方式
rec_type 示例:
- "day_3___" - 每三天一次
- "month_2___" - 每两个月一次
- "month_1_1_2_" - 每月第二个周一
- "week_2___1,5" - 每两周的周一和周五
注意:双下划线或三下划线表示该参数被省略。
后端解析循环系列
循环事件在数据库中以单条记录保存,Scheduler 可以在客户端拆分。如果需要在服务端获取每次发生的具体日期,可使用 ASP.NET/ASP.NET Core 或 PHP 的辅助库进行解析。
这些库可在 GitHub 获取:
编辑/删除系列中的某次事件
可以编辑或删除循环系列中的某次事件。
重要说明
- 每次对循环事件的更新都会在数据库中创建一条独立记录。
- 单次事件通过 event_pid 属性与父事件关联。
- 当某次事件被编辑时,event_length 字段存储的是该事件原定发生的时间戳(而非实际事件时长)。例如,原定于 2019 年 7 月 27 日 15:00 的某次事件被移到 7 月 30 日 15:00,event_length 记录的仍是 7 月 27 日 15:00 的时间戳(单位为自 UNIX 纪元以来的秒数)。
- 如果数据库中存在已编辑的事件,且通过 lightbox 选择"编辑系列",保存后所有已存储的编辑事件都会被删除,仅保留主循环事件记录,单次事件的独立更改将丢失。
示例场景
假设你是奥运会的粉丝,想尽可能多地观看伦敦 2012 奥运会(7 月 27 日 - 8 月 12 日)。你创建了一个从 17:00(下班)到 23:00(睡觉)循环的事件。但因开幕式 19:00 开始,你想将 7 月 27 日那天的时间改为 19:00-23:00。另外,8 月 1 日有个截止日期,可能无法观看,所以你想从系列中删除当天的事件。