diff --git a/app/Http/Controllers/Admin/CourseModuleController.php b/app/Http/Controllers/Admin/CourseModuleController.php new file mode 100755 index 0000000..a01dd82 --- /dev/null +++ b/app/Http/Controllers/Admin/CourseModuleController.php @@ -0,0 +1,100 @@ +middleware('auth'); + } + + public function store(Request $request, Course $course) + { + Gate::authorize('update', $course); + + $validated = $request->validate([ + 'parent_id' => 'nullable|exists:course_modules,id', + 'title' => 'required|string|max:255', + 'type' => 'required|in:section,lesson,video,file,link,test', + 'content' => 'nullable|string', + 'video_url' => 'nullable|url', + 'file_path' => 'nullable|string', + 'external_url' => 'nullable|url', + 'test_id' => 'nullable|exists:tests,id', + 'sort_order' => 'nullable|integer', + 'duration_minutes' => 'nullable|integer', + 'is_required' => 'boolean', + 'is_active' => 'boolean', + ]); + + $validated['course_id'] = $course->id; + $validated['is_required'] = $request->boolean('is_required'); + $validated['is_active'] = $request->boolean('is_active'); + + // Загрузка файла + if ($request->hasFile('file')) { + $validated['file_path'] = $request->file('file')->store('course-files', 'public'); + } + + CourseModule::create($validated); + + return back()->with('success', 'Модуль добавлен'); + } + + public function update(Request $request, Course $course, CourseModule $module) + { + Gate::authorize('update', $course); + + $validated = $request->validate([ + 'title' => 'required|string|max:255', + 'type' => 'required|in:section,lesson,video,file,link,test', + 'content' => 'nullable|string', + 'video_url' => 'nullable|url', + 'external_url' => 'nullable|url', + 'test_id' => 'nullable|exists:tests,id', + 'sort_order' => 'nullable|integer', + 'duration_minutes' => 'nullable|integer', + 'is_required' => 'boolean', + 'is_active' => 'boolean', + ]); + + $validated['is_required'] = $request->boolean('is_required'); + $validated['is_active'] = $request->boolean('is_active'); + + // Загрузка нового файла + if ($request->hasFile('file')) { + // Удаляем старый файл + if ($module->file_path) { + Storage::disk('public')->delete($module->file_path); + } + $validated['file_path'] = $request->file('file')->store('course-files', 'public'); + } + + $module->update($validated); + + return back()->with('success', 'Модуль обновлён'); + } + + public function destroy(Course $course, CourseModule $module) + { + Gate::authorize('update', $course); + + // Удаляем файл если есть + if ($module->file_path) { + Storage::disk('public')->delete($module->file_path); + } + + $module->delete(); + + return back()->with('success', 'Модуль удалён'); + } +} diff --git a/app/Models/CourseModule.php b/app/Models/CourseModule.php index 559f402..49817e7 100755 --- a/app/Models/CourseModule.php +++ b/app/Models/CourseModule.php @@ -16,11 +16,15 @@ class CourseModule extends Model 'parent_id', 'title', 'content', - 'type', + 'type', // section, lesson, video, file, link, test 'sort_order', 'duration_minutes', 'is_required', 'is_active', + 'video_url', + 'file_path', + 'external_url', + 'test_id', // Связь с тестом ]; protected $casts = [ @@ -48,6 +52,11 @@ class CourseModule extends Model return $this->hasMany(Test::class); } + public function test(): BelongsTo + { + return $this->belongsTo(Test::class); + } + public function userProgress(): HasMany { return $this->hasMany(UserCourseProgress::class); diff --git a/database/migrations/2026_04_02_092418_add_fields_to_course_modules_table.php b/database/migrations/2026_04_02_092418_add_fields_to_course_modules_table.php new file mode 100755 index 0000000..4475235 --- /dev/null +++ b/database/migrations/2026_04_02_092418_add_fields_to_course_modules_table.php @@ -0,0 +1,28 @@ +
| Категория: | {{ $course->category?->name ?? '—' }} |
|---|---|
| Тип: | {{ $course->type }} |
| Длительность: | {{ $course->duration_minutes ?? '—' }} мин |
| Проходной балл: | {{ $course->passing_score }}% |
| Сертификат: | @if($course->has_certificate)Да@elseНет@endif |
| Статус: | @if($course->is_active)Активен@elseНе активен@endif |
| Создан: | {{ $course->created_at->format('d.m.Y H:i') }} |
| Автор: | {{ $course->creator?->name ?? '—' }} |
{{ $module->content }}
@endif + @if($module->video_url)@endif + @if($module->file_path)@endif + @if($module->external_url)@endif + @if($module->test_id)Модулей пока нет. Добавьте первый модуль!
+ @endifНет модулей
@endif -Нет тестов
- @endif -Тестов пока нет
+ @endif