当たり前ですが、FullCalendar から元データ(例えばGoogleカレンダー)を直接更新することは出来ません。
やり方は2つあると思います。
普通は、2の方法だと思います。
ちょっと厄介なのが追加です。
FullCalendarのイベントの追加方法は、ボタンを設けて日付を入力してもらう方法のようです。
(サンプルが公開されています)
ドラッグ&ドロップで追加できると良いのですが・・・。
ネットでの例を見ると大体は、イベントで処理を行うようです。
dayClick: function(date, jsEvent, view) {
alert('clicked ' + date.format());
},
selectable: true,
select: function(start, end, jsEvent, view) {
alert('selected ' + startDate.format() + ' to ' + endDate.format());
}
上を追加して見ると、その動作が確認できます。
実際クリックすると、両方が反応するので、select だけで view を判断して
操作するほうが良さそうです。
もっと具体的な例が github に上がっていました。
fullcalendar-sample
少し長いコードですが、やってる事は良く解ります。
ただし、コードが少し古いのか、正しく動きません。
start、end を JavaScript 標準 Date と見ているようですが、現在の FullCalendar は、Moment オブジェクトです。
少し修正したコードを載せておきます。
JSPだとテストが簡単なので助かります。
<%@ page contentType="text/html; charset=UTF-8" %>
<%
request.setCharacterEncoding("UTF-8");
String title = "カレンダー";
%>
<!doctype html>
<html>
<head>
<%@ include file="common_head.jsp"%>
<link rel='stylesheet' href='js/fullcalendar/fullcalendar.css' />
<script src='js/fullcalendar/moment.min.js'></script>
<script src='js/fullcalendar/fullcalendar.js'></script>
<script src='js/fullcalendar/locale/ja.js'></script>
<script>
// FullCalendar 操作用ワーク
function Event(title, start, end) {
this.title = title;
this.start = start;
this.end = end;
return this;
}
$(function() {
var calendar = $('#calendar').fullCalendar({
// ロケールは日本語
locale: 'ja',
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
// ボタンに表示される文字
buttonText: {
},
axisFormat: 'H:mm',
editable: true,
// 予定の入っていない領域のクリック
dayClick: function(date, jsEvent, view) {
var event = new Event('新しい予定', date, date);
editEvent(event, '新規イベント', false);
},
// 今回は使わない
selectable: false,
select: function(startDate, endDate) {
alert('selected ' + startDate.format() + ' to ' + endDate.format());
},
// 予定の入っている領域のクリック
eventClick: function(event) {
if(event.end == null) {
event.end = event.start;
}
editEvent(event, '予定の編集', true);
},
eventSources: [
// テスト用の固定のイベント
{
events: [
{
title : 'event1',
start : '2018-10-01'
},
{
title : 'event2',
start : '2018-10-03',
end : '2018-10-03'
},
{
title : 'event3',
start : '2018-10-05T12:30:00',
}
],
color: 'black', // 枠の色
textColor: 'yellow' // 文字色
},
{
url: 'calendar_json.jsp', // Ajax
color: 'yellow',
textColor: 'black'
}
]
});
/*
** CALENDAR FUNCTIONS
*/
// イベントの追加または更新
function operateEvent(state, event) {
if(state == false) {
calendar.fullCalendar('renderEvent', event, true);
} else {
calendar.fullCalendar('updateEvent', event);
}
// Todo:Ajax による処理
}
/*
** EVENT FORM
*/
function editEvent(event, title, state) {
// Transform to dialog
$('#dialogEditEvent').dialog({
modal: true,
title: title
});
// クリックされたイベント情報をフォームに設定
$('#name').val(event.title);
$('#start').val(event.start.format('YYYY-MM-DD HH:mm'));
$('#end').val(event.end.format('YYYY-MM-DD HH:mm'));
// FORMのイベント処理
$('#editEvent').unbind().submit(function() {
var el = $(this),
title = el.find('#name').val(),
start = el.find('#start').val(),
end = el.find('#end').val();
if(end == '') {
end = start;
}
if(title != '' ) {
event.title = title;
event.start = moment(start);
event.end = moment(end);
operateEvent(state, event);
$('#dialogEditEvent').dialog('close');
} else {
alert('Empty Fields Or Bad Date Format');
}
return false;
});
}
// jQuery-UI datepicker の表示
$('#dialogEditEvent').on('dialogcreate', function(event, ui) {
$('#start').datepicker({ dateFormat: 'yy-mm-dd' });
$('#end').datepicker({ dateFormat: 'yy-mm-dd' });
});
});
</script>
<title><%=COMMON_TITLE%></title>
</head>
<body class="hide-sidedrawer">
<div id="content-wrapper" class="mui-container-fluid">
<h1><%=title%></h1>
<div id='calendar'></div>
<div id="dialogEditEvent" style="display: none;">
<form id="editEvent">
<p>
<label for"name">タイトル :</label>
<input id="name" type="text"/>
</p><p>
<label for"start">開始時刻 :</label>
<input id="start" type="date"/>
</p><p>
<label for"end">終了時刻 :</label>
<input id="end" type="date"/>
</p><p>
<button type="submit" >登録</input>
</p>
</form>
</div>
<a href="/test/">メニューへ</a>
</div>
</body>
</html>
実行結果は下の画面の様になります。
Ajax でGoogle カレンダーからもイベントを取得しています。
更新処理は実装していませんが、Ajaxで作るのは簡単だと思います。
| « 前頁 |