처음부터 차근차근

Full Calendar (php 사용) 본문

프로그래밍/Javascript

Full Calendar (php 사용)

_soyoung 2021. 12. 1. 14:28
반응형

 

fullcalendar.io

Full Calendar는 달력 프레임워크 라이브러리이다.

full calendar을 사용하면 일정을 만들고 그 일정을 이동(변경)하는 것을 쉽게 할 수 있다.

그 밖에도 일정 만들기 색깔 지정이나 이벤트 고르기 등 다양한 기능들이 있다.

 

 

 

Full Calendar 공식 사이트

https://fullcalendar.io/

 

FullCalendar - JavaScript Event Calendar

Open Source... With over 10 years of open source and over 120 contributors, FullCalendar will always have a free and open source core. Learn more

fullcalendar.io

 

 

 

 

full calendar 사용 법

1. <head></head>안에다 full calendar cdn 코드를 삽입한다.

<!-- fullcalendar CDN -->
<link href='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.css' rel='stylesheet' />
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/main.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@5.8.0/locales-all.min.js'></script>

 

 

 

 

2. calendar 출력하는 코드를 추가한다.

<div id='calendar'></div>

이 코드가 삽입된 곳에 캘린더가 생긴다.

 

 

 

 

3. 캘린더를 control하는 코드를 삽입한다.

 

전체 코드

<!--dateformat 바꿀 때 필요한 자바스크립트 라이브러리-->
<script class="cssdesk" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.11.0/moment.min.js" type="text/javascript"></script>

<script>
	/* -------- 캘린더 시작 ----------*/
    document.addEventListener('DOMContentLoaded', function() {
        var calendarEl = document.getElementById('calendar');
        var calendar = new FullCalendar.Calendar(calendarEl, {
			
			initialView: 'dayGridMonth',
			selectable: true,// 달력 일자 드래그 설정가능
			navLinks: true, // 날짜를 선택하면 Day 캘린더나 Week 캘린더로 링크
			editable: true, // 수정 가능
			nowIndicator: true, // 현재 시간 마크
			dayMaxEvents: true, // 이벤트가 오버되면 높이 제한 (+ 몇 개식으로 표현)
			locale: 'ko', // 한국어 설정
			eventAdd: function(obj) { // 이벤트가 추가되면 발생하는 이벤트
				console.log('add');
				
			},
			eventChange: function(obj) { // 이벤트가 수정되면 발생하는 이벤트
				
				// GMT 시간은 9시간 빨라서 9시간 빼줘야됨
				var start = obj.event._instance.range.start;
				if(start.getHours() == 9) {
					start = moment(start).format('YYYY-MM-DD') + " 00:00";
				}
				else {
					start = start.setHours(start.getHours() - 9);
					start = moment(start).format('YYYY-MM-DD hh:mm');
				}
				
				
				var end = obj.event._instance.range.end;
				if(end.getHours() == 9) {
					end = moment(end).format('YYYY-MM-DD') + " 00:00";
				}
				else {
					end = end.setHours(end.getHours() - 9);
					end = moment(end).format('YYYY-MM-DD hh:mm');
				}
				
				
				$.ajax({
						  url: "/~team2/admin/ajax_calendar_edit",
						  type: "POST",
						  data : {
								title : obj.event._def.title,
								start: start,
								end: end
						  },
						  traditional: true,
						  async: false, //동기
						  success : function(data){
							  
						  },
						  error : function(request,status,error){
							alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
							console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
						  }
					});
				
			},
			eventRemove: function(obj){ // 이벤트가 삭제되면 발생하는 이벤트
				console.log('remove');
				
			},
			select: function(arg) { // 캘린더에서 드래그로 이벤트 생성
				
				var title = prompt('입력할 일정:');
				if (title) {
					$.ajax({
						  url: "/~team2/admin/ajax_calendar_add",
						  type: "POST",
						  data : {
								title: title,
								start: arg.startStr,
								end: arg.endStr,
								allDay: arg.allDay
						  },
						  traditional: true,
						  async: false, //동기
						  success : function(data){
							  
						  },
						  error : function(request,status,error){
							alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
							console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
						  }
					});

					calendar.addEvent({
						title: title,
						start: arg.startStr,
						end: arg.endStr,
						allDay: arg.allDay
					})
				} 
				
				calendar.unselect()
			},
			droppable: true,
			eventClick: function(arg) { 
				// 있는 일정 클릭시, 
				console.log(arg);
				if (confirm('일정을 삭제하시겠습니까?')) 
				{ 
					$.ajax({
						  url: "/~team2/admin/ajax_calendar_delete",
						  type: "POST",
						  data : {
								title : arg.event._def.title
						  },
						  traditional: true,
						  async: false, //동기
						  success : function(data){
							 
						  },
						  error : function(request,status,error){
							alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
							console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
						  }
					});
					arg.event.remove();
				} 
			},
			eventBorderColor : '#82d1ff', // 이벤트 테두리색
			eventBackgroundColor : '#82d1ff' , // 이벤트 배경색
			headerToolbar: { // 툴바
				left: 'prev,next today',
				center: 'title',
				right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
			},
			events: function(info, successCallback, failureCallback){ // ajax 처리로 데이터를 로딩 시킨다. 
				$.ajax({
					  url: "/~team2/admin/ajax_calendar_load",
					  type: "POST",
					  dataType: "JSON",
					  traditional: true,
					  async: false, //동기
					  success : function(data){
						  
						successCallback(data);
						
					  },
					  error : function(request,status,error){
						alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
						console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
					  }
				});
			}
			
        });
		
        calendar.render(); // 캘린더 렌더링(화면 출력)
    });
	
	/* -------- 캘린더 끝 ----------*/

 

 

 

 

