FullCalendar、营业时间和日期范围

弗洛里安·托米

在我的项目中,用户可以预订房间。我的房间有disponibility 时间(例如08:00-17:00)。我尝试使用营业时间,但夏季和冬季的 disponibilities 会发生变化。

我还尝试使用具有日期范围的逆背景事件,如这篇文章,但如果我使用 selectConstraint,则不考虑该范围。

最好的办法是将日期范围添加到营业时间,但似乎尚未实施。

有没有人解决我的需求?

谢谢

编辑:这是我的全日历选项

function FCInit(){
        var formatColumn, formatColumnWeek;

        // Entete des colonnes
        if ($(window).width() < 600) {
            formatColumn = 'ddd';
            formatColumnWeek = 'ddd\nDD/MM';
        }
        else {
            formatColumn = 'dddd';
            formatColumnWeek = 'dddd\nDD/MM';
        }

        var fcOpts = {

            header: {                               
                left: 'today,datePickerButton',
                center: 'prev,title,next',
                right: 'month,agendaWeek,agendaDay'
            },

            contentHeight: 'auto',                  
            eventLimit: false,                      
            allDaySlot: true,                       
            slotEventOverlap: false,                    
            nowIndicator: true,                     
            timeFormat: 'H:mm',                     
            columnFormat: formatColumn,             // Format des jours dans l'entete     ddd: Mon  /  ddd M/D : Mon 09/07  /  dddd : MOnday /
            navLinks: true,                         

            eventOverlap: false,                        
            selectable: true,
            selectHelper: true,
            selectOverlap: true,
            selectConstraint:999,
            unselectCancel: '#reservation',
            views: {                                
                week: {
                    columnFormat: formatColumnWeek
                }
            },

            events:[{
                     id:3,
                     title:"R\u00e9serv\u00e9",
                     start:"2017-11-02 08:00",
                     end:"2017-11-02 10:00",
                     overlap:false,
                     color:"#C41305"
            },{
                     id:999,
                     className:"fc-nonbusiness",
                     title:"",
                     start:"08:00",
                     end:"17:00",
                     dow:[4],
                     ranges:[
                        {
                          start:"2017-11-01",
                          end:"2017-11-30"
                        }
                     ],
                     rendering:"inverse-background",
            }],

            /* Ajout de datepicker (nécessite Jquery UI css et js) */
            customButtons: {
                datePickerButton: {
                    text: '',
                    click: function () {

                        var $btnCustom = $('.fc-datePickerButton-button'); // name of custom  button in the generated code
                        $btnCustom.after('<input type="hidden" id="hiddenDate" class="datepicker"/>');

                        $("#hiddenDate").datepicker({
                            flat: true,
                            showOn: "button",
                            dateFormat: "yy-mm-dd",
                            onSelect: function (dateText, inst) {
                                $('#full-calendar').fullCalendar('changeView', 'agendaDay', dateText);
                            }
                        });

                        var $btnDatepicker = $(".ui-datepicker-trigger"); // name of the generated datepicker UI
                        //Below are required for manipulating dynamically created datepicker on custom button click
                        $("#hiddenDate").show().focus().hide();
                        $btnDatepicker.trigger("click"); //dynamically generated button for datepicker when clicked on input textbox
                        $btnDatepicker.hide();
                        $btnDatepicker.remove();
                        $("input.datepicker").not(":first").remove();//dynamically appended every time on custom button click

                    }
                }
            },
            dayRender: function(date, cell){
                if(date.isBefore(new Date())){
                    cell.css('cursor','no-allowed');
                }
            },

            eventRender: function (event, element) {

                if(event.ranges) {
                    return (event.ranges.filter(function (range) { // test event against all the ranges

                        return (event.start.isBefore(range.end) &&
                            event.end.isAfter(range.start));

                    }).length) > 0;
                }

                if(event.rendering === "background"){
                    // Just add some text or html to the event element.
                    element.append("<div class='fc-title'>"+event.title+"</div>");
                }

            },
            dayClick: function(date, jsEvent, view){
                if(date.isSameOrAfter(new Date()) && view.name === 'month'){
                    $('#full-calendar').fullCalendar('changeView', 'agendaWeek', date);
                }
            },
            select: function(start, end, jsEvent, view){
                if(start.isSameOrAfter(new Date()) && view.name !== 'month'){
                    $('#reservation_dateFrom').val(start.format('DD/MM/YYYY HH:mm'));
                    $('#reservation_dateTo').val(end.format('DD/MM/YYYY HH:mm'));
                    $('#reservation').modal('show');
                }else if(start.isBefore(new Date())){
                    alert('Il n\'est pas possible de réserver dans le passé');
                    $('#full-calendar').fullCalendar('unselect');
                }

            }

        };
        $('#full-calendar').fullCalendar(fcOpts);

    };

