[英]Refetch FullCalendar Events Based On Values in Inputs
I have a calendar that fetches events from a MySQL DB for site work permits. 我有一个日历,可以从MySQL数据库中获取事件以获得现场工作许可。 When the page opens the events are fetched from the DB and added to the calendar. 当页面打开时,将从数据库中获取事件并将其添加到日历中。
I would like to add a search facility to the calendar where the user enters text in to any of 5 inputs, click apply and the calendar fetches the events based on the criteria entered. 我想在日历中添加一个搜索工具,用户可以在其中输入5个输入中的任何一个的文本,单击“应用”,日历根据输入的条件提取事件。
The first fetch of the events when the page opens uses wildcard characters to query the DB via ajax, this works with no issues. 页面打开时,事件的第一次获取使用通配符通过ajax查询数据库,这没有问题。 I then call the FullCalendar removeEvents and refetchEvents methods to run the ajax with the new values but any entered text is not included, only the original values are used. 然后,我调用FullCalendar removeEvents和refetchEvents方法,以新值运行ajax,但不包括任何输入的文本,仅使用原始值。
My Javascript is below 我的Javascript如下
$(document).ready(function(){
document.getElementById('left_nav').innerHTML = sessionStorage.getItem('left_nav');
document.getElementById('company').innerHTML = " " + sessionStorage.getItem('company');
document.getElementById('profile_image').innerHTML = sessionStorage.getItem('profile_image');
//Add value of inputs to variables
var select_project = $('#select_project').val();
var select_site = $('#select_site').val();
var select_area = $('#select_area').val();
var select_requester = $('#select_requester').val();
var select_line_manager = $('#select_line_manager').val();
var today = new Date();
var dd = today.getDate();
var m = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
today = yyyy+'/'+m+'/'+dd;
var popup_button;
$('#clear').click(function(e) {
})
$('#apply').click(function(e) {
//Clear all events and refetch
$('.fullcalendar-event').fullCalendar('removeEvents');
$('.fullcalendar-event').fullCalendar('refetchEvents');
})
// Event colors
$('.fullcalendar-event').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'agendaWeek,agendaDay'
},
views: {
week: {
columnFormat: 'ddd D/M'
},
day: {
columnFormat: 'dddd D/M'
}
},
defaultDate: today,
editable: false,
eventOverlap: false,
displayEventTime: false,
height: 'auto',
allDaySlot: false,
defaultView: 'agendaWeek',
events: {
//Get events based on criteria with wildcards
type: "POST",
url: 'php_files/calender_php_files/populate_calender.php',
data: {
client_id: sessionStorage.getItem('client_id'),
access_id: sessionStorage.getItem('access_id'),
select_project: '%' + select_project + '%',
select_site: '%' + select_site + '%',
select_area: '%' + select_area + '%',
select_requester: '%' + select_requester + '%',
select_line_manager: '%' + select_line_manager + '%'
}
},
eventRender: function (event, element) {
var event_popover = element.popover({
title: function () {
return "<B>" + event.event_title + "</B>";
},
placement: 'auto',
html: true,
trigger: 'click',
animation: 'true',
content: function () {
if (sessionStorage.getItem('access_id') > 1) {
if (event.event_status === 'Open') {
popup_button = "<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='view_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>View/Edit</a></button>" +
"<button style='margin-left: 8px;' class='btn btn-success btn-xs'><a style='color:white;' href='sign_on_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>Sign On</button>" +
"<button style='margin-left: 8px;' class='btn btn-warning btn-xs'><a style='color:white;' href='clear_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>Clear</button>" +
"</div>"
} else if (event.event_status === 'Cleared') {
popup_button = "<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='view_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>View</a></button>" +
"<button style='margin-left: 8px;' class='btn btn-danger btn-xs'><a style='color:white;' href='cancel_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>Cancel</button>" +
"</div>"
} else if (event.event_status === 'Cancelled') {
popup_button = "<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='view_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>View</a></button>" +
"</div>"
}
} else {
popup_button = "<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='view_permit.php?permit_id="
+ encodeURIComponent(event.event_number) + "'>View</a></button>" +
"</div>"
}
if (event.event_type === 'embargo') {
if (sessionStorage.getItem('access_id') > 1) {
return "<div>" +
"<b>Site: </b>" + event.event_site +
"<br />" +
"<b>Start: </b>" + moment(event.event_start_date).format('DD/MM/YYYY') + ", " +
moment(event.event_start_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<b>End: </b>" + moment(event.event_end_date).format('DD/MM/YYYY') + ", " +
moment(event.event_end_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<br />" +
"<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='edit_site_embargo.php?embargo_id="
+ encodeURIComponent(event.event_number) + "'>View/Edit</a></button>" +
"</div>" +
"</div>"
} else {
return "<div>" +
"<b>Site: </b>" + event.event_site +
"<br />" +
"<b>Start: </b>" + moment(event.event_start_date).format('DD/MM/YYYY') + ", " +
moment(event.event_start_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<b>End: </b>" + moment(event.event_end_date).format('DD/MM/YYYY') + ", " +
moment(event.event_end_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<br />" +
"<div class='form-group text-center'>" +
"<button class='btn btn-primary btn-xs'><a style='color:white;' href='edit_site_embargo.php?embargo_id="
+ encodeURIComponent(event.event_number) + "'>View</a></button>" +
"</div>" +
"</div>"
}
} else if (event.event_type === 'permit') {
return "<div>" +
"<b>Site: </b>" + event.event_site +
"<br />" +
"<b>Start: </b>" + moment(event.event_start_date).format('DD/MM/YYYY') + ", " +
moment(event.event_start_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<b>End: </b>" + moment(event.event_end_date).format('DD/MM/YYYY') + ", " +
moment(event.event_end_time, 'HHmmss').format('HH:mm') +
"<br />" +
"<br />" +
popup_button +
"</div>"
}
},
container: 'body'
}).popover('show');
$('body').on('click', function (e) {
if (!element.is(e.target) && element.has(e.target).length === 0 && $('.popover').has(e.target).length === 0)
element.popover('hide');
});
}
});
});
The issue you've got is that the data
object you pass into fullCalendar as part of your events is static. 您遇到的问题是,作为事件一部分传递给fullCalendar的data
对象是静态的。 When you create the calendar, you give fullCalendar this object in the state it is in at that moment. 创建日历时,您以当时的状态为fullCalendar提供此对象。 fullCalendar makes a copy of it and uses it whenever it fetches events. fullCalendar会复制它并在每次获取事件时使用它。 It cannot read any changes you make to that object or the variables within it. 它无法读取您对该对象或其中的变量所做的任何更改。
The solution to this is to define data
as a callback function, which fullCalendar can re-run whenever the events need to be refreshed. 解决方案是将data
定义为回调函数,当需要刷新事件时,fullCalendar可以重新运行。 That way it has some code it can actually execute in order to read the latest values of the variables, rather than just a static object. 这样,它便可以执行一些代码,以便读取变量的最新值,而不仅仅是一个静态对象。
You write it like this: 您可以这样写:
events: {
//Get events based on criteria with wildcards
type: "POST",
url: 'php_files/calender_php_files/populate_calender.php',
data: function() {
return {
client_id: sessionStorage.getItem('client_id'),
access_id: sessionStorage.getItem('access_id'),
select_project: '%' + select_project + '%',
select_site: '%' + select_site + '%',
select_area: '%' + select_area + '%',
select_requester: '%' + select_requester + '%',
select_line_manager: '%' + select_line_manager + '%'
};
}
},
This is documented here: https://fullcalendar.io/docs/event_data/events_json_feed/ in the last section entitled "Dynamic data parameter". 在此处记录: https : //fullcalendar.io/docs/event_data/events_json_feed/在标题为“动态数据参数”的最后一节中。
PS There should be no need to use removeEvents
before calling refetchEvents
- the refetch operation already automatically clears the calendar and replaces it with the latest data. 附注:在调用refetchEvents
之前,无需使用removeEvents
refetchEvents
操作已经自动清除了日历并将其替换为最新数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.