코드 추가 설명

1. eventChange

eventChange는 이벤트가 수정될 때 발생하는 이벤트이다.

대표적으로 원래있던 이벤트를 다른 날짜로 옮길 때 발생한다.

예시1
예시2

 

// GMT 시간은 9시간 빨라서 9시간 빼줘야됨
var start = obj.event._instance.range.start;
if(start.getHours() == 9) {
	start = moment(start).format('YYYY-MM-DD') + " 00:00";
}
else {
	start = start.setHours(start.getHours() - 9);
	start = moment(start).format('YYYY-MM-DD hh:mm');
}

obj.event._instance.range.start는 시작 날짜를 의미하고 기본값으로 GMT 시간이 들어가기 때문에 원래 시간으로 맞추기 위해 9시간을 빼줬다.

 

if(start.getHours() == 9) {
	start = moment(start).format('YYYY-MM-DD') + " 00:00";
}

이 코드를 넣은 이유는 시간이 9시일 때 -9시간을 해주면 0시라고 나오지 않아서 if문을 걸어서 직접 0시 0분으로 맞춰줬다.

 

$.ajax({
	url: "/~team2/admin/ajax_calendar_edit",
	type: "POST",
	data : {
		title : obj.event._def.title,
		start: start,
		end: end
	},
	traditional: true,
	async: false, //동기
	success : function(data){
							  
	},
	error : function(request,status,error){
	alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
		console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
	}
});

그 다음 ajax로 calendar 데이터베이스의 데이터를 수정한 데이터로 바꾼다.

 

calendar db

function ajax_calendar_edit() {
    header("Content-Type: text/html; charset=KS_C_5601-1987");
    header("Cache-Control:no-cache");
    header("Pragma:no-cache");

    $this->load->model('Calendar_m');
			
	$data['title'] = $_POST['title'];
	$data['start'] = $_POST['start'];
	$data['end'] = $_POST['end'];
			
	$data = $this->Calendar_m->edit($data);
}

Admin 컨트롤러의 ajax_calendar_edit()함수

 

function edit($data) {
    $sql = "update calendar set start='".$data['start']."', end='".$data['end']."' where title='".$data['title']."'";
            
    $this->db->query($sql);
}

Calendar_m의 edit()함수

 

 

 

 

2. select

캘린더에서 드래그로 이벤트 생성하거나 날짜를 클릭했을 때 발생하는 이벤트이다.

예시1
예시2

 

