使用fullcalendar重复发生的事件和非重复事件
events: [

     {
      id: '<?php echo $event['id']; ?>',
      title: '<?php echo $event['title']; ?>',
      color: '<?php echo $event['color']; ?>',
      start: '<?php echo $start; ?>',
      end: '<?php echo $end; ?>',
      dow: '<?php echo $dow; ?>',
      ranges: [{
                 start: '<?php echo $start; ?>', 
                 end: '<?php echo $end; ?>',
               }]
      },
]

Following image below shows my current status of my calendar: Calendar

As seen from the image above, the cardio training has been recurring non-stop. Is there a way to stop the recurring event based on the end date in ranges, other than using event render function?

Take note: <?php echo $start; ?> and <?php echo $end; ?> is a date formatted in YYYY-MM-DD.

UPDATED after attempting ADyson's solution: updatedCalendar

   <?php foreach ($events as $event): ..... ?> 
{
      id: '<?php echo $event['id']; ?>',
      title: '<?php echo $event['title']; ?>',
      color: '<?php echo $event['color']; ?>',
      start: '04:00',
      end: '05:00',
      dow: '<?php echo $dow; ?>',
      ranges: [{
                 start: '<?php echo $start; ?>', 
                 end: '<?php echo $end; ?>',
               }]
}, 
{
      id: '<?php echo $event['id']; ?>',
      title: '<?php echo $event['title']; ?>',
      color: '<?php echo $event['color']; ?>',
      start: '<?php echo $start; ?>',
      end: '<?php echo $end; ?>',
} <?php endforeach; ?>

data

Apparently, it went into recurring and non-recurring event objects due to they are in the foreach loop.

SOLUTION

events:[
    <?php 
    inside the foreach loop:
    ..........
     if ($dow == "") {
        ?>
        {
          id: '<?php echo $event['id']; ?>',
          title: '<?php echo $event['title']; ?>',
          color: '<?php echo $event['color']; ?>',
          start: '<?php echo $start; ?>',
          end: '<?php echo $end; ?>',
        },
 <?php }
       else {?>
        {
          id: '<?php echo $event['id']; ?>',
          title: '<?php echo $event['title']; ?>',
          color: '<?php echo $event['color']; ?>',
          start: '04:00',
          end: '05:00',
          dow: '<?php echo $dow; ?>',
          ranges: [{
                     start: '<?php echo $start; ?>', 
                     end: '<?php echo $end; ?>',
                   }]
       },
   <?php } ?>
<?php endforeach; ?>
doutouhe5343
doutouhe5343 ADyson,我已经重新更新了我的帖子。请看看。我删除了我的事件渲染功能,以便一天的事件能够在我的日历中显示。但是,我的重复活动(有氧训练)无法在结束日期停止。有氧训练活动将在星期一和星期二不间断地重复进行。
接近 3 年之前 回复
dongshadu2546
dongshadu2546 你可以更新问题中的代码来显示你当前的版本吗?然后我可以尝试重现你的问题。
接近 3 年之前 回复
douyin8623
douyin8623 我的日期格式实际上是'-'而不是'/'。我添加了你建议的内容来检查是否定义了event.ranges。日历仅显示重复活动。我希望那些不需要再次出现的一天活动也会在日历中显示出来。
接近 3 年之前 回复
dongzhila3786
dongzhila3786 你做了我建议的日期格式吗?如果您从(否则可接受的)事件对象中省略range属性,您将收到控制台错误,因为范围将是未定义的-除非您还删除了eventRender代码。但是,如果删除eventRender代码,您也将无法获得其他重复发生的事件。而是执行我上面建议的-更改$start和$end中使用的日期格式,并更改eventRender,以便在继续之前检查是否定义了event.ranges。
接近 3 年之前 回复
dqt83336
dqt83336 不,我没有任何JS错误。我希望在我的日历中出现重复出现的事件和非经常性事件(即那些为期一天的事件)。但是,我现在只能让其中一个出现在我的日历中。
接近 3 年之前 回复
dosc9472
dosc9472 尝试YYYY-MM-DD(而不是/)开始。请参阅momentjs.com/docs/#/parsing/string,其中显示了解析日期所支持的ISO格式(fullCalendar使用了momentJS)。除此之外,没有理由你不能这样做。您还可能需要稍微修改eventRender函数以在尝试使用它之前检查event.ranges是否实际存在。否则,您将在控制台中收到JS错误
接近 3 年之前 回复

1个回答

What you want is perfectly possible. As I mentioned in the comments, all you have to do is modify the eventRender function to check whether the "ranges" property exists on the event being rendered. If it does, then apply the recurrence rules defined by the ranges. If not, then just allow it to render normally with no interference:

eventRender: function(event) {
  //only apply recurrence rules if the event has a "ranges" property
  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 it isn't in one of the ranges, don't render it (by returning false)
  } else {
    return true; //just allow the event to render normally if it's not recurring
  }
}

For this to work, your events can have the following structures:

Non-recurring example:

{
  title: 'Non Recurring Event',
  start: "2017-10-03T10:30:00",
  end: "2017-10-03T11:30:00",
  allDay: false
}

Recurring example:

{
  id: 1,
  title: "Recurring Event",
  start: "10:00",
  end: "12:00",
  dow: [1,3,4],
  ranges: [{
      start: "2017-10-01T09:30:00",
      end: "2017-10-04T15:30:00"
    }, {
      start: 2017-10-05T10:00:00",
      end: 2017-10-15T13:30:00"
    }]
}

See a working demo here, containing both recurring and non-recurring events: http://jsfiddle.net/sbxpv25p/27/

douzi6992
douzi6992 谢谢你指出。 我试图减少重复次数,但它不起作用。 我想我是以错误的方式做到的。 我试图在json中定义if语句然后声明dow和范围。
接近 3 年之前 回复
dsgixl5195
dsgixl5195 那更好。 只是一件小事,$ recur =“”; 是完全多余的 - 你在reur已经有这个值的情况下这样做了。 所以这行没什么用处,你可以删除它。 而且您不需要重复代码来定义id,title和color属性,因为无论recur的值是什么,它们都是相同的。 您可以在if语句之外定义它们(以及{}以开始/结束JSON事件)。 这使得您的代码重复性更低,更易于理解,并且更易于维护(因为对该位的更改只需要执行一次)。
接近 3 年之前 回复
dongpi9164
dongpi9164 我再次发布了我的解决方案,谢谢你的帮助
接近 3 年之前 回复
dqzuo0327
dqzuo0327 没问题,很高兴你修好了。 但你需要在逻辑上变得更强大......这几乎是整个编程事项的关键:-)
接近 3 年之前 回复
doumeng06063991
doumeng06063991 没关系,它有效。 我明白我在做什么,好吧。 只是我的逻辑不够强大,信不信由你~~谢谢你的帮助:)
接近 3 年之前 回复
douquan1953
douquan1953 那你为什么不在你之前给我的代码中显示出来呢? 无论如何,那段代码毫无意义。 你怎么处理这个$ recur值? 根据上面的代码片段,再次将其删除,对任何事情都没有任何影响。 您需要使用它来决定要输出哪些事件数据位。 $ recur实际上包含什么? 它是布尔值(true / false)还是字符串? 还是一个数字? 有什么可能的价值观? 一旦我们知道了,我们就可以创建一个if语句来决定是否添加重复属性。
接近 3 年之前 回复
duanmu5641
duanmu5641 雅。 所以在foreach循环中,我实际上做了$ recur = $ event ['recur']; //如果没有复发if($ recur ==“”){$ recur =“”; 但无论有没有,它都没有任何区别。
接近 3 年之前 回复
duanguoping2016
duanguoping2016 通过查看循环,它立即显而易见地显示它为数据库中的每个$事件生成一个非重复事件和一个重复事件。 每次都会得到一个。 我认为这不是你想要的。 当然你需要使用$ event中的一些信息来决定它是否经常发生? 我无法想象您是如何认为每次以两种格式打印事件都会起作用? 我有点担心,你是否真的从基本层面上了解你的代码在做什么?
接近 3 年之前 回复
doubijiao2094
doubijiao2094 我编辑了我的帖子。 请看看。
接近 3 年之前 回复
dongyi2159
dongyi2159 你必须真正向我展示确切的代码。 问题可能在某个地方的循环内。 但就像我说的那样,寻找一些代码,这些代码会意外地将dow和/或范围属性添加到不应该有它们的事件中。 您还可以查看最终的事件数据输出(在您的浏览器中的页面源代码中,我认为)以确认这是正在发生的事情。
接近 3 年之前 回复
doushengyou2617
doushengyou2617 它是一个foreach循环。 它在事件对象中。 目的是从数据库中检索。 <?php foreach($ events as $ event):.....?> {with recurring and non recurring example} <?php endforeach; ?>
接近 3 年之前 回复
douyong1908
douyong1908 你是什​​么意思“在for循环中”? 这个循环在哪里?它的目的是什么? 我猜这是你用来生成事件的一些代码。 在没有看到它的情况下,我无法给出任何特别的建议,但我认为你有某种逻辑错误,即在非重复事件不应该的情况下,将范围或其他重复数据(例如dow)添加到非重复事件中。
接近 3 年之前 回复
du8589840
du8589840 有什么方法可以解决这个问题吗?
接近 3 年之前 回复
dqitk20644
dqitk20644 有用! 非常感谢。 但现在有一个小问题。 由于我的非经常性和反复出现的事件处于for循环中。 因此,我的一系列日期的非经常性事件也会受到影响。 我将使用最新的图片更新我的帖子,以显示它现在的样子。
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问