【问题标题】:Display events from my DB in FullCalendar 4在 FullCalendar 4 中显示来自我的数据库的事件
【发布时间】:2020-02-25 22:29:23
【问题描述】:

我正在尝试在 Laravel 5.2 应用程序的完整日历 4 页面上从我的 MySQL 数据库导入数据。

我的文件 Calendar.js:

import { Calendar } from '@fullcalendar/core';
import interactionPlugin from '@fullcalendar/interaction';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import frLocale from '@fullcalendar/core/locales/fr';
import bootstrapPlugin from '@fullcalendar/bootstrap';

document.addEventListener('DOMContentLoaded', function () {
    var calendarEl = document.getElementById('calendar');

    var calendar = new Calendar(calendarEl, {
        plugins: [interactionPlugin, dayGridPlugin, timeGridPlugin, bootstrapPlugin],
        // height: 'parent',
        aspectRatio: 1.5,
        themeSystem: 'bootstrap',
        locale: frLocale,
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'dayGridMonth,timeGridWeek,timeGridDay'
        },
        navLinks: true, // can click day/week names to navigate views
        editable: true,
        eventLimit: true,// allow "more" link when too many events
        events: 'getEvents',
    });
    calendar.render();
});

这里是Controller页面EventsController中的函数:

public function index(Request $request)
    {
        return view('front.events');
    }

public function getEvents()
    {
        $getEvents = Events::select('coach_id', 'start_date', 'end_date')->get();
        $events = [];

        foreach ($getEvents as $values) {
            $start_date_format = \DateTime::createFromFormat('Y-m-d h:i:s', $values->start_date);
            $end_date_format = \DateTime::createFromFormat('Y-m-d h:i:s', $values->end_date);
            $events ['title'] = $values->coach_id;
            $events ['start'] = $start_date_format->format('c');
            $events ['end'] = $end_date_format->format('c');
        }

        return $events;
    }

日历页面的路线部分:

Route::get('/events', 'EventsController@index')->name('events.index');
Route::get('/getEvents', 'EventsController@getEvents')->name('events.getEvents');

这里是视图 events.twig :

{% extends 'front.layouts.main' %} {% set user = auth_user() %}
{% block css %}
    <link href='https://use.fontawesome.com/releases/v5.0.6/css/all.css' rel='stylesheet'>
{% endblock %}
{% set user = auth_user() %} {% block content %}

    <div class="container mb-5">
        <div class="response"></div>
        <div id='calendar'></div>
    </div>

{% endblock %}

{% block js %}
<script src="{{ asset('js/calendar.js') }}"></script>
{% endblock %}

我可以看到事件 JSON 格式正确(当我加载我的页面 getEvents 时),但我的日历页面中没有出现任何内容。

我的 JSON 是这样的:

{"title":4,"start":"2019-10-23T11:00:00+00:00","end":"2019-10-23T12:00:00+00:00"} 

我使用 JSON lint 对其进行了验证。

【问题讨论】:

  • 我们可以看看 JSON 事件的示例吗?而且,您是否在浏览器的控制台中看到任何错误?还是网络视图中的 Ajax 错误?
  • 我的 JSON 是这样的:{"title":4,"start":"2019-10-23T11:00:00+00:00","end":"2019-10- 23T12:00:00+00:00"} 我用 JSON lint 验证了它。
  • 就这些了吗?即使您只有一个事件,它也必须在一个数组中,以便 fullCalendar 识别它,例如[{"title":4,"start":"2019-10-23T11:00:00+00:00","end":"2019-10-23T12:00:00+00:00"}]
  • 您尝试过什么调试问题?您可以首先使用静态 JSON 数组来检查它是否有效 - 区分 JS 代码中的错误或动态输出的 PHP 生成中的错误
  • @Malkom 好吧,这实际上会揭示一个更大的问题,但你错过了我的意思。即使您的数据库中只有一个事件,您仍然必须将一个数组返回给 fullCalendar。请参阅下面的回答,了解我认为您遇到问题的原因以及解决方法。

标签: php json laravel fullcalendar fullcalendar-4


【解决方案1】:

即使你只有一个事件,它也必须在一个数组中,这样 fullCalendar 才能识别它,例如

[{"title":4,"start":"2019-10-23T11:00:00+00:00","end":"2019-10-23T12:00:00+00:00"}]

但我认为您的 PHP 逻辑是错误的 - 看起来它会循环遍历所有事件,但会继续用循环中下一个事件的值覆盖 $events 变量的属性。因此,即使您的数据库中有 100 个事件,它也始终只输出一个,并且在序列化为 JSON 时始终是单个对象(而不是数组)。我认为您需要像这样更改它:

public function getEvents()
{
    $getEvents = Events::select('coach_id', 'start_date', 'end_date')->get();
    $events = [];

    foreach ($getEvents as $values) {
        $start_date_format = \DateTime::createFromFormat('Y-m-d h:i:s', $values->start_date);
        $end_date_format = \DateTime::createFromFormat('Y-m-d h:i:s', $values->end_date);
        $event = [];
        $event['title'] = $values->coach_id;
        $event['start'] = $start_date_format->format('c');
        $event['end'] = $end_date_format->format('c');
        $events[] = $event;
    }

    return $events;
}

这会在$event 中为数据库中的每条记录创建一个事件,然后在创建后将该新事件记录添加到整个$events 列表中。

【讨论】:

  • 好吧,你是对的!在用 2 个事件进行测试后,我只有最后一个在 muy JSON 中。所以你的解决方案是工作!谢谢@ADyson...非常感谢;)
猜你喜欢
  • 2023-04-04
  • 2019-02-20
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多