Recurring Events (v7.1 이하)
이 문서는 DHTMLX Scheduler에서 반복 이벤트의 레거시 포맷을 다룹니다. DHTMLX Scheduler v7.1+의 최신 버전에 대한 자세한 내용은 여기를 참고하세요.
기본적으로 scheduler는 반복 이벤트를 처리하지 않습니다. 이 기능을 추가하려면, 페이지에서 recurring_legacy라는 확장 기능을 활성화해야 합니다.
scheduler.plugins({
recurring_legacy: true
});
반복 이벤트 지원이 활성화되면, 라이트박스에 아래와 같이 추가 섹션이 나타납니다:

설정 옵션
라이브러리는 반복 이벤트를 설정할 수 있는 여러 옵션을 제공합니다:
- repeat_date - '반복' 라이트박스의 'End by' 필드에 사용할 날짜 포맷을 지정합니다
- include_end_by - 'End by' 필드의 날짜를 포함할지(포함/제외) 여부를 지정합니다
- recurring_overflow_instances - 반복이 다음 달로 넘어가는 경우 처리 방식을 지정합니다
- repeat_precise - 'weekly' 반복 이벤트에서 과거 날짜를 포함하지 않도록 설정합니다
- 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");
'Recurring' 라이트박스
반복 확장 기능을 활성화하면, 라이트박스에 "Repeat event"라는 추가 섹션이 생깁니다. 기본 'recurring' 라이트박스 구성은 다음과 같습니다:
[
{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" 섹션 뒤에 위치해야 합니다.
서버 연동
반복 이벤트는 데이터베이스에 하나의 레코드로 저장되며, 기존 이벤트 필드 외에 아래 3개의 추가 필드를 포함합니다:
- rec_type - (varchar) 반복 패턴을 정의하며, 이 필드는 자동으로 채워집니다
- event_length - (long int) 이벤트의 지속 시간을 초 단위로 표시합니다
- event_pid - (int) 이벤트 시리즈의 부모 ID를 나타냅니다
일반적인 커넥터 쿼리는 다음과 같습니다:
$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___" - 3일마다 반복
- "month_2___" - 2개월마다 반복
- "month_1_1_2_" - 매월 두 번째 월요일
- "week_2___1,5" - 2주마다 월요일과 금요일
참고: 이중 또는 삼중 언더스코어는 해당 파라미터가 생략됨을 의미합니다.
백엔드에서 시리즈 파싱
반복 이벤트는 데이터베이스에 단일 레코드로 저장되며, Scheduler가 클라이언트 측에서 이를 분할합니다. 서버 측에서 개별 반복 날짜가 필요하다면, ASP.NET/ASP.NET Core 및 PHP용 반복 이벤트 파싱 도우미 라이브러리를 사용할 수 있습니다.
이 라이브러리는 GitHub에서 제공됩니다:
시리즈 내 특정 반복 항목 수정/삭제
반복 시리즈 내에서 특정 반복 항목만 수정 또는 삭제할 수 있습니다.
중요 사항
- 반복 이벤트를 수정할 때마다 데이터베이스에 별도의 레코드가 생성됩니다.
- 개별 반복 항목은 event_pid 속성을 통해 부모 이벤트와 연결됩니다.
- 반복 항목을 수정하면, event_length 필드는 실제 이벤트 길이가 아니라 원래 예정되었던 날짜의 타임스탬프(UNIX epoch 기준 초)를 저장합니다. 예를 들어, 2019년 7월 27일 15:00에 예정된 반복 항목을 2019년 7월 30일 15:00로 이동하면, 타임스탬프는 2019년 7월 27일 15:00을 반영합니다.
- 데이터베이스에 수정된 반복 항목이 있는 상태에서 라이트박스에서 '시리즈 수정(Edit series)'를 선택하면, 저장 후 모든 수정된 반복 항목은 삭제되고, 메인 반복 이벤트만 남으며 개별 반복 항목의 변경 내용은 사라집니다.
예시 시나리오
올림픽을 좋아하는 사용자가 런던 2012 올림픽(7월 27일~8월 12일)을 최대한 시청하고 싶다고 가정합니다. 퇴근 시간인 17:00부터 취침 전인 23:00까지 반복 이벤트를 생성합니다. 단, 개막식이 19:00에 시작하므로 첫 번째 반복 항목만 19:00~23:00으로 변경하고, 8월 1일은 마감일이라 시청하지 못할 것 같아 해당 날짜의 반복 항목은 삭제합니다.
작업 요약:
- 2012년 7월 27일부터 2012년 8월 12일