{{ $course_details->title }}
{{ ellipsis($course_details->short_description, 160) }}
- - - -diff --git a/app/Helpers/Api_helper.php b/app/Helpers/Api_helper.php index 5aaab45..4ca55fd 100644 --- a/app/Helpers/Api_helper.php +++ b/app/Helpers/Api_helper.php @@ -213,32 +213,6 @@ function is_added_to_wishlist($user_id = 0, $course_id = "") } } -// function is_purchased($user_id = 0, $course_id = "") -// { -// // 0 represents Not purchased, 1 represents Purchased, 2 represents Pending -// if ($user_id > 0) { -// if (enroll_status($course_id, $user_id) == 'valid') { -// return true; -// } else { -// return false; -// } -// } else { -// return false; -// } -// } - -// function is_purchased($user_id = 0, $course_id = "") -// { -// // 0 represents not purchased, 1 represents purchased -// if ($user_id > 0) { -// $status = enroll_status($course_id, $user_id); -// return $status === 'valid'; // Return true only if status is 'valid' -// } else { -// return false; // User ID is not valid -// } -// } - - if (!function_exists('is_purchased')) { function is_purchased($user_id = 0, $course_id = "") { @@ -271,7 +245,6 @@ if (!function_exists('enroll_status_api')) { } } - function get_total_duration_of_lesson_by_course_id($course_id) { $total_duration = 0; @@ -433,75 +406,6 @@ if (!function_exists('update_watch_history_manually')) { } } -// if (!function_exists('update_watch_history_manually')) { -// // code of mark this lesson as completed -// function update_watch_history_manually($lesson_id = "", $course_id = "", $user_id = "") -// { -// $is_completed = 0; - -// $query = DB::table('watch_histories')->where('course_id', $course_id)->where('student_id', $user_id)->first(); - -// $course_progress = course_progress($course_id, $user_id); - -// if (!empty($query)) { -// $lesson_ids = json_decode($query->completed_lesson, true); -// if (!is_array($lesson_ids)) -// $lesson_ids = array(); -// if (!in_array($lesson_id, $lesson_ids)) { -// array_push($lesson_ids, $lesson_id); -// $total_lesson = DB::table('lessons')->where('course_id', $course_id)->get(); -// $course_progress = (100 / count($total_lesson)) * count($lesson_ids); - -// if ($course_progress >= 100 && $query->completed_date == null) { -// $completed_date = time(); -// } else { -// $completed_date = $query->completed_date; -// } - -// DB::table('watch_histories')->where('id', $query->id)->update([ -// 'completed_lesson' => json_encode($lesson_ids), -// 'completed_date' => $completed_date, -// ]); - -// $is_completed = 1; - -// } else { -// if (($key = array_search($lesson_id, $lesson_ids)) !== false) { -// unset($lesson_ids[$key]); -// } - -// $total_lesson = DB::table('lessons')->where('course_id', $course_id)->get(); -// $course_progress = (100 / count($total_lesson)) * count($lesson_ids); - -// if ($course_progress >= 100 && $query->completed_date == null) { -// $completed_date = time(); -// } else { -// $completed_date = $query->completed_date; -// } - -// DB::table('watch_histories')->where('id', $query->id)->update([ -// 'completed_lesson' => json_encode($lesson_ids), -// 'completed_date' => $completed_date, -// ]); - -// $is_completed = 0; -// } - -// } else { -// $total_lesson = DB::table('lessons')->where('course_id', $course_id)->get(); -// $course_progress = (100 / count($total_lesson)); - -// $insert_data['course_id'] = $course_id; -// $insert_data['student_id'] = $user_id; -// $insert_data['completed_lesson'] = json_encode(array($lesson_id)); -// $insert_data['watching_lesson_id'] = $lesson_id; -// DB::table('watch_histories')->create($insert_data); -// } - -// return json_encode(array('lesson_id' => $lesson_id, 'course_progress' => round($course_progress), 'is_completed' => $is_completed)); -// } -// } - function course_completion_data($course_id = "", $user_id = "") { $response = array(); diff --git a/app/Http/Controllers/CommonController.php b/app/Http/Controllers/CommonController.php index 33afad2..5d12251 100644 --- a/app/Http/Controllers/CommonController.php +++ b/app/Http/Controllers/CommonController.php @@ -7,7 +7,6 @@ use Illuminate\Http\Request; class CommonController extends Controller { - // Get video details new code function get_video_details(Request $request, $url = "") { if ($url == "") { @@ -17,36 +16,9 @@ class CommonController extends Controller $host = explode('.', str_replace('www.', '', strtolower(parse_url($url, PHP_URL_HOST)))); $host = isset($host[0]) ? $host[0] : $host; - $vimeo_api_key = get_settings('vimeo_api_key'); $youtube_api_key = get_settings('youtube_api_key'); - if ($host == 'vimeo') { - $video_id = substr(parse_url($url, PHP_URL_PATH), 1); - $options = array('http' => array( - 'method' => 'GET', - 'header' => 'Authorization: Bearer ' . $vimeo_api_key - )); - $context = stream_context_create($options); - - try { - $hash = json_decode(file_get_contents("https://api.vimeo.com/videos/{$video_id}", false, $context)); - } catch (\Throwable $th) { - $hash = ''; - } - - if ($hash == '') return; - - - return array( - 'provider' => 'Vimeo', - 'video_id' => $video_id, - 'title' => $hash->name, - 'thumbnail' => $hash->pictures->sizes[0]->link, - 'video' => $hash->link, - 'embed_video' => "https://player.vimeo.com/video/" . $video_id, - 'duration' => gmdate("H:i:s", $hash->duration) - ); - } elseif ($host == 'youtube' || $host == 'youtu') { + if ($host == 'youtube' || $host == 'youtu') { preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match); $video_id = $match[1]; @@ -68,8 +40,7 @@ class CommonController extends Controller 'embed_video' => "http://www.youtube.com/embed/" . $hash->items[0]->id, 'duration' => $duration->format('%H:%I:%S'), ); - } elseif ($host == 'drive') { - } + } } public function rendered_view(Request $request, $path = "") diff --git a/app/Http/Controllers/LiveClassController.php b/app/Http/Controllers/LiveClassController.php index 00384df..a684a0b 100644 --- a/app/Http/Controllers/LiveClassController.php +++ b/app/Http/Controllers/LiveClassController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Http\Controllers\Controller; use App\Models\Course; use App\Models\Live_class; use App\Models\Setting; diff --git a/app/Http/Controllers/PlayerController.php b/app/Http/Controllers/PlayerController.php index 8b612b7..3faf860 100644 --- a/app/Http/Controllers/PlayerController.php +++ b/app/Http/Controllers/PlayerController.php @@ -13,6 +13,17 @@ use Illuminate\Support\Facades\Session; class PlayerController extends Controller { + public function reload_sidebar($course_id, $lesson_id) + { + $course_details = Course::findOrFail($course_id); + $lesson_details = Lesson::findOrFail($lesson_id); + + return view('course_player.side_bar', compact( + 'course_details', + 'lesson_details' + )); + } + public function course_player(Request $request, $slug, $id = '') { $course = Course::where('slug', $slug)->firstOrNew(); @@ -35,7 +46,7 @@ class PlayerController extends Controller } } } - + //cek histori tontonan $check_lesson_history = Watch_history::where('course_id', $course->id) ->where('student_id', auth()->user()->id)->first(); $first_lesson_of_course = Lesson::where('course_id', $course->id)->orderBy('sort', 'asc')->value('id'); diff --git a/app/Http/Controllers/student/MessageController.php b/app/Http/Controllers/student/MessageController.php index 512ca99..3459ef2 100644 --- a/app/Http/Controllers/student/MessageController.php +++ b/app/Http/Controllers/student/MessageController.php @@ -134,8 +134,14 @@ class MessageController extends Controller public function search_student(Request $request) { - $page_data['user_details'] = User::where('email', $request->search_mail)->first(); - $view_path = 'frontend.' . get_frontend_settings('theme') . '.student.message.search_result'; + $search = $request->search_mail; + + if (empty(trim($search))) { + $page_data['user_details'] = null; // or collect() for no results + } else { + $page_data['user_details'] = User::where('email', 'LIKE', '%' . $search . '%') ->first(); + } + $view_path = 'frontend.' . get_frontend_settings('theme') . '.student.message.search_result'; return view($view_path, $page_data); } diff --git a/app/Http/Controllers/student/QuizController.php b/app/Http/Controllers/student/QuizController.php index cffdf8f..da7fa74 100644 --- a/app/Http/Controllers/student/QuizController.php +++ b/app/Http/Controllers/student/QuizController.php @@ -14,9 +14,14 @@ class QuizController extends Controller { public function quiz_submit(Request $request) { - $retake = Lesson::where('id', $request->quiz_id)->value('retake'); - $submit = QuizSubmission::where('quiz_id', $request->quiz_id)->where('user_id', auth()->user()->id)->count(); - if ($submit > $retake) { + $quiz = Lesson::findOrFail($request->quiz_id); + + $retake = $quiz->retake; + $submit = QuizSubmission::where('quiz_id', $quiz->id) + ->where('user_id', auth()->user()->id) + ->count(); + + if ($submit >= $retake) { Session::flash('warning', get_phrase('Attempt has been over.')); return redirect()->back(); } @@ -37,41 +42,63 @@ class QuizController extends Controller $questions = Question::whereIn('id', $question_ids)->get(); $right_answers = $wrong_answers = []; + foreach ($questions as $key => $question) { $correct_answer = json_decode($question->answer, true); $submitted = $submitted_answers[$key]; if ($question->type == 'mcq') { - $isCorrect = empty(array_diff($correct_answer, $submitted)) && empty(array_diff($submitted, $correct_answer)); + $isCorrect = empty(array_diff($correct_answer, $submitted)) + && empty(array_diff($submitted, $correct_answer)); } elseif ($question->type == 'fill_blanks') { $isCorrect = count($correct_answer) === count($submitted); - if ($isCorrect) { - for ($i = 0; $i < count($correct_answer); $i++) { - if (strtolower($correct_answer[$i]) != strtolower($submitted[$i])) { + foreach ($correct_answer as $i => $answer) { + if (strtolower($answer) !== strtolower($submitted[$i])) { $isCorrect = false; break; } } - } else { - $isCorrect = false; } } elseif ($question->type == 'true_false') { - $isCorrect = strtolower(json_encode($correct_answer)) == strtolower($submitted); + $isCorrect = strtolower(json_encode($correct_answer)) === strtolower($submitted); } - $isCorrect ? $right_answers[] = $question->id : $wrong_answers[] = $question->id; + $isCorrect + ? $right_answers[] = $question->id + : $wrong_answers[] = $question->id; } - $data['quiz_id'] = $quiz_id; - $data['user_id'] = auth()->user()->id; - $data['correct_answer'] = $right_answers ? json_encode($right_answers) : null; - $data['wrong_answer'] = $wrong_answers ? json_encode($wrong_answers) : null; - $data['submits'] = $submits->count() > 0 ? json_encode($submits->toArray()) : null; + QuizSubmission::create([ + 'quiz_id' => $quiz->id, + 'user_id' => auth()->user()->id, + 'correct_answer' => $right_answers ? json_encode($right_answers) : null, + 'wrong_answer' => $wrong_answers ? json_encode($wrong_answers) : null, + 'submits' => $submits->count() ? json_encode($submits->toArray()) : null, + ]); + + // ✅ HITUNG NILAI + $total_questions = $questions->count(); + $mark_per_question = $total_questions > 0 + ? ($quiz->total_mark / $total_questions) + : 0; + + $obtained_mark = count($right_answers) * $mark_per_question; + + // ✅ JIKA LULUS → MARK LESSON COMPLETED + if ($obtained_mark >= $quiz->pass_mark) { + update_watch_history_manually( + $quiz->id, + $quiz->course_id, + auth()->user()->id + ); + + Session::flash('success', get_phrase('Congratulations, you passed the quiz.')); + } else { + Session::flash('warning', get_phrase('You did not reach the minimum score.')); + } - QuizSubmission::insert($data); - Session::flash('success', get_phrase('Your answers have been submitted.')); return redirect()->back(); } diff --git a/resources/views/admin/course/edit_media.blade.php b/resources/views/admin/course/edit_media.blade.php index 4ea77ec..d036401 100644 --- a/resources/views/admin/course/edit_media.blade.php +++ b/resources/views/admin/course/edit_media.blade.php @@ -14,37 +14,14 @@
Could not extract video ID.
+ Use a link like:{{ $lesson->lesson_type }}
- {{ $lesson->title }} + @if (in_array($type, ['google_drive', 'video-url', 'quiz'])) + + {{ $lesson->title }} + + @else + + {{ $lesson->title }} + + @endif @else id, $completed_lesson)) checked @endif type="checkbox" id="{{ $lesson->id }}">{{ ellipsis($course_details->short_description, 160) }}
- - - -