【问题标题】:arshaw fullcalendar : several issuearshaw fullcalendar:几个问题
【发布时间】:2012-06-30 18:04:56
【问题描述】:

你好
我正在使用 arshaw fullcalendar v1.5.2(仅月视图)作为物业预订网站,它是一个很棒的插件,但我遇到了一些问题,我在 google code 上看到过类似的问题,但真的没有什么清楚的。 :(,请帮我解决这些问题

这里是working demoJS Code

到目前为止我做了什么

  • 从下面两个不同的 json 文件中获取事件数据

    • json_events.php :保存用户从前端预订的预订详情;管理员无法更改此类事件的任何详细信息。

    • new_charges.php:这包含特殊费用事件详细信息,管理员 添加/更新删除任何未来日期的新费用。

  • 当管理员点击一个事件时,他可以查看任何事件的详细信息

  • 管理员可以添加/编辑和删除日历上未来日期或日期范围的新事件,这些事件将存储在new_charges.php

这是我的问题

a) I want that only one event is allowed for a date(s).

b) 目前,如果用户点击某天有任何预订活动或特殊收费活动,则它会提醒预订日期时间>, 但是之后会出现输入事件标题的提示框,

这是因为我同时使用了dayClickselect 方法

How do i stops further propagation if a day already have an event ?

c) 假设预定了 1 月 15 日(由 fc-day17 div 包裹)(我已经为事件申请了一个课程 booked),现在当我去下个月并点击fc-day17 div,它还会提醒当天已预订而没有预订 通过检查代码,我发现对于相同的 div,它还有几个月的 booked

我认为eventRender 方法中缺少一些东西?

does `eventRender()`  method is called only once when initialize the calendar 
or each time when we go `prev` or `next` month?

d) 我已经通过 json 文件在渲染事件期间更改了特殊费用事件的背景颜色,但是当我删除该事件时,它不会改变回正常背景并且仍然说那一天是已预订。

how do I make default background of a date if I delete the events of that day??

e) how to hide all events related to previous months?

