diff --git a/app/Http/Controllers/Admin/TestController.php b/app/Http/Controllers/Admin/TestController.php new file mode 100755 index 0000000..9e76d97 --- /dev/null +++ b/app/Http/Controllers/Admin/TestController.php @@ -0,0 +1,111 @@ +middleware('auth'); + } + + public function index(Course $course) + { + Gate::authorize('viewAny', Test::class); + + $tests = $course->tests()->withCount('questions')->orderBy('created_at', 'desc')->get(); + + return view('admin.tests.index', compact('course', 'tests')); + } + + public function create(Course $course) + { + Gate::authorize('create', Test::class); + + return view('admin.tests.create', compact('course')); + } + + public function store(Request $request, Course $course) + { + Gate::authorize('create', Test::class); + + $validated = $request->validate([ + 'title' => 'required|string|max:255', + 'description' => 'nullable|string', + 'type' => 'required|in:probationary,final,intermediate', + 'time_limit_minutes' => 'nullable|integer|min:1', + 'passing_score' => 'nullable|integer|min:0|max:100', + 'max_attempts' => 'nullable|integer|min:1', + 'shuffle_questions' => 'boolean', + 'show_correct_answers' => 'boolean', + 'is_active' => 'boolean', + ]); + + $validated['is_active'] = $request->boolean('is_active'); + $validated['shuffle_questions'] = $request->boolean('shuffle_questions'); + $validated['show_correct_answers'] = $request->boolean('show_correct_answers'); + + $course->tests()->create($validated); + + return redirect()->route('admin.courses.tests.index', $course) + ->with('success', 'Тест успешно создан.'); + } + + public function show(Course $course, Test $test) + { + Gate::authorize('view', $test); + + $test->load(['questions.answers', 'questions.matchingPairs']); + + return view('admin.tests.show', compact('course', 'test')); + } + + public function edit(Course $course, Test $test) + { + Gate::authorize('update', $test); + + return view('admin.tests.edit', compact('course', 'test')); + } + + public function update(Request $request, Course $course, Test $test) + { + Gate::authorize('update', $test); + + $validated = $request->validate([ + 'title' => 'required|string|max:255', + 'description' => 'nullable|string', + 'type' => 'required|in:probationary,final,intermediate', + 'time_limit_minutes' => 'nullable|integer|min:1', + 'passing_score' => 'nullable|integer|min:0|max:100', + 'max_attempts' => 'nullable|integer|min:1', + 'shuffle_questions' => 'boolean', + 'show_correct_answers' => 'boolean', + 'is_active' => 'boolean', + ]); + + $validated['is_active'] = $request->boolean('is_active'); + $validated['shuffle_questions'] = $request->boolean('shuffle_questions'); + $validated['show_correct_answers'] = $request->boolean('show_correct_answers'); + + $test->update($validated); + + return redirect()->route('admin.courses.tests.show', [$course, $test]) + ->with('success', 'Тест успешно обновлён.'); + } + + public function destroy(Course $course, Test $test) + { + Gate::authorize('delete', $test); + + $test->delete(); + + return redirect()->route('admin.courses.tests.index', $course) + ->with('success', 'Тест успешно удалён.'); + } +} diff --git a/resources/views/admin/courses/show.blade.php b/resources/views/admin/courses/show.blade.php index 4e3ae70..433bb31 100644 --- a/resources/views/admin/courses/show.blade.php +++ b/resources/views/admin/courses/show.blade.php @@ -62,7 +62,10 @@
-
Тесты
+
+
Тесты
+ +
@if($course->tests->count() > 0)
    @foreach($course->tests as $test)
  • {{ $test->title }}{{ $test->type }}
  • @endforeach
@else

Нет тестов

@endif diff --git a/resources/views/admin/tests/create.blade.php b/resources/views/admin/tests/create.blade.php new file mode 100644 index 0000000..16e76a0 --- /dev/null +++ b/resources/views/admin/tests/create.blade.php @@ -0,0 +1,76 @@ +@extends('layouts.app') +@section('title', 'Добавить тест') +@section('content') +
+
+ +
+
+

Добавить тест

+ Назад +
+
+ @csrf +
+
+
+
+
+ + + @error('title')
{{ $message }}
@enderror +
+
+ + +
+
+
+
+
+
+
+
Настройки
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + Отмена +
+
+
+
+@endsection diff --git a/resources/views/admin/tests/index.blade.php b/resources/views/admin/tests/index.blade.php new file mode 100644 index 0000000..fd2f368 --- /dev/null +++ b/resources/views/admin/tests/index.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.app') +@section('title', 'Тесты курса') +@section('content') +
+
+ +
+
+

Тесты: {{ $course->title }}

+ Добавить тест +
+ @if(session('success'))
{{ session('success') }}
@endif + + + +
+
+
+ @forelse($tests as $test) +
+
+
+
{{ $test->title }}
+

{{ Str::limit($test->description, 80) }}

+
+ {{ $test->type }} + {{ $test->questions_count }} вопросов + @if($test->time_limit_minutes){{ $test->time_limit_minutes }} мин@endif +
+ Проходной балл: {{ $test->passing_score }}% +
+ +
+
+ @empty +

Тестов пока нет

+ @endforelse +
+
+
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index a377474..21e3034 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,8 @@ use App\Http\Controllers\Admin\GroupController; use App\Http\Controllers\Admin\UserController; use App\Http\Controllers\Admin\CourseCategoryController; use App\Http\Controllers\Admin\CourseController; +use App\Http\Controllers\Admin\TestController; +use App\Http\Controllers\Admin\QuestionController; use App\Http\Controllers\DashboardController; use Illuminate\Support\Facades\Route; @@ -42,5 +44,6 @@ Route::middleware('auth')->group(function () { Route::resource('users', UserController::class); Route::resource('course-categories', CourseCategoryController::class); Route::resource('courses', CourseController::class); + Route::resource('courses.tests', TestController::class)->shallow(); }); });