You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8中如何将FullCalendar点击事件获取的JavaScript变量传回PHP作为数组索引

解决Laravel 8中FullCalendar点击事件传递JS变量到PHP获取详情的问题

首先得明确你之前的尝试为什么失败:PHP是服务器端语言,在页面加载时就已经执行完毕并生成HTML发送给浏览器了;而JavaScript是客户端语言,只有页面加载完成后才会执行。你试图把JS变量直接嵌到PHP代码里,这时候PHP执行时event_data这个JS变量还没生成,自然拿不到值——两者的执行顺序是反的,不能直接这么交互。

下面给你两种可行的解决方案,根据你的数据量选择:

方案一:提前把所有事件详情存入JS对象(适合数据量不大的场景)

这种方式不需要额外请求后端,直接在页面渲染时把所有事件的详情数据同步到JS数组里,点击事件时直接从JS里取数据填充模态框,简单高效。

步骤1:渲染FullCalendar事件的同时,同步生成详情JS数组

在你的FullCalendar配置代码上方,先定义一个JS数组存储所有事件的详情:

// 提前存储所有事件的详情数据
var eventDetails = [
    @foreach($events as $event)
    {
        first_name: '{{$event->patientInfo->first_name}}',
        phone: '{{$event->patientInfo->phone}}',
        treatment: '{{$event->patientTreatment->treatment}}',
        service: '{{$event->patientService->service}}',
        // 按需添加其他需要展示的关联字段
    },
    @endforeach
];

// 你的FullCalendar原配置
document.addEventListener('DOMContentLoaded', function() {
    var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
        // ...其他配置
        events:[ 
            @foreach($events as $event) 
            { 
                id: '{{$loop->index}}', // 保持原索引,对应eventDetails的下标
                title: '{{$event->patientInfo->first_name}} - {{$event->patientTreatment->treatment}} - {{$event->patientService->service}}', 
                start: '{{$event->appointment}}', 
                resourceId: '{{$event->id}}', 
                color: '{{$event->branches->text_color}}', 
            }, 
            @endforeach 
        ],
        eventClick: function(info) {
            var eventIndex = info.event.id; // 获取之前存的loop索引
            var details = eventDetails[eventIndex]; // 从JS数组里取对应详情

            // 构建模态框内容(这里用Bootstrap模态框为例,你也可以替换成自己的dialog组件)
            var modalContent = `
                <div class="modal-header">
                    <h5 class="modal-title">Event Details</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p><strong>Patient Name:</strong> ${details.first_name}</p>
                    <p><strong>Phone:</strong> ${details.phone}</p>
                    <p><strong>Treatment:</strong> ${details.treatment}</p>
                    <p><strong>Service:</strong> ${details.service}</p>
                </div>
            `;

            // 填充模态框并显示
            $('#eventModal .modal-content').html(modalContent);
            $('#eventModal').modal('show');
        }
    });
    calendar.render();
});

步骤2:在HTML中添加模态框结构

在页面的合适位置(比如body末尾)添加Bootstrap模态框的基础结构:

<div class="modal fade" id="eventModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <!-- 内容会通过JS动态填充 -->
        </div>
    </div>
</div>

方案二:通过AJAX请求后端接口(适合数据量大的场景)

如果不想把所有事件详情都提前传到前端,可以点击事件时通过AJAX把事件的实际ID(不是loop索引)传给后端接口,后端返回对应详情后再渲染模态框。

步骤1:定义后端路由和控制器方法

在routes/web.php中添加路由:

Route::get('/event-details/{event}', [App\Http\Controllers\EventController::class, 'showDetails'])->name('event.details');

在对应的控制器(比如EventController.php)中添加方法:

public function showDetails(App\Models\Event $event)
{
    // 预加载关联模型,避免N+1查询问题
    $event->load(['patientInfo', 'patientTreatment', 'patientService']);

    // 返回JSON格式的详情数据
    return response()->json([
        'first_name' => $event->patientInfo->first_name,
        'phone' => $event->patientInfo->phone,
        'treatment' => $event->patientTreatment->treatment,
        'service' => $event->patientService->service,
        // 其他需要的字段
    ]);
}

步骤2:前端通过AJAX请求并渲染模态框

修改FullCalendar的eventClick事件:

eventClick: function(info) {
    var eventId = info.event.resourceId; // 这里用事件的实际ID(对应$event->id)
    $.ajax({
        url: `/event-details/${eventId}`,
        method: 'GET',
        success: function(response) {
            // 构建模态框内容
            var modalContent = `
                <div class="modal-header">
                    <h5 class="modal-title">Event Details</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p><strong>Patient Name:</strong> ${response.first_name}</p>
                    <p><strong>Phone:</strong> ${response.phone}</p>
                    <p><strong>Treatment:</strong> ${response.treatment}</p>
                    <p><strong>Service:</strong> ${response.service}</p>
                </div>
            `;
            $('#eventModal .modal-content').html(modalContent);
            $('#eventModal').modal('show');
        },
        error: function() {
            alert('Failed to load event details. Please try again later.');
        }
    });
}

同样需要添加方案一中的模态框HTML结构。

内容的提问来源于stack exchange,提问作者Kanister21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:17:38