스케줄 모듈
람보님의 스케줄 모듈을 개조해서 만들었습니다.
- 이제 나름 안정화 버전이라 판단되어 공식 배포합니다.
- 관련 히스토리는 https://xetown.com/tips/1529234 를 참조해주세요.
관심이 있으신 분들은 아래 사항 숙지하시고 사용해주시면 감사하겠습니다.
미리보기 : https://dev.aporia.blog/schedule
1. 설치
1) 기존에 2.0 미만의 스케줄 모듈이 있다면
- 완전히 삭제한 뒤에 설치하셔야 합니다. 기존과 테이블 구조가 많이 달라졌기 때문입니다. 절대로 기존 모듈(2.0 미만)에 덮어쓰기 하거나 업데이트하지 마세요.
- 기존의 데이터도 호환되지 않을 겁니다. 만약 데이터 승계가 필요하다면 따로 백업하신 후에 DB 테이블과 컬럼에 맞게 수동으로 옮겨주셔야 합니다.
2) 기존에 2.0~2.1 버전 사용자라면
- 관리자 페이지 첫 화면에서 데이터베이스 업데이트를 반드시 해주셔야 합니다.
- 썸네일 출력 관계로 uploaded_count 컬럼이 추가되었기 때문입니다.
3) 기타
- PHP 7.0, 라이믹스 2.0.7, 크롬에서 테스트되었습니다. PHP 8.*에서는 호환성에 문제가 있을 수 있습니다.
- 라이믹스 하위 버전에서 테스트는 해보지 않았지만, 2.0 미만에서는 작동하지 않는 게 확실하니 2.0 이상 환경에서 설치 시도를 해주세요.
- 설치 경로는 루트 > modules > schedule 입니다.
2. 주요 기능
1) 개요
-람보님에 의하면 "게시판모듈에 소속된 모듈을 밖으로 끄집어냄으로써 더이상 Document 모듈의 복잡한 DB구조와 확장변수의 복잡함을 더 이상 사용하지 않아도 편리하게 스케줄을 이용할 수 있도록 하는 것이 목적"
- 인데, 기능 개선 과정에서 Document와 Board 모듈을 벤치마킹하면서 좀 복잡해지긴 했습니다. 하지만 그만큼 기능이 좋아졌습ㄴ...
2) 공신력 있는 날짜 정보 활용
- 공공데이터 API를 통해 음양력, 공휴일, 24절기, 기타 잡절 출력
- API를 사용하지 않으면 별도의 라이브러리를 사용합니다.
3) 알기 쉬운 스케줄 반복 설정
- 스케줄 반복 설정시 접근이 쉬운 인터페이스 제공(기본 스킨)
- 반복 설정 내용에 대한 깔끔한 코드 처리 ... 암튼 어렵지 않아요
4) SEO 강화
- 라이믹스 2.0 이후에 도입된 짧은 주소 기능으로 검색 엔진 최적화의 수준을 더 높였습니다.
- 또한 본문 내 첨부이미지 외에도 외부이미지로도 메타 태그의 대표 이미지로 설정 가능합니다.
5) 스케줄의 원활한 대기/공개 관리
- 스케줄 본문에서 직접 변환 가능
- 관리자 페이지에서도 일괄적으로 관리 가능
6) 회원 전용 비밀스케줄 기능 지원
- 상담게시판 기능과 유사하다 보시면 됩니다
7) 다양한 스킨 활용 가능
- 스케줄 전용 모듈인 만큼 원하시는대로 스킨을 제작해서 사용하실 수 있습니다.
3. 설정
1) 특일 정보 설정
- 음력, 공휴일, 24절기, 기타 잡절 등 특일 정보 출력을 위해 공공데이터 포털에서 API키를 받아서 입력합니다. 두 군데에서 '활용신청' 수락을 받아야 하는데, API키는 처음 받은 키를 그대로 유지하면 됩니다.
- 기존의 특일 정보 관련 함수들에 비해 정확하고 공신력 있는 정보라 생각하시면 될 것 같습니다.
- 만약 API키가 없더라도 모듈 자체적으로 특일 정보를 구현할 수는 있습니다. 다만 이 경우에는 API키를 활용하는 것보다 스케줄 표/목록 출력이 살짝 느릴 수는 있습니다.
- API키 취득 및 활용신청은 아래의 링크에서 하세요.
- 특일(공휴일,24절기,잡절) : https://www.data.go.kr/data/15012690/openapi.do
- 음양력 변환 : https://www.data.go.kr/data/15012679/openapi.do
2) 모듈 추가/정보 : 설정
- 모듈 이름(mid), 브라우저 제목, 모듈 분류, 관리자 메일 등을 입력합니다. 게시판 모듈의 방식과 동일하니 어렵지 않을 겁니다.
- 특일선택은 공공데이터 포털에서 취득한 API키를 활용해서 스케줄 테이블에 뿌려줄 항목들입니다. 음력, 공휴일, 24절기, 기타 잡절 등을 가져올 수 있습니다.
[주의] API키를 통해 월별 특일 정보가 담긴 xml 파일을 캐시파일로 저장하게 됩니다. 따라서 달력 각 페이지 첫 로드시에는 속도가 다소 느릴 수 있습니다. 그렇지만 캐시파일 생성 이후에는 빠른 속도로 로드가 이뤄집니다.
- 또한 관리자가 공공데이터에서 제공하는 특일 외의 여타 특일을 직접 입력할 수도 있습니다. 행별로 제목, mmdd 형식으로 입력해서 활용할 수 있습니다.
3) 모듈 추가/정보 : 레이아웃 | 스킨
- 레이아웃, 스킨, 상단내용, 하단내용 등을 입력할 수 있습니다. 게시판 방식과 동일합니다.
- 단, 모바일 레이아웃과 스킨은 설정 > 시스템 설정 > 고급 설정에서 '모바일 뷰 사용'을 '아니오'로 했다면 해당 폼을 로드하지 않습니다.
4) 모듈 추가/정보 : 고급 설정
- 스팸 방지 기능은 스팸필터 모듈의 캡챠 설정과 연동됩니다.
- 상태 지정은 스케줄 입력 화면에서 작성자가 선택할 수 있는 스케줄 콘텐츠 상태 선택 사항을 의미합니다.
- 대기 상태의 스케줄을 어떻게 표시할 것인지 설정할 수 있습니다. 그냥 보이게 하거나, 가리거나, 감출 수 있습니다.
- 비밀 스케줄러를 사용하면 작성자는 본인이 입력한 스케줄만 확인할 수 있습니다. 상담게시판 기능과 유사합니다.
- 목록 보기 체크를 통해 캘린더뿐 아니라 일반적인 목록 형태로도 스케줄을 열람할 수 있습니다.
5) 기타 항목
- 분류 관리, 권한 관리, 추가 설정, 스킨 설정 등은 기존 게시판 설정과 유사하므로 따로 설명이 필요 없을 겁니다.
- 다만 추가설정에 댓글 설정이 있는데 이 부분은 향후 기능 개선을 위해 남겨둔 것으로 현재 2.2 버전에서는 모듈에 영향을 주지 않습니다.
댓글 '44'