以及我用于存储数据的 symfony 实体(其中 Horaire 是营业时间的集合):

/*src/AppBundle/Entity/HoraireSalle.php*/

class HoraireSalle
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dateFrom", type="datetime")
     */
    private $dateFrom;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dateTo", type="datetime")
     */
    private $dateTo;

    /**
     * @ORM\ManyToOne(targetEntity="Horaire", inversedBy="salles")
     */
    private $horaire;

    /**
     * @ORM\ManyToOne(targetEntity="Salle", inversedBy="horaires")
     */
    private $salle;
    ...
}
弗洛里安·托米

感谢@ADyson,我或多或少地做我想做的事。这是我的解决方案。

function isAllowed(start, end) {

        var events = $('#full-calendar').fullCalendar('clientEvents', function (event) {
            return event.rendering === 'inverse-background' && event.start && event.end;
        });

        var allow = events.filter(function (event) {
            return (start.isBetween(moment(new Date(event.ranges[0].start)), moment(new Date(event.ranges[0].end)))
                && end.isBetween(moment(new Date(event.ranges[0].start)), moment(new Date(event.ranges[0].end)))
                && start.format("HH:mm") >= event.start.format("HH:mm") && end.format("HH:mm") <= event.end.format("HH:mm")
                && event.dow.indexOf(start.day()) > -1
                && event.dow.indexOf(end.day()) > -1)
        });

        events = $('#full-calendar').fullCalendar('clientEvents', function (event) {
            return event.rendering !== 'inverse-background' && event.start && event.end;
        });


        var overlap = events.filter(function (event) {
            return event.start.isBefore(end) && event.end.isAfter(start);
        });

        if (allow.length && overlap.length == 0) {
            return true;
        }
        return false;
    }

    function FCInit() {
        var formatColumn, formatColumnWeek;

        if ($(window).width() < 600) {
            formatColumn = 'ddd';
            formatColumnWeek = 'ddd\nDD/MM';
        }
        else {
            formatColumn = 'dddd';
            formatColumnWeek = 'dddd\nDD/MM';
        }

        var fcOpts = {
            header: {                               // Ordre des boutons de l'entete
                left: 'today,datePickerButton',
                center: 'prev,title,next',
                right: 'month,agendaWeek,agendaDay'
            },

            contentHeight: 'auto',                  
            eventLimit: false,                      
            allDaySlot: true,                   
            slotEventOverlap: false,            
            nowIndicator: true,                                     
            timeFormat: 'H:mm',                     
            columnFormat: formatColumn,             
            navLinks: true,                                             
            eventOverlap: false,
            selectable: true,
            selectHelper: true,
            {% if businessHours is defined and businessHours is not empty %}
            selectAllow: function (eventInfo) {
                return isAllowed(eventInfo.start, eventInfo.end);
            },
            {% else %}
            selectOverlap: false,
            {% endif %}
            unselectCancel: '#reservation',
            views: {                                
                week: {
                    columnFormat: formatColumnWeek
                }
            },

            events: [{
                 id:3,
                 title:"R\u00e9serv\u00e9",
                 start:"2017-11-02 08:00",
                 end:"2017-11-02 10:00",
                 overlap:false,
                 color:"#C41305"
        },{
                 id:999,
                 className:"fc-nonbusiness",
                 title:"",
                 start:"08:00",
                 end:"17:00",
                 dow:[4],
                 ranges:[
                    {
                      start:"2017-11-01",
                      end:"2017-11-30"
                    }
                 ],
                 rendering:"inverse-background",
                 }],

            /* Ajout de datepicker (nécessite Jquery UI css et js) */
            customButtons: {
                datePickerButton: {
                    text: '',
                    click: function () {

                        var $btnCustom = $('.fc-datePickerButton-button'); // name of custom  button in the generated code
                        $btnCustom.after('<input type="hidden" id="hiddenDate" class="datepicker"/>');

                        $("#hiddenDate").datepicker({
                            flat: true,
                            showOn: "button",
                            dateFormat: "yy-mm-dd",
                            onSelect: function (dateText, inst) {
                                $('#full-calendar').fullCalendar('changeView', 'agendaDay', dateText);
                            }
                        });

                        var $btnDatepicker = $(".ui-datepicker-trigger"); // name of the generated datepicker UI
                        //Below are required for manipulating dynamically created datepicker on custom button click
                        $("#hiddenDate").show().focus().hide();
                        $btnDatepicker.trigger("click"); //dynamically generated button for datepicker when clicked on input textbox
                        $btnDatepicker.hide();
                        $btnDatepicker.remove();
                        $("input.datepicker").not(":first").remove();//dynamically appended every time on custom button click

                    }
                }
            },
            dayRender: function (date, cell) {
                if (date.isBefore(new Date())) {
                    cell.css('cursor', 'no-allowed');
                }
            },

            eventRender: function (event, element, view) {

                if (event.rendering === 'inverse-background' && event.ranges) {
                    return (event.ranges.filter(function (range) { // test event against all the ranges

                        var start = moment(new Date(range.start));
                        var end = moment(new Date(range.end));
                        return (view.start.isSameOrBefore(end) &&
                            view.end.isSameOrAfter(start)) &&
                            view.start.day(event.dow[0]).isBetween(start, end);

                    }).length > 0);
                }

                if (event.rendering === "background") {
                    // Just add some text or html to the event element.
                    $(element).data("title",event.title);
                }

            },
            dayClick: function (date, jsEvent, view) {
                if (date.isSameOrAfter(new Date()) && view.name === 'month') {
                    $('#full-calendar').fullCalendar('changeView', 'agendaWeek', date);
                }
            },
            select: function (start, end, jsEvent, view) {
                if (start.isSameOrAfter(new Date()) && view.name !== 'month') {
                    $('#reservation_dateFrom').val(start.format('DD/MM/YYYY HH:mm'));
                    $('#reservation_dateTo').val(end.format('DD/MM/YYYY HH:mm'));
                    $('#reservation').modal('show');
                } else if (start.isBefore(new Date())) {
                    alert('Il n\'est pas possible de réserver dans le passé');
                    $('#full-calendar').fullCalendar('unselect');
                }

            }

        };
        $('#full-calendar').fullCalendar(fcOpts);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django的营业时间

来自分类Dev

iCalendar营业时间

来自分类Dev

有多个位置的下拉菜单,应显示相应的日期和营业时间

来自分类Dev

Javascript或PHP创建新日期,但仅计算营业时间

来自分类Dev

当营业时间根据R中的日期而变化时,如何计算两个日期之间的营业时间?

来自分类Dev

如何使用HTML和CSS创建“营业时间”列表?

来自分类Dev

营业时间 - DIV 取决于星期几和小时

来自分类Dev

完整的日历营业时间

来自分类Dev

JavaScript商店营业时间

来自分类Dev

设置比实际时间更长的营业时间

来自分类Dev

Kendo UI Scheduler:营业时间?

来自分类Dev

Solr:营业时间,现在开放什么

来自分类Dev

TSQL datediff仅营业时间

来自分类Dev

营业时间超过午夜

来自分类Dev

Rails营业时间查询活动记录

来自分类Dev

返回营业时间,午夜过后

来自分类Dev

Schema.org LocalBusiness营业时间和银行假期/公共假期

来自分类Dev

使用营业时间和假日计算到期日

来自分类Dev

检查商店营业时间 - 比较 String 和 int 时出错

来自分类Dev

当日期差异较大时,如何计算JavaScript中两个日期之间的营业时间?

来自分类Dev

仅从营业时间中减去时间(VB.net)

来自分类Dev

日期之间的DATEDIFF是基于营业时间(上午8点至下午5点)而不是总时数或天数

来自分类Dev

在“开放图”业务对象类型中使用营业时间

来自分类Dev

如何设计营业时间表结构

来自分类Dev

MongoDB-营业时间,按当天排序

来自分类Dev

包含星期几的营业时间的组对象

来自分类Dev

PHP中基于营业时间的OPEN / CLOSED消息

来自分类Dev

资源的营业时间在周末视图中不工作

来自分类Dev

Fullcalendar渲染错误的时间和日期

Related 相关文章

热门标签

归档