【问题讨论】:

    标签: php jquery fullcalendar


    【解决方案1】:
    // a) and b)
    // We dont need dayClick event, only select
    // I think you created calender something like this 
    // var calendar = $('#calendar').fullCalendar({ ... })
    
    select: function(start, end, allDay) {
        //debugger;
        var events = calendar.fullCalendar( 'clientEvents' );
        for (var i = 0; events.length > i ; i++){
            //If we have 1 day event
            if((events[i].end == null && (events[i].start.getTime() >= start.getTime() && events[i].start.getTime() <= end.getTime())) ||
            // If we have many days event 
            (events[i].end != null && ((events[i].start.getTime() >= start.getTime() && events[i].start.getTime() <= end.getTime()) || 
                (events[i].end.getTime() >= start.getTime() && events[i].start.getTime() <= end.getTime()) || 
                (events[i].start.getTime() <= start.getTime() && events[i].end.getTime() >= end.getTime())) 
            )){
                alert("Realy busy!!!");
                return;
            }
        }
        // If this time is not busy, for example, we promt to enter Event Title
        var title = prompt('Event Title:');
        if (title) {
           //............Adding event into calendar
        }
        calendar.fullCalendar('unselect');
    },
    // c) and d)
    // This is invoked when we navigate throw the month callender 
    eventAfterRender: function(event, element, view ){
        $(".booked").removeClass(".booked"); // Remove all booked class from element
        var elements = $(".fc-widget-content:not(.fc-other-month)").filter(function(){
            //We try to find day number witch corresponds to the event date
            return (event.end == null && $(this).find(".fc-day-number").text() == event.start.getDate()) //If we have 1 day event
                || (event.end != null && $(this).find(".fc-day-number").text() >= event.start.getDate() // If we have many day event
                &&  $(this).find(".fc-day-number").text() <= event.end.getDate())
        });
        elements.addClass("booked");
    
        // e)
        // Hide all events related to previous and next months
        // If we event ends in previous month or starts in next we dont show it!
        if(
            (event.end == null && (view.start.getMonth() != event.start.getMonth())) //If we have 1 day event
            || (event.end != null && (view.start.getMonth() > event.end.getMonth() // If we have many day event
            || view.start.getMonth() < event.start.getMonth())) 
    
        ){
            $(element).hide();
        }
    }
    

    编辑这个结构

    var elements = $(".fc-widget-content:not(.fc-other-month)").filter(function(){
        //We try to find day number witch corresponds to the event date
        return (event.end == null && $(this).find(".fc-day-number").text() == event.start.getDate()) //If we have 1 day event
            || (event.end != null && $(this).find(".fc-day-number").text() >= event.start.getDate() // If we have many day event
            &&  $(this).find(".fc-day-number").text() <= event.end.getDate())
    });
    

    表示我们选择满足filter条件(return true)的当月天数(:not(.fc-other-month)):当月天数等于事件天数

    关于你的代码,我说你必须删除 dayClick 事件,你的选择事件是:

    select: function (startDate, endDate, allDay, jsEvent) {
        // This is my addition //
            var events = calendar.fullCalendar( 'clientEvents' );
            for (var i = 0; events.length > i ; i++){
                //If we have 1 day event
                if((events[i].endDate == null && (events[i].start.getTime() >= startDate.getTime() && events[i].start.getTime() <= endDate.getTime())) ||
                // If we have many days event 
                (events[i].endDate != null && ((events[i].start.getTime() >= startDate.getTime() && events[i].start.getTime() <= endDate.getTime()) || 
                    (events[i].end.getTime() >= startDate.getTime() && events[i].start.getTime() <= endDate.getTime()) || 
                    (events[i].start.getTime() <= startDate.getTime() && events[i].end.getTime() >= endDate.getTime())) 
                )){
                    alert('Sorry this date is already taken');
                    return;
                }
            }
    
            // /This is my addition //      
        console.dir(jsEvent);
        if (liveDate > startDate) {
            alert('This date has been passed');
            return false;
        } else {
            var title = prompt('New Charges:');
            if (title) {
                calendar.fullCalendar('renderEvent', {
                            title: title,
                            start: startDate,
                            end: endDate,
                            allDay: allDay
                        }, false // make the event "unstick"
                        );
                        var startDateString = $.fullCalendar.formatDate(startDate, 'yyyy-MM-dd');
                        var endDateString = $.fullCalendar.formatDate(endDate, 'yyyy-MM-dd');
                        $.ajax({
                            type: 'POST',
                            url: './new_event.php?action=add',
                            data: {
                                startDate: startDateString,
                                endDate: endDateString,
                                eventTitle: title,
                                propID: propID
                            },
                            dateType: 'json',
                            success: function (resp) {
                                calendar.fullCalendar('refetchEvents');
                            }
                        });
                    } // end of inner if
                } // end of else
                calendar.fullCalendar('unselect');
    },
    

    关于viewDisplay 每次我们去上个月或下个月时都会触发它,它会在eventAfterRender之后触发。如果我们使用eventAfterRender 并在没有事件的情况下进入月份,我们将没有效果。空闲单元保持预订状态。 我在viewDisplay提供当月分析事件:

    function viewCalDisplay(view) {
    
    //...................
    // Your code
    
                $(".booked").removeClass("booked"); // Remove all booked class from element
                var events = view.calendar.clientEvents(function(event){  
                    //we need only events of current month
                    return event.start.getMonth() == view.start.getMonth(); 
    
                } );
    
                for(i = 0; events.length > i; i++){
                    var event = events[i];
                    // We need only days of current month. We select <td> of calender table (by class .ui-widget-content)
                    var elements = $(".ui-widget-content:not(.fc-other-month)").filter(function(){
                        //We try to find day number witch corresponds to the event date
                        return (event.end == null && $(this).find(".fc-day-number").text() == event.start.getDate()) //If we have 1 day event
                            || (event.end != null && $(this).find(".fc-day-number").text() >= event.start.getDate() // If we have many day event
                            &&  $(this).find(".fc-day-number").text() <= event.end.getDate())
                    });
    
                    elements.addClass("booked"); //Only for this <td> 
                }
    }
    

    【讨论】:

    • 我已经给出了我的问题中的所有代码..请你看看这个
    • +1,这将像魅力一样工作:),if 中的 return 条件令人困惑eventAfterRender ??你能告诉我这是什么意思吗??我的日历上都有多天和单天的活动
    • 我不想拖动和调整事件大小,即使我设置了event.disableDragging = true;event.disableResizing = true;,但它仍然可以拖动和调整大小:(
    • 我认为在你的情况下使用viewDisplay事件的更好方法是eventAfterRender,因为它每次在你进入下一个/上一个monse时都会触发。 eventAfterRender 活动仅在本月至少有一个活动时有效。
    • 我注意到viewDisplay 只渲染一次,而您建议的eventAfterRender 工作正常。但bookedClass 仍会添加到下个月的同一位置。两种方法我都写了,可以吗??这是我的complete code。请查看并建议如何改进。
    【解决方案2】:

    a) 我希望某个日期只允许一个事件。

    如果我们解决了问题 B,这个问题会得到解决吗?我的意思是我认为你在 dayClick 回调中得到了它,对吧? alert('Sorry this date is already taken');

    b) 如果一天已经有事件,我如何停止进一步传播?

    您是否尝试在回调中return false?还是不能只使用eventClick 回调?据我所知,它更符合您的需求。

    c) eventRender() 方法在初始化日历时只调用一次 或者每次我们去prevnext月份的时候?

    docs 说:

    在渲染事件时触发。

    所以,我假设每次你去下个月和上个月时都会调用它。

    e) 如何隐藏与前几个月相关的所有事件?

    我认为您可以使用eventRender 回调来决定是否应该呈现该事件? (在这个回调上返回 false 将阻止事件被渲染。)

    【讨论】:

    • b)我有用户 return false;DayClickEventClick() 同时触发
    • c) 它没有像你提到的那样被调用,它只是第一次将所有自定义类设置为每个日期块(div,td)(即当前月份显示)
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2017-02-27
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多