var title = prompt('입력할 일정:'); 
if (title) {
	$.ajax({
		url: "/~team2/admin/ajax_calendar_add",
		type: "POST",
		data : {
			title: title,
			start: arg.startStr,
			end: arg.endStr,
			allDay: arg.allDay
		},
		traditional: true,
		async: false, //동기
		success : function(data){
							  
		},
		error : function(request,status,error){
			alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
			console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
		}
	});

prompt를 사용해서 이벤트 제목을 받고 그 값을 title변수에 담아 ajax로 보내서 calendar의 내용을 추가한다.

 

function ajax_calendar_add() {
	header("Content-Type: text/html; charset=KS_C_5601-1987");
	header("Cache-Control:no-cache");
	header("Pragma:no-cache");

	$this->load->model('Calendar_m');

	$arr = array(
		'title'=>$_POST['title'],
		'start'=>$_POST['start'],
		'end'=>$_POST['end']
	);

	$data = $this->Calendar_m->add($arr);
}

Admin 컨트롤러의 ajax_calendar_add()함수

 

function add($data) {
    $arr = array(
	    'title'=>$data['title'],
	    'start'=>$data['start'],
	    'end'=>$data['end']
    );
    $this->db->insert('calendar', $arr);
}

Calendar_m의 add()함수

 

 

 

 

3. eventClick

이벤트를 클릭했을 때 발생하는 이벤트이다.

예시

 

if (confirm('일정을 삭제하시겠습니까?')) 
{ 
	$.ajax({
		url: "/~team2/admin/ajax_calendar_delete",
		type: "POST",
		data : {
			title : arg.event._def.title
		},
		traditional: true,
		async: false, //동기
		success : function(data){
		},
		error : function(request,status,error){
			alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
			console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
		}
	});
	arg.event.remove();
}

일정을 삭제하겠냐는 물음에 확인을 누르면 ajax로 database의 해당 title을 가진 일정을 지우고, 

arg.event.remove();

이 코드를 통해 이벤트를 화면 상에서도 지운다.

 

function ajax_calendar_delete() {
	header("Content-Type: text/html; charset=KS_C_5601-1987");
	header("Cache-Control:no-cache");
	header("Pragma:no-cache");

	$this->load->model('Calendar_m');

	$title = $_POST['title'];

	$data = $this->Calendar_m->delete($title);
}

Admin 컨트롤러의 ajax_calendar_delete()함수

 

function delete($title) {
	$sql = "delete from calendar where title='".$title."'";
	$this->db->query($sql);	
}

Calendar_m의 delete()함수

 

 

 

4. event

캘린더 중에서 무언가를 클릭하면 발생하는 이벤트이다.

캘린더에 일정을 표시하는 역할을 한다.

 

<기본형>

events: [
    {
      id: 'a',
      title: 'christmas',
      start: '2021-12-25'
    }
]

event: 뒤에 오는 데이터 배열을 모두 캘린더에 표시해준다.

(예시로 위와 같이 되어있으면 2021년 12월 25일에 christmas라는 제목으로 일정이 표시된다!)

 

 

코드 설명

$.ajax({
	url: "/~team2/admin/ajax_calendar_load",
	type: "POST",
	dataType: "JSON",
	traditional: true,
	async: false, //동기
	success : function(data){
		successCallback(data);
	},
	error : function(request,status,error){
		alert("code = "+ request.status + " message = " + request.responseText + " error = " + error); // 실패 시 처리
		console.log("code = "+ request.status + " message = " + request.responseText + " error = " + error);
	}
});

ajax로 caledar 데이터베이스의 모든 데이터를 받아와서 화면에 출력한다.

json형태로 받아와서 successCallback(data); 으로 바로 출력하기 때문에 기본형과 같이 배열로 출력된다.

 

function ajax_calendar_load() {
	header("Content-Type: text/html; charset=KS_C_5601-1987");
	header("Cache-Control:no-cache");
	header("Pragma:no-cache");
	header("Content-Type:application/json");

	$this->load->model('Calendar_m');

	$data = $this->Calendar_m->getAll();

	$result = json_encode($data, JSON_UNESCAPED_UNICODE);

	echo $result;
}

Admin 컨트롤러의 ajax_calendar_load()함수

getAll()함수로 받은 sql문 결과 값을 json 형태로 변환해서 리턴한다.

 

function getAll() {
	$sql = "SELECT if (DATE_FORMAT(start,'%T') = '00:00:00', 
	DATE_FORMAT(start,'%Y-%m-%d'), start) as start, if (DATE_FORMAT(end,'%T') = '00:00:00', 
	DATE_FORMAT(end,'%Y-%m-%d'), end) as end, title FROM calendar";

	return $this->db->query($sql)->result();
}
Mysql의 if문   :   if (조건문, 참일때 값, 거짓일때 값)

Calendar_m의 getAll()함수

DATE_FORMAT(start,'%T') 으로 시작 날짜의 시간 값을 모두 가져와서 그 시간이 00:00:00이면 시간을 제거한 값인 0000-00-00형식으로 반환하고, 시간이 00:00:00이 아니면 시간을 그대로 출력한다(ex  0000-00-00 00:00:00).

이렇게 하는 이유는 일정이 캘린더에 표시될 때 시간이 00:00:00이면 

예시

이런 식으로 이벤트 앞에 오전 12시라고 시간이 붙는데 이 시간이 심미상 좋지 않아서 이걸 없애기 위해 if문으로 나눴다. 시간을 반환하지 않으면 예시와 같이 앞에 시간이 붙지 않고 깔끔하게 이벤트 제목만 보인다.

 

 

 

 

결과

반응형

'프로그래밍 > Javascript' 카테고리의 다른 글

jquery : Event.stopImmediatePropagation()  (0) 2022.02.06
jquery click 이벤트 동적 페이지에 적용하는 법  (0) 2022.02.05
별점 구현  (0) 2022.02.04
jquery datepicker  (0) 2021.11.23
Javascript 정리  (0) 2021.10.22
Comments