即使我使用 post 方法,此刀片页面也会在表单提交后不断重新加载

问题描述 投票:0回答:1

我正在尝试创建一个功能,以方便生成考试时间表。我的课程和讲师表工作正常,但生成时间表的功能似乎不起作用。系统应该生成 pdf 格式的时间表,以便打印或下载。我尝试使用 dd() 进行调试,但没有任何效果。

这是刀片文件的内容

@extends('layouts.guest')
@include('user.sidebar')
<main class="main-content position-relative max-height-vh-100 h-100 mt-1 border-radius-lg">
    @include('user.topmenu')
    @if(Session::has('success'))
    <div class="alert alert-success">
        {{ Session::get('success') }}
    </div>
    @endif
    @yield('content')

    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">Generate Timetable</div>

                    <div class="card-body">
                        <form action="{{ route('generate.timetable') }}" method="POST">
                            @csrf
                            @method('POST')
                            <div class="form-group">
                                <label for="start">Select Exams Start Date:</label>
                                <input type="date" name="start" class="form-control @error('start') is-invalid @enderror">
                                @error('start')
                                    <div class="invalid-feedback">{{ $message }}</div>
                                @enderror
                            </div>
                            
                            <div class="form-group">
                                <label for="end">Select Exams End Date:</label>
                                <input type="date" name="end"
                             
                            class="form-control @error('end') is-invalid @enderror">
                                @error('end')
                                    <div
                             
                            class="invalid-feedback">{{ $message }}</div>
                                @enderror
                            </div>
                            <div
 
class="form-group">
    <label for="venues">Exam Venues (separated by comma):</label>
    <input type="text"  name="venues" class="form-control @error('venues.*') is-invalid @enderror" data-role="tagsinput">
    @error('venues.*')
        <div class="invalid-feedback">{{ $message }}</div>
    @enderror
</div>

<div class="form-group">
    <label for="timestart">Select Exams Start Time:</label>
    <input type="time" name="timestart"  class="form-control @error('timestart') is-invalid @enderror" >
    @error('timestart')
        <div class="invalid-feedback">{{ $message }}</div>
    @enderror 
</div>

<div class="form-group">
    <label for="timeend">Select Exams End Time:</label>
    <input type="time" name="timeend" class="form-control @error('timeend') is-invalid @enderror">
    @error('timeend')
        <div class="invalid-feedback">{{ $message }}</div>
    @enderror
</div>
                        
                            <button type="submit" class="btn btn-primary">Generate Timetable</button>
                        </form>
                        
                    </div>
                </div>
            </div>
        </div>
    </div>
</main>

现在这是处理它的控制器

<?php

namespace App\Http\Controllers;

use App\Models\Course;
use App\Models\User;
use App\Models\Faculty;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Session;
use PDF;

class FacultyController extends Controller
{
    public function index()
    {
        return view('user.timetable');
    }

    public function generateTimetable(Request $request)
    {
        $request->validate([
            'start' => 'required|date',
            'end' => 'required|date|after:start',
            'venues' => 'required|array',
            'venues.*' => 'required|string',
            'timestart' => 'required|date_format:H:i',
            'timeend' => 'required|date_format:H:i|after:timestart',
        ]);

        // Get the selected deadline for exams
        $startDate = $request->input('start');
        $endDate = $request->input('end');
        $venues = $request->input('venues');
        $deadline = $endDate; // Use the end date as the deadline

        // Get the authenticated user
        $user = auth()->user();

        // Fetch all courses related to the authenticated user
        $courses = Course::where('user_id', $user->id)->get();

        // Generate timetable data
        $timetable = [];

        foreach ($courses as $course) {
            // Fetch the two attached lecturers for the course
            $lecturers = $course->lecturers()->take(2)->get();

            // Fetch a random third lecturer from other users
            $thirdLecturer = User::whereNotNull('lecturers')
                ->whereNotIn('id', $lecturers->pluck('id'))
                ->inRandomOrder()
                ->first();

            // Attach the third lecturer to the course
            $lecturers[] = $thirdLecturer;

            // Generate exam date within the selected deadline
            $examDate = $this->generateExamDate($startDate, $endDate);

            // Generate exam time between the selected start and end time
            $examTime = $this->generateExamTime($request->input('timestart'), $request->input('timeend'));

            // Generate a venue for the exam
            $venue = $request->input('venues')[array_rand($venues)];

            // Create a timetable entry for the course
            $timetableItem = [
                'time' => $examTime,
                'course_name' => $course->name,
                'course_code' => $course->code,
                'invigilators' => $lecturers->pluck('name')->implode(', '),
                'venue' => $venue,
                'date' => $examDate,
            ];

            $timetable[] = $timetableItem;
        }

        // Store timetable data in session
        Session::put('timetable', $timetable);

        // Redirect to timetable-preview page
        return redirect()->route('timetable-preview');
    }

    public function timetablePreview()
    {
        // Retrieve timetable data from the session
        $timetable = session('timetable');

        return view('user.timetable-preview', compact('timetable'));
    }

    private function generateExamDate($startDate, $endDate)
    {
        $startTimestamp = strtotime($startDate);
        $endTimestamp = strtotime($endDate);

        // Calculate the number of days between the start and end date
        $days = ($endTimestamp - $startTimestamp) / (60 * 60 * 24);

        // Generate a random date within the selected start and end date
        $date = date('Y-m-d', strtotime("+$days days", $startTimestamp));

        // Ensure the generated date falls on a weekday (Monday to Friday)
        while (date('N', strtotime($date)) >= 6) {
            $date = date('Y-m-d', strtotime("+1 day", strtotime($date)));
        }

        return $date;
    }

    private function generateExamTime($startTime, $endTime)
    {
        // Generate a random time between the given start and end time
        $startTimestamp = strtotime($startTime);
        $endTimestamp = strtotime($endTime);

        $timestamp = rand($startTimestamp, $endTimestamp);
        $time = date('H:i', $timestamp);

        return $time;
    }
}

这是路线

Route::post('generatetimetable', [FacultyController::class, 'generateTimetable'])->name('generate.timetable');

Route::get('/timetable-preview', [FacultyController::class, 'timetablePreview'])->name('timetable-preview');
php laravel laravel-blade laravel-10
1个回答
0
投票

为了防止页面重新加载,在函数结束时,您必须返回文件而不是路线名称

return redirect()->route('timetable-preview');

© www.soinside.com 2019 - 2024. All rights reserved.