이 스케줄러...설치했는데...좋습니다...아주 좋습니다.
다만 조금 아쉬운것은 사용기간이 정해져 있다는 것...
어쨌든 만드시느라..고생하셨고..고맙게 잘 쓰겠습니다. ^^









php : 7.4.6 (64-bit)
레이아웃 미설정으로 테스트하였습니다.
로컬호스트환경이라 주소제공을 못해드려 죄송합니다.
index.php:26 GET http://localhost/common/css/xeicon/xeicon.min.css net::ERR_ABORTED 404 (Not Found)
index.php:27 GET http://localhost/common/js/plugins/ui/jquery-ui.min.css net::ERR_ABORTED 404 (Not Found)
index.php:32 GET http://localhost/common/js/plugins/ui/jquery-ui.min.js net::ERR_ABORTED 404 (Not Found)
index.php:33 GET http://localhost/common/js/plugins/ui/jquery.ui.datepicker-ko.js net::ERR_ABORTED 404 (Not Found)
index.php?mid=schedule&selected_month=202102&selected_day=24&act=dispScheduleInsert:32 GET http://localhost/common/js/plugins/ui/jquery-ui.min.js net::ERR_ABORTED 404 (Not Found)
index.php?mid=schedule&selected_month=202102&selected_day=24&act=dispScheduleInsert:33 GET http://localhost/common/js/plugins/ui/jquery.ui.datepicker-ko.js net::ERR_ABORTED 404 (Not Found)
jquery-ui-timepicker-addon.js?20191025205827:21 Uncaught TypeError: Cannot read property 'timepicker' of undefined
at jquery-ui-timepicker-addon.js?20191025205827:21
at jquery-ui-timepicker-addon.js?20191025205827:14
at jquery-ui-timepicker-addon.js?20191025205827:16
(anonymous) @ jquery-ui-timepicker-addon.js?20191025205827:21
(anonymous) @ jquery-ui-timepicker-addon.js?20191025205827:14
(anonymous) @ jquery-ui-timepicker-addon.js?20191025205827:16
jquery-ui-timepicker-ko.js?20210225165704:4 Uncaught TypeError: Cannot read property 'regional' of undefined
at jquery-ui-timepicker-ko.js?20210225165704:4
at jquery-ui-timepicker-ko.js?20210225165704:22
(anonymous) @ jquery-ui-timepicker-ko.js?20210225165704:4
(anonymous) @ jquery-ui-timepicker-ko.js?20210225165704:22
insert.js?20210225165704:60 Uncaught TypeError: Cannot read property 'datetimeRange' of undefined
at insert.js?20210225165704:60
(anonymous) @ insert.js?20210225165704:60
ckeditor.js?20210219154748:99 GET http://localhost/common/css/xeicon/xeicon.min.css net::ERR_ABORTED 404 (Not Found)
write @ ckeditor.js?20210219154748:99
setData @ ckeditor.js?20210219154748:1005
(anonymous) @ ckeditor.js?20210219154748:398
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
setData @ ckeditor.js?20210219154748:295
b @ ckeditor.js?20210219154748:998
(anonymous) @ ckeditor.js?20210219154748:1000
CKEDITOR.editor.setMode @ ckeditor.js?20210219154748:375
(anonymous) @ ckeditor.js?20210219154748:369
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
fireOnce @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fireOnce @ ckeditor.js?20210219154748:13
(anonymous) @ ckeditor.js?20210219154748:288
z @ ckeditor.js?20210219154748:266
load @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:287
(anonymous) @ ckeditor.js?20210219154748:273
(anonymous) @ ckeditor.js?20210219154748:271
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:270
k @ ckeditor.js?20210219154748:272
(anonymous) @ ckeditor.js?20210219154748:273
z @ ckeditor.js?20210219154748:285
(anonymous) @ ckeditor.js?20210219154748:285
(anonymous) @ ckeditor.js?20210219154748:529
(anonymous) @ ckeditor.js?20210219154748:271
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:270
getStylesSet @ ckeditor.js?20210219154748:529
e @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:284
d @ ckeditor.js?20210219154748:265
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:265
v @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:284
b @ ckeditor.js?20210219154748:545
loadPart @ ckeditor.js?20210219154748:547
l @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:283
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
fireOnce @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fireOnce @ ckeditor.js?20210219154748:13
g @ ckeditor.js?20210219154748:283
(anonymous) @ ckeditor.js?20210219154748:280
(anonymous) @ ckeditor.js?20210219154748:30
setTimeout (async)
setTimeout @ ckeditor.js?20210219154748:30
a @ ckeditor.js?20210219154748:280
a @ ckeditor.js?20210219154748:369
CKEDITOR.appendTo @ ckeditor.js?20210219154748:374
editorInit @ editor.app.js?20210219154751:118
$.fn.XeCkEditor @ editor.app.js?20210219154751:208
(anonymous) @ index.php?mid=schedule&selected_month=202102&selected_day=24&act=dispScheduleInsert:344
i @ jquery-2.2.4.min.js?20210219154748:2
fireWith @ jquery-2.2.4.min.js?20210219154748:2
ready @ jquery-2.2.4.min.js?20210219154748:2
J @ jquery-2.2.4.min.js?20210219154748:2
ckeditor.js?20210219154748:99 GET http://localhost/common/js/plugins/ui/jquery-ui.min.css net::ERR_ABORTED 404 (Not Found)
write @ ckeditor.js?20210219154748:99
setData @ ckeditor.js?20210219154748:1005
(anonymous) @ ckeditor.js?20210219154748:398
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
setData @ ckeditor.js?20210219154748:295
b @ ckeditor.js?20210219154748:998
(anonymous) @ ckeditor.js?20210219154748:1000
CKEDITOR.editor.setMode @ ckeditor.js?20210219154748:375
(anonymous) @ ckeditor.js?20210219154748:369
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
fireOnce @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fireOnce @ ckeditor.js?20210219154748:13
(anonymous) @ ckeditor.js?20210219154748:288
z @ ckeditor.js?20210219154748:266
load @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:287
(anonymous) @ ckeditor.js?20210219154748:273
(anonymous) @ ckeditor.js?20210219154748:271
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:270
k @ ckeditor.js?20210219154748:272
(anonymous) @ ckeditor.js?20210219154748:273
z @ ckeditor.js?20210219154748:285
(anonymous) @ ckeditor.js?20210219154748:285
(anonymous) @ ckeditor.js?20210219154748:529
(anonymous) @ ckeditor.js?20210219154748:271
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:270
getStylesSet @ ckeditor.js?20210219154748:529
e @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:284
d @ ckeditor.js?20210219154748:265
z @ ckeditor.js?20210219154748:266
w @ ckeditor.js?20210219154748:266
A @ ckeditor.js?20210219154748:266
(anonymous) @ ckeditor.js?20210219154748:267
setTimeout (async)
F.CKEDITOR.env.ie.e.$.onload @ ckeditor.js?20210219154748:267
load (async)
F @ ckeditor.js?20210219154748:267
load @ ckeditor.js?20210219154748:268
load @ ckeditor.js?20210219154748:265
v @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:284
b @ ckeditor.js?20210219154748:545
loadPart @ ckeditor.js?20210219154748:547
l @ ckeditor.js?20210219154748:284
(anonymous) @ ckeditor.js?20210219154748:283
l @ ckeditor.js?20210219154748:10
(anonymous) @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fire @ ckeditor.js?20210219154748:13
fireOnce @ ckeditor.js?20210219154748:12
CKEDITOR.editor.CKEDITOR.editor.fireOnce @ ckeditor.js?20210219154748:13
g @ ckeditor.js?20210219154748:283
(anonymous) @ ckeditor.js?20210219154748:280
(anonymous) @ ckeditor.js?20210219154748:30
setTimeout (async)
setTimeout @ ckeditor.js?20210219154748:30
a @ ckeditor.js?20210219154748:280
a @ ckeditor.js?20210219154748:369
CKEDITOR.appendTo @ ckeditor.js?20210219154748:374
editorInit @ editor.app.js?20210219154751:118
$.fn.XeCkEditor @ editor.app.js?20210219154751:208
(anonymous) @ index.php?mid=schedule&selected_month=202102&selected_day=24&act=dispScheduleInsert:344
i @ jquery-2.2.4.min.js?20210219154748:2
fireWith @ jquery-2.2.4.min.js?20210219154748:2
ready @ jquery-2.2.4.min.js?20210219154748:2
J @ jquery-2.2.4.min.js?20210219154748:2







Good!!
근데 리스트로 출력하니 아무 내용도 출력이 안되는데요
이곳에는 이미지를 올릴 수가 없어서...