From d705c7c56d46920eda716e027beec3ec4020fdde Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Fri, 7 Aug 2026 20:01:46 +0330 Subject: [PATCH 1/3] Fixed Quiz --- app/Http/Controllers/Admin/QuizController.php | 8 +- .../views/admin/quizzes/create.blade.php | 148 ++++++++++-------- 2 files changed, 85 insertions(+), 71 deletions(-) diff --git a/app/Http/Controllers/Admin/QuizController.php b/app/Http/Controllers/Admin/QuizController.php index a612700..3015099 100644 --- a/app/Http/Controllers/Admin/QuizController.php +++ b/app/Http/Controllers/Admin/QuizController.php @@ -27,23 +27,23 @@ class QuizController extends Controller public function store(Request $request) { + // 1. Validate only the text and number fields $validated = $request->validate([ 'title' => 'required|string|max:255', 'category_id' => 'required|exists:quiz_categories,id', 'year' => 'nullable|integer', 'type' => 'required|in:multiple_choice,descriptive,mixed', 'duration_minutes' => 'required|integer|min:1', - 'has_negative_score' => 'boolean', - 'is_free' => 'boolean', - 'is_published' => 'boolean', 'description' => 'nullable|string', ]); - $validated['slug'] = Str::slug($validated['title']) . '-' . time(); + // 2. Safely handle checkboxes and generate slug + $validated['slug'] = \Illuminate\Support\Str::slug($validated['title']) . '-' . time(); $validated['has_negative_score'] = $request->has('has_negative_score'); $validated['is_free'] = $request->has('is_free'); $validated['is_published'] = $request->has('is_published'); + // 3. Create the quiz $quiz = Quiz::create($validated); return redirect()->route('quizzes.questions.index', $quiz->id) diff --git a/resources/views/admin/quizzes/create.blade.php b/resources/views/admin/quizzes/create.blade.php index 60c2252..327d7ad 100644 --- a/resources/views/admin/quizzes/create.blade.php +++ b/resources/views/admin/quizzes/create.blade.php @@ -1,80 +1,94 @@ @extends('admin.layouts.app') @section('content') -
-
-
تعریف آزمون جدید
-
-
-
- @csrf -
-
- - -
+
+
+
تعریف آزمون جدید
+
+
+ + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif -
- - -
+ + @csrf +
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
- - -
+
+ + +
-
-
- - -
-
+
+ + +
-
-
- - -
-
- -
-
- - -
-
- -
- انصراف - +
+
+ +
- -
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ انصراف + +
+
+
-@endsection +
+@endsection \ No newline at end of file From bb69e7f953dc207ffb32369d121371fdce8e341e Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Fri, 7 Aug 2026 21:30:03 +0330 Subject: [PATCH 2/3] Fixed quiz --- .../Admin/QuizSubjectController.php | 44 +++++++++++ resources/views/admin/partial/menu.blade.php | 7 ++ .../views/admin/quiz-subjects/index.blade.php | 77 +++++++++++++++++++ routes/web.php | 3 + 4 files changed, 131 insertions(+) create mode 100644 app/Http/Controllers/Admin/QuizSubjectController.php create mode 100644 resources/views/admin/quiz-subjects/index.blade.php diff --git a/app/Http/Controllers/Admin/QuizSubjectController.php b/app/Http/Controllers/Admin/QuizSubjectController.php new file mode 100644 index 0000000..5336105 --- /dev/null +++ b/app/Http/Controllers/Admin/QuizSubjectController.php @@ -0,0 +1,44 @@ +latest()->get(); + return view('admin.quiz-subjects.index', compact('subjects')); + } + + public function store(Request $request) + { + $request->validate([ + 'title' => 'required|string|max:255', + ]); + + QuizSubject::create([ + 'title' => $request->title, + // Generate a unique slug for potential API/URL usage + 'slug' => Str::slug($request->title) . '-' . time(), + ]); + + return back()->with('success', 'درس با موفقیت اضافه شد.'); + } + + public function destroy(QuizSubject $quiz_subject) + { + // Prevent deletion if questions are already assigned to this subject + if ($quiz_subject->questions()->count() > 0) { + return back()->with('error', 'این درس دارای سوال است و نمی‌تواند حذف شود. ابتدا سوالات مربوطه را ویرایش یا حذف کنید.'); + } + + $quiz_subject->delete(); + return back()->with('success', 'درس با موفقیت حذف شد.'); + } +} \ No newline at end of file diff --git a/resources/views/admin/partial/menu.blade.php b/resources/views/admin/partial/menu.blade.php index e528445..77adc7e 100644 --- a/resources/views/admin/partial/menu.blade.php +++ b/resources/views/admin/partial/menu.blade.php @@ -60,6 +60,13 @@ +
  • + + + مدیریت دروس + +
  • +
  • diff --git a/resources/views/admin/quiz-subjects/index.blade.php b/resources/views/admin/quiz-subjects/index.blade.php new file mode 100644 index 0000000..98ec42a --- /dev/null +++ b/resources/views/admin/quiz-subjects/index.blade.php @@ -0,0 +1,77 @@ +@extends('admin.layouts.app') + +@section('content') +
    + +
    +
    +
    +
    افزودن درس جدید
    +
    +
    + + @if ($errors->any()) +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    + @endif + +
    + @csrf +
    + + +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    دروس ثبت شده
    +
    + + + + + + + + + + @forelse($subjects as $subject) + + + + + + @empty + + + + @endforelse + +
    عنوان درستعداد سوالات مرتبطعملیات
    {{ $subject->title }} + {{ $subject->questions_count }} سوال + +
    + @csrf + @method('DELETE') + +
    +
    هیچ درسی یافت نشد.
    +
    +
    +
    +
    +
    +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 92fe1ff..f18bdf4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -33,6 +33,7 @@ use App\Http\Controllers\Admin\TicketController; use App\Http\Controllers\Admin\DashboardController; use App\Http\Controllers\Admin\QuizController; use App\Http\Controllers\Admin\QuizCategoryController; +use App\Http\Controllers\Admin\QuizSubjectController; Route::get('payment/callback', [PayController::class, 'callback']); @@ -78,5 +79,7 @@ Route::middleware(['auth', config('jetstream.auth_session')])->group(function () Route::delete('questions/{question}', [QuizController::class, 'destroyQuestion'])->name('questions.destroy'); Route::resource('quiz-categories', QuizCategoryController::class)->except(['create', 'show', 'edit', 'update']); + Route::resource('quiz-subjects', QuizSubjectController::class)->except(['create', 'show', 'edit', 'update']); + Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); }); From 2d6766760f08e15a104c4ffc59c942f6e3b562df Mon Sep 17 00:00:00 2001 From: "m.razaghi" Date: Fri, 7 Aug 2026 21:36:48 +0330 Subject: [PATCH 3/3] Fixed Quiz --- .../views/admin/quizzes/questions.blade.php | 259 ++++++++++-------- 1 file changed, 142 insertions(+), 117 deletions(-) diff --git a/resources/views/admin/quizzes/questions.blade.php b/resources/views/admin/quizzes/questions.blade.php index f694bdf..d87527a 100644 --- a/resources/views/admin/quizzes/questions.blade.php +++ b/resources/views/admin/quizzes/questions.blade.php @@ -1,140 +1,165 @@ @extends('admin.layouts.app') @section('content') -
    +
    +

    مدیریت سوالات: {{ $quiz->title }}

    + بازگشت به لیست آزمون‌ها +
    -
    - -
    -
    -
    -
    افزودن سوال جدید
    -
    -
    -
    - @csrf +
    + +
    +
    +
    +
    افزودن سوال جدید
    +
    +
    + + + @if ($errors->any()) +
    +
      + @foreach ($errors->all() as $error) +
    • {{ $error }}
    • + @endforeach +
    +
    + @endif -
    - - -
    + + @csrf + +
    + + +
    -
    - - -
    +
    + + +
    -
    - - -
    +
    + + +
    -
    - - -
    +
    + + +
    - -
    -
    گزینه‌ها و انتخاب پاسخ صحیح:
    - @for($i = 0; $i < 4; $i++) -
    -
    - -
    - + +
    +
    گزینه‌ها و انتخاب پاسخ صحیح:
    + @for($i = 0; $i < 4; $i++) +
    +
    + +
    - @endfor - دکمه رادیویی کنار هر گزینه نشان‌دهنده گزینه صحیح است. -
    + + +
    + @endfor + دکمه رادیویی کنار هر گزینه نشان‌دهنده گزینه صحیح است. +
    -
    - - -
    +
    + + +
    - - -
    + +
    +
    - -
    -
    -
    -
    سوالات ثبت شده ({{ $quiz->questions->count() }})
    -
    -
    - @forelse($quiz->questions as $index => $question) -
    -
    - سوال شماره {{ $index + 1 }} -
    - @if($question->subject) - {{ $question->subject->title }} - @endif - + +
    +
    +
    +
    سوالات ثبت شده ({{ $quiz->questions->count() }})
    +
    +
    + @forelse($quiz->questions as $index => $question) +
    +
    + سوال شماره {{ $index + 1 }} +
    + @if($question->subject) + {{ $question->subject->title }} + @endif + {{ $question->type === 'multiple_choice' ? 'تستی' : 'تشریحی' }} -
    -
    - -

    {{ $question->question_text }}

    - - @if($question->type === 'multiple_choice') -
    - @foreach($question->options as $optIndex => $option) -
    -
    - {{ $optIndex + 1 }}) {{ $option->option_text }} -
    -
    - @endforeach -
    - @endif - - @if($question->solution_explanation) -
    - پاسخ تشریحی / مستند قانون: {{ $question->solution_explanation }} -
    - @endif - -
    -
    - @csrf - @method('DELETE') - -
    - @empty -

    هنوز سوالی برای این آزمون ثبت نشده است.

    - @endforelse -
    + +

    {{ $question->question_text }}

    + + @if($question->type === 'multiple_choice') +
    + @foreach($question->options as $optIndex => $option) +
    +
    + {{ $optIndex + 1 }}) {{ $option->option_text }} +
    +
    + @endforeach +
    + @endif + + @if($question->solution_explanation) +
    + پاسخ تشریحی / مستند قانون: {{ $question->solution_explanation }} +
    + @endif + +
    +
    + @csrf + @method('DELETE') + +
    +
    +
    + @empty +

    هنوز سوالی برای این آزمون ثبت نشده است.

    + @endforelse
    - - +
    @endsection + +@section('scripts') + +@endsection \ No newline at end of file