所以我使用 Yii 和完整的日历作为在 CalendarController 视图中调用的小部件。在调用小部件时,小部件从数据库中检索现有事件并将它们放入完整的日历中以显示。现在我还制作了一个简单的过滤器,用于按类别过滤事件(带有提交的下拉列表),所以我想将请求发送到一个名为 actionEvents() 的 calendarController 方法,然后该方法将传递给它的内容(类别我们要检索事件的事件),将它们返回给 jQuery,然后再次调用日历,将所需属性的 json_encode(d) 数组传递给它,以正确呈现下拉列表中所选类别下的事件。我遇到的问题是,由于某种原因,fullcalendar 似乎正在执行我想要的调用( POST )以及另一个 GET 调用,因此它确实从控制器的方法将格式正确的 json 返回到 jQuery,但只显示了一个返回时没有事件的空日历。这是返回数据后控制台的样子。
这是调用ajax调用的代码
$(document).ready(function() {
var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();
$('form.eventFilter').submit(function() {
var selectedOption = $('form.eventFilter select').val(),
eventContainer = $('.fc-event-container');
var objectToSend = { "categories" : [selectedOption],"datefrom" : "september2013"/*month + "" + year*/ , "dateto" : "september2013"/*month + "" + year*/};
$.ajax({
url: '<?php echo Yii::app()->createUrl('calendar/events'); ?>',
type: "POST",
async:false,
data: {data : JSON.stringify(objectToSend)},
success: function(data) {
$('#fc_calendar').html('');
$('#fc_calendar').fullCalendar({
events: data
});
console.log(data);
},
error: function() {
console.log(data);
}
});
return false;
})
})
在第一页加载(打开)时呈现初始日历事件的代码是这样的
<div id="fc_calendar"></div>
<script class="fc_calendar_script">
// gets calendar and its events working and shown
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
$('#fc_calendar').fullCalendar({
header: {
left: 'prev,next today',
center: 'title',
right: 'month,basicWeek,basicDay'
},
editable: true,
events: [
<?php foreach ($eventItems as $event): ?>
{
title: '<?php echo htmlentities($event['eventItems']['title']); ?>',
start: new Date(y,m,d + <?php echo $event['eventItems']['startdate_day_difference']; ?>),
end: new Date(y,m,d + <?php echo $event['eventItems']['enddate_day_difference']; ?>),
url: '<?php echo $event['eventItems']['url']; ?>',
className: [
<?php foreach($event['eventCategories'] as $category) { echo ''.json_encode($category['slug']).','; }?> // and categories slugs as classnames, same purpose
]
},
<?php endforeach; ?>
]
});
</script>
控制器中的代码并不那么重要,因为您可以在屏幕截图中看到它返回的内容 :) 如果有人知道如何解决这个问题,我将不胜感激 :) 尝试了我所知道的一切
好的,所以赏金给回答这个问题的人:) 当返回 ajax 数据并填充事件时,我遇到了完整日历月渲染的问题。由于我对每个类别都有复选框(事件与类别有 MANY_MANY 关系),并且每次选中或取消选中复选框时,所选事件类别的 JSON 数组都会传递给 PHP 方法,该方法会查询数据库中选择的类别下的所有事件和将 jquery 编码数组中的所有事件返回到视图,然后视图获取该事件数组并重新呈现日历,如上面的代码所示。问题是,当检查或未选中复选框并且Ajax返回日历时始终在当月渲染(因此,现在始终将始终归还9月份的事件,直到本月结束,然后始终为OCBOBER等待), 但是如果用户在 2013 年 11 月检查他想要过滤事件的事件类别时会怎样?日历仍将在 9 月重新呈现。当用户选中/取消选中复选框时,如何让它在用户所在的月份重新呈现?
当单击上一个或下个月按钮时,我拥有的跟踪(或至少应该跟踪)当前月份的代码是这个
$('.fc-button-next span').click(function(){
start = $('#fc_calendar').fullCalendar('getView').visEnd;
console.log(start);
});
$('.fc-button-prev span').click(function(){
start = $('#fc_calendar').fullCalendar('getView').visStart;
console.log(start);
});
但是这段代码没有正确跟踪,有时它会跳过一个月,有时它会在一个月内保持不变,有时它会返回适当的月份,这让我很烦恼,所以我无法正确调用日历的这个函数,它应该将日历设置为适当的月份重新渲染。
$('#fc_calendar').fullCalendar('gotoDate', start);