简体   繁体   English

根据输入中的值重新获取FullCalendar事件

[英]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.

相关问题 fullcalendar 版本 4:重新获取事件不会删除新添加的事件 - fullcalendar version 4: refetch events doesn't remove newly added event 全日历重新获取事件源 - Fullcalendar refetch eventsource Angular 11:如何在 Fullcalendar V5 中重新获取(从后端更改事件时)事件? - Angular 11 : How to refetch (when events are changed from backEnd) Events in Fullcalendar V5? 如何基于className删除fullCalendar上的事件 - How to remove events on fullCalendar based on className 如何根据描述对fullcalendar事件进行颜色编码 - How to color code fullcalendar events based on description 有没有办法根据 className FullCalendar 切换事件可见性 - Is there a way to toggle events visibility based on className FullCalendar 有没有一种方法可以在v3中重新获得fullcalendar? - There's a way to refetch fullcalendar in v3? 如何根据 FullCalendar V5 上的选择值过滤事件? - How to filter events based on select value on FullCalendar V5? PHP:基于下拉过滤器将事件从数据库获取到全日历 - PHP: Fetching events from database to fullcalendar based on dropdown filter 在JavaScript中使用fullcalendar,如何修改参数列表并重新获取? - Using fullcalendar with javascript, how to modify a parameters list and refetch?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM