load->database(); $this->load->library('session'); /*cache control*/ $this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0'); $this->output->set_header('Pragma: no-cache'); // THIS FUNCTION DECIDES WHTHER THE ROUTE IS REQUIRES PUBLIC INSTRUCTOR. //$this->get_protected_routes($this->router->method); // THIS MIDDLEWARE FUNCTION CHECKS WHETHER THE USER IS TRYING TO ACCESS INSTRUCTOR STUFFS. $this->instructor_authorization($this->router->method); $this->instructor_approval(); // CHECK CUSTOM SESSION DATA $this->user_model->check_session_data('user'); } function instructor_approval() { $user_id = $this->session->userdata('user_id'); $query = $this->db->get_where('users', array('id' => $user_id)); if ($query->num_rows() > 0) { $this->session->set_userdata('is_instructor', $query->row('is_instructor')); } } public function get_protected_routes($method) { // IF ANY FUNCTION DOES NOT REQUIRE PUBLIC INSTRUCTOR, PUT THE NAME HERE. $unprotected_routes = ['save_course_progress', 'start_quiz', 'retake_quiz', 'finish_quize_submission', 'submit_quiz_answer', 'join_bbb_meeting']; if (!in_array($method, $unprotected_routes)) { if (get_settings('allow_instructor') != 1) { redirect(site_url('home'), 'refresh'); } } } public function instructor_authorization($method) { // IF THE USER IS NOT AN INSTRUCTOR HE/SHE CAN NEVER ACCESS THE OTHER FUNCTIONS EXCEPT FOR BELOW FUNCTIONS. if ($this->session->userdata('is_instructor') != 1) { $unprotected_routes = ['become_an_instructor', 'manage_profile', 'save_course_progress', 'start_quiz', 'retake_quiz', 'submit_quiz_answer', 'finish_quize_submission', 'join_bbb_meeting']; if (!in_array($method, $unprotected_routes)) { redirect(site_url('user/become_an_instructor'), 'refresh'); } } } public function index() { if ($this->session->userdata('user_login') == true) { $this->dashboard(); } else { redirect(site_url('login'), 'refresh'); } } public function dashboard() { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $page_data['page_name'] = 'dashboard'; $page_data['page_title'] = get_phrase('dashboard'); $this->load->view('backend/index.php', $page_data); } public function courses() { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $page_data['selected_category_id'] = isset($_GET['category_id']) ? $_GET['category_id'] : "all"; $page_data['selected_instructor_id'] = $this->session->userdata('user_id'); $page_data['selected_price'] = isset($_GET['price']) ? $_GET['price'] : "all"; $page_data['selected_status'] = isset($_GET['status']) ? $_GET['status'] : "all"; $page_data['courses'] = $this->crud_model->filter_course_for_backend($page_data['selected_category_id'], $page_data['selected_instructor_id'], $page_data['selected_price'], $page_data['selected_status']); $page_data['page_name'] = 'courses-server-side'; $page_data['categories'] = $this->crud_model->get_categories(); $page_data['page_title'] = get_phrase('active_courses'); $this->load->view('backend/index', $page_data); } // This function is responsible for loading the course data from server side for datatable SILENTLY public function get_courses() { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $courses = array(); // Filter portion $filter_data['selected_category_id'] = $this->input->post('selected_category_id'); $filter_data['selected_instructor_id'] = $this->input->post('selected_instructor_id'); $filter_data['selected_price'] = $this->input->post('selected_price'); $filter_data['selected_status'] = $this->input->post('selected_status'); // Server side processing portion $columns = array( 0 => '#', 1 => 'title', 2 => 'category', 3 => 'lesson_and_section', 4 => 'enrolled_student', 5 => 'status', 6 => 'price', 7 => 'actions', 8 => 'course_id' ); // Coming from databale itself. Limit is the visible number of data $limit = html_escape($this->input->post('length')); $start = html_escape($this->input->post('start')); $order = ""; $dir = $this->input->post('order')[0]['dir']; $totalData = $this->lazyload->count_all_courses($filter_data); $totalFiltered = $totalData; // This block of code is handling the search event of datatable if (empty($this->input->post('search')['value'])) { $courses = $this->lazyload->courses($limit, $start, $order, $dir, $filter_data); } else { $search = $this->input->post('search')['value']; $courses = $this->lazyload->course_search($limit, $start, $search, $order, $dir, $filter_data); $totalFiltered = $this->lazyload->course_search_count($search); } // Fetch the data and make it as JSON format and return it. $data = array(); if (!empty($courses)) { foreach ($courses as $key => $row) { $instructor_details = $this->user_model->get_all_user($row->user_id)->row_array(); $category_details = $this->crud_model->get_category_details_by_id($row->sub_category_id)->row_array(); $sections = $this->crud_model->get_section('course', $row->id); $lessons = $this->crud_model->get_lessons('course', $row->id); $enroll_history = $this->crud_model->enrol_history($row->id); $status_badge = "badge-success-lighten"; if ($row->status == 'pending') { $status_badge = "badge-danger-lighten"; } elseif ($row->status == 'draft') { $status_badge = "badge-dark-lighten"; } elseif ($row->status == 'private') { $status_badge = "badge-dark"; } $price_badge = "badge-dark-lighten"; $price = 0; if ($row->is_free_course == null) { if ($row->discount_flag == 1) { $price = currency($row->discounted_price); } else { $price = currency($row->price); } } elseif ($row->is_free_course == 1) { $price_badge = "badge-success-lighten"; $price = get_phrase('free'); } $price_field = '' . $price . ''; if ($row->expiry_period > 0) { $price_field .= '

' . $row->expiry_period . ' ' . get_phrase('Months') . '

'; } else { $price_field .= '

' . get_phrase('Lifetime') . '

'; } $view_course_on_frontend_url = site_url('home/course/' . rawurlencode(slugify($row->title)) . '/' . $row->id); $go_to_course_playing_page = site_url('home/lesson/' . rawurlencode(slugify($row->title)) . '/' . $row->id); $edit_this_course_url = site_url('user/course_form/course_edit/' . $row->id); $section_and_lesson_url = site_url('user/course_form/course_edit/' . $row->id); $academic_progress_url = site_url('user/course_form/course_edit/' . $row->id . '?tab=academic_progress'); if ($row->status == 'active' || $row->status == 'pending') { $course_status_changing_action = "confirm_modal('" . site_url('user/course_actions/draft/' . $row->id) . "')"; $course_status_changing_message = get_phrase('mark_as_drafted'); } else { $course_status_changing_action = "confirm_modal('" . site_url('user/course_actions/publish/' . $row->id) . "')"; $course_status_changing_message = get_phrase('publish_this_course'); } $delete_course_url = "confirm_modal('" . site_url('user/course_actions/delete/' . $row->id) . "')"; if ($row->course_type == 'general') { $section_and_lesson_menu = '
  • ' . get_phrase("section_and_lesson") . '
  • '; } else { $section_and_lesson_menu = ""; } $action = '
    '; $nestedData['#'] = $key + 1; $instructor_names = ""; if ($row->multi_instructor) { $instructors = $this->user_model->get_multi_instructor_details_with_csv($row->user_id); foreach ($instructors as $counterForThis => $instructor) { $instructor_names .= $instructor['first_name'] . ' ' . $instructor['last_name']; $instructor_names .= $counterForThis + 1 == count($instructors) ? '' : ', '; } } else { $instructor_names = $instructor_details['first_name'] . ' ' . $instructor_details['last_name']; } $nestedData['title'] = '' . $row->title . '
    ' . get_phrase('instructor') . ': ' . $instructor_names . ''; $nestedData['category'] = '' . $category_details['name'] . ''; if ($row->course_type == 'scorm') { $nestedData['lesson_and_section'] = '' . get_phrase('scorm_course') . ''; } elseif ($row->course_type == 'h5p') { $nestedData['lesson_and_section'] = '' . get_phrase('h5p_course') . ''; } elseif ($row->course_type == 'general') { $nestedData['lesson_and_section'] = ' ' . get_phrase('total_section') . ': ' . $sections->num_rows() . '
    ' . get_phrase('total_lesson') . ': ' . $lessons->num_rows() . ''; } $nestedData['enrolled_student'] = '' . get_phrase('total_enrolment') . ': ' . $enroll_history->num_rows() . ''; $nestedData['status'] = '' . get_phrase($row->status) . ''; $nestedData['price'] = $price_field; $nestedData['actions'] = $action; $nestedData['course_id'] = $row->id; $data[] = $nestedData; } } $json_data = array( "draw" => intval($this->input->post('draw')), "recordsTotal" => intval($totalData), "recordsFiltered" => intval($totalFiltered), "data" => $data ); echo json_encode($json_data); } public function course_actions($param1 = "", $param2 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($param1 == "add") { $course_id = $this->crud_model->add_course(); redirect(site_url('user/course_form/course_edit/' . $course_id), 'refresh'); } elseif ($param1 == "edit") { $this->is_the_course_belongs_to_current_instructor($param2); $this->crud_model->update_course($param2); // CHECK IF LIVE CLASS ADDON EXISTS, ADD OR UPDATE IT TO ADDON MODEL if (addon_status('live-class')) { $this->load->model('addons/Liveclass_model', 'liveclass_model'); $this->liveclass_model->update_live_class($param2); } // CHECK IF JITSI LIVE CLASS ADDON EXISTS, ADD OR UPDATE IT TO ADDON MODEL if (addon_status('jitsi-live-class')) { $this->load->model('addons/jitsi_liveclass_model', 'jitsi_liveclass_model'); $this->jitsi_liveclass_model->update_live_class($param2); } redirect(site_url('user/course_form/course_edit/' . $param2)); } elseif ($param1 == 'add_shortcut') { echo $this->crud_model->add_shortcut_course(); } elseif ($param1 == 'delete') { $this->is_the_course_belongs_to_current_instructor($param2); $this->crud_model->delete_course($param2); redirect(site_url('user/courses'), 'refresh'); } elseif ($param1 == 'draft') { $this->is_the_course_belongs_to_current_instructor($param2); $this->crud_model->change_course_status('draft', $param2); redirect(site_url('user/courses'), 'refresh'); } elseif ($param1 == 'publish') { $this->is_the_course_belongs_to_current_instructor($param2); $this->crud_model->change_course_status('pending', $param2); redirect(site_url('user/courses'), 'refresh'); } } public function course_form($param1 = "", $param2 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($param1 == 'add_course') { $page_data['languages'] = $this->crud_model->get_all_languages(); $page_data['categories'] = $this->crud_model->get_categories(); $page_data['page_name'] = 'course_add'; $page_data['page_title'] = get_phrase('add_course'); $this->load->view('backend/index', $page_data); } elseif ($param1 == 'add_course_shortcut') { $page_data['languages'] = $this->crud_model->get_all_languages(); $page_data['categories'] = $this->crud_model->get_categories(); $this->load->view('backend/user/course_add_shortcut', $page_data); } elseif ($param1 == 'course_edit') { $this->is_the_course_belongs_to_current_instructor($param2); $page_data['page_name'] = 'course_edit'; $page_data['course_id'] = $param2; $page_data['page_title'] = get_phrase('edit_course'); $page_data['languages'] = $this->crud_model->get_all_languages(); $page_data['categories'] = $this->crud_model->get_categories(); $this->load->view('backend/index', $page_data); } } public function payout_settings($param1 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if (isset($_POST['gateways'])) { $data['payment_keys'] = json_encode($_POST['gateways']); $data['last_modified'] = time(); $this->db->where('id', $this->session->userdata('user_id')); $this->db->update('users', $data); $this->session->set_flashdata('flash_message', get_phrase('payment_settings_has_been_updated')); redirect(site_url('user/payout_settings'), 'refresh'); } $page_data['page_name'] = 'payment_settings'; $page_data['page_title'] = get_phrase('payout_settings'); $this->load->view('backend/index', $page_data); } public function sales_report($param1 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($param1 != "") { $date_range = $this->input->get('date_range'); $date_range = explode(" - ", $date_range); $page_data['timestamp_start'] = strtotime($date_range[0] . ' 00:00:00'); $page_data['timestamp_end'] = strtotime($date_range[1] . ' 23:59:59'); } else { $page_data['timestamp_start'] = strtotime(date("m/01/Y 00:00:00")); $page_data['timestamp_end'] = strtotime(date("m/t/Y 23:59:59")); } $page_data['payment_history'] = $this->crud_model->get_instructor_revenue($this->session->userdata('user_id'), $page_data['timestamp_start'], $page_data['timestamp_end']); $page_data['page_name'] = 'sales_report'; $page_data['page_title'] = get_phrase('sales_report'); $this->load->view('backend/index', $page_data); } public function preview($course_id = '') { if ($this->session->userdata('user_login') != 1) redirect(site_url('login'), 'refresh'); $this->is_the_course_belongs_to_current_instructor($course_id); if ($course_id > 0) { $courses = $this->crud_model->get_course_by_id($course_id); if ($courses->num_rows() > 0) { $course_details = $courses->row_array(); redirect(site_url('home/lesson/' . rawurlencode(slugify($course_details['title'])) . '/' . $course_details['id']), 'refresh'); } } redirect(site_url('user/courses'), 'refresh'); } public function sections($param1 = "", $param2 = "", $param3 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($param2 == 'add') { $this->is_the_course_belongs_to_current_instructor($param1); $this->crud_model->add_section($param1); $this->session->set_flashdata('flash_message', get_phrase('section_has_been_added_successfully')); } elseif ($param2 == 'edit') { $this->is_the_course_belongs_to_current_instructor($param1, $param3, 'section'); $this->crud_model->edit_section($param3); $this->session->set_flashdata('flash_message', get_phrase('section_has_been_updated_successfully')); } elseif ($param2 == 'delete') { $this->is_the_course_belongs_to_current_instructor($param1, $param3, 'section'); $this->crud_model->delete_section($param1, $param3); $this->session->set_flashdata('flash_message', get_phrase('section_has_been_deleted_successfully')); } redirect(site_url('user/course_form/course_edit/' . $param1)); } public function lessons($course_id = "", $param1 = "", $param2 = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($param1 == 'add') { $valid_user = $this->is_the_course_belongs_to_current_instructor($course_id, null, null, true); if ($valid_user > 0) { $response = $this->crud_model->add_lesson(); } else { $response = json_encode(['error' => get_phrase('you_do_not_have_right_to_access_this_course')]); } echo $response; return; } elseif ($param1 == 'edit') { $valid_user = +$this->is_the_course_belongs_to_current_instructor($course_id, $param2, 'lesson', true); if ($valid_user > 0) { $response = $this->crud_model->edit_lesson($param2); } else { $response = json_encode(['error' => get_phrase('you_do_not_have_right_to_access_this_course')]); } echo $response; return; } elseif ($param1 == 'delete') { $this->is_the_course_belongs_to_current_instructor($course_id, $param2, 'lesson'); $this->crud_model->delete_lesson($param2); $this->session->set_flashdata('flash_message', get_phrase('lesson_has_been_deleted_successfully')); redirect('user/course_form/course_edit/' . $course_id); } elseif ($param1 == 'filter') { redirect('user/lessons/' . $this->input->post('course_id')); } $page_data['page_name'] = 'lessons'; $page_data['lessons'] = $this->crud_model->get_lessons('course', $course_id); $page_data['course_id'] = $course_id; $page_data['page_title'] = get_phrase('lessons'); $this->load->view('backend/index', $page_data); } // Manage Quizes public function quizes($course_id = "", $action = "", $quiz_id = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($action == 'add') { $this->is_the_course_belongs_to_current_instructor($course_id); $this->crud_model->add_quiz($course_id); $this->session->set_flashdata('flash_message', get_phrase('quiz_has_been_added_successfully')); } elseif ($action == 'edit') { $this->is_the_course_belongs_to_current_instructor($course_id, $quiz_id, 'quize'); $this->crud_model->edit_quiz($quiz_id); $this->session->set_flashdata('flash_message', get_phrase('quiz_has_been_updated_successfully')); } elseif ($action == 'delete') { $this->is_the_course_belongs_to_current_instructor($course_id, $quiz_id, 'quize'); $this->crud_model->delete_lesson($quiz_id); $this->session->set_flashdata('flash_message', get_phrase('quiz_has_been_deleted_successfully')); } redirect(site_url('user/course_form/course_edit/' . $course_id)); } // Manage Quize Questions public function quiz_questions($quiz_id = "", $action = "", $question_id = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $quiz_details = $this->crud_model->get_lessons('lesson', $quiz_id)->row_array(); if ($action == 'add' || $action == 'edit') { echo $this->crud_model->manage_quiz_questions($quiz_id, $question_id, $action); } elseif ($action == 'delete') { if ($this->db->get_where('question', array('id' => $question_id, 'quiz_id' => $quiz_id))->num_rows() <= 0) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_quiz_question')); redirect(site_url('user/courses'), 'refresh'); } $response = $this->crud_model->delete_quiz_question($question_id); $this->session->set_flashdata('flash_message', get_phrase('question_has_been_deleted')); redirect(site_url('user/course_form/course_edit/' . $quiz_details['course_id']), 'refresh'); } } function manage_profile() { redirect(site_url('home/profile/user_profile'), 'refresh'); } function invoice($payment_id = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $page_data['page_name'] = 'invoice'; $page_data['payment_details'] = $this->crud_model->get_payment_details_by_id($payment_id); $page_data['page_title'] = get_phrase('invoice'); $this->load->view('backend/index', $page_data); } function become_an_instructor() { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $applications = $this->user_model->get_applications($this->session->userdata('user_id'), 'user'); if ($applications->num_rows() == 0) : redirect('home/become_an_instructor', 'refresh'); endif; // CHEKING IF A FORM HAS BEEN SUBMITTED FOR REGISTERING AN INSTRUCTOR if (isset($_POST) && !empty($_POST)) { $this->user_model->post_instructor_application(); } // CHECK USER AVAILABILITY $user_details = $this->user_model->get_all_user($this->session->userdata('user_id')); if ($user_details->num_rows() > 0) { $page_data['user_details'] = $user_details->row_array(); } else { $this->session->set_flashdata('error_message', get_phrase('user_not_found')); $this->load->view('backend/index', $page_data); } $page_data['page_name'] = 'become_an_instructor'; $page_data['page_title'] = get_phrase('become_an_instructor'); $this->load->view('backend/index', $page_data); } // PAYOUT REPORT public function payout_report() { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } $page_data['page_name'] = 'payout_report'; $page_data['page_title'] = get_phrase('payout_report'); $page_data['payouts'] = $this->crud_model->get_payouts($this->session->userdata('user_id'), 'user'); $page_data['total_pending_amount'] = $this->crud_model->get_total_pending_amount($this->session->userdata('user_id')); $page_data['total_payout_amount'] = $this->crud_model->get_total_payout_amount($this->session->userdata('user_id')); $page_data['requested_withdrawal_amount'] = $this->crud_model->get_requested_withdrawal_amount($this->session->userdata('user_id')); if (addon_status('ebook')) { $this->db->select_sum('instructor_revenue'); $this->db->where('ebook.user_id', $this->session->userdata('user_id')); $this->db->where('ebook_payment.instructor_payment_status', 0); $this->db->from('ebook_payment'); $this->db->join('ebook', 'ebook_payment.ebook_id = ebook.ebook_id'); $ebook_total_pending_amount = $this->db->get()->row('instructor_revenue'); $page_data['total_pending_amount'] = $page_data['total_pending_amount'] + $ebook_total_pending_amount; } if (addon_status('tutor_booking')) { $this->db->select_sum('instructor_revenue'); $this->db->where('tutor_id', $this->session->userdata('user_id')); $this->db->from('tutor_payment'); $tutor_total_pending_amount = $this->db->get()->row('instructor_revenue'); $page_data['total_pending_amount'] = $page_data['total_pending_amount'] + $tutor_total_pending_amount; } $this->load->view('backend/index', $page_data); } // HANDLED WITHDRAWAL REQUESTS public function withdrawal($action = "") { if ($this->session->userdata('user_login') != true) { redirect(site_url('login'), 'refresh'); } if ($action == 'request') { $this->crud_model->add_withdrawal_request(); } if ($action == 'delete') { $this->crud_model->delete_withdrawal_request(); } redirect(site_url('user/payout_report'), 'refresh'); } // Ajax Portion public function ajax_get_video_details() { $video_details = $this->video_model->getVideoDetails($_POST['video_url']); if (is_array($video_details)) { echo $video_details['duration']; } } // AJAX PORTION // this function is responsible for managing multiple choice question function quiz_fields_type_wize() { $page_data['question_type'] = $this->input->post('question_type'); $this->load->view('backend/user/quiz_fields_type_wize', $page_data); } // This function checks if this course belongs to current logged in instructor function is_the_course_belongs_to_current_instructor($course_id, $id = null, $type = null, $is_ajax_call = null) { $is_valid = 1; $course_details = $this->crud_model->get_course_by_id($course_id); if ($course_details->num_rows() > 0) { $course_details = $course_details->row_array(); if ($course_details['multi_instructor']) { $instructor_ids = explode(',', $course_details['user_id']); if (!in_array($this->session->userdata('user_id'), $instructor_ids)) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_course')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } } else { if ($course_details['user_id'] != $this->session->userdata('user_id')) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_course')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } } } else { $this->session->set_flashdata('error_message', get_phrase('course_not_found')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } if ($type == 'section' && $this->db->get_where('section', array('id' => $id, 'course_id' => $course_id))->num_rows() <= 0) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_section')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } if ($type == 'lesson' && $this->db->get_where('lesson', array('id' => $id, 'course_id' => $course_id))->num_rows() <= 0) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_lesson')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } if ($type == 'quize' && $this->db->get_where('lesson', array('id' => $id, 'course_id' => $course_id))->num_rows() <= 0) { $this->session->set_flashdata('error_message', get_phrase('you_do_not_have_right_to_access_this_quize')); $is_valid = 0; if ($is_ajax_call == null) { redirect(site_url('user/courses'), 'refresh'); } } return $is_valid; } public function ajax_sort_section() { $section_json = $this->input->post('itemJSON'); $this->crud_model->sort_section($section_json); } public function ajax_sort_lesson() { $lesson_json = $this->input->post('itemJSON'); $this->crud_model->sort_lesson($lesson_json); } public function ajax_sort_question() { $question_json = $this->input->post('itemJSON'); $this->crud_model->sort_question($question_json); } // REMOVING INSTRUCTOR FROM COURSE public function remove_an_instructor($course_id, $instructor_id) { $course_details = $this->crud_model->get_course_by_id($course_id)->row_array(); if ($course_details['creator'] == $instructor_id) { $this->session->set_flashdata('error_message', get_phrase('course_creator_can_be_removed')); redirect('admin/course_form/course_edit/' . $course_id); } if ($course_details['multi_instructor']) { $instructor_ids = explode(',', $course_details['user_id']); if (in_array($instructor_id, $instructor_ids) && in_array($this->session->userdata('user_id'), $instructor_ids)) { if (count($instructor_ids) > 1) { if (($key = array_search($instructor_id, $instructor_ids)) !== false) { unset($instructor_ids[$key]); $data['user_id'] = implode(",", $instructor_ids); $this->db->where('id', $course_id); $this->db->update('course', $data); $this->session->set_flashdata('flash_message', get_phrase('instructor_has_been_removed')); if ($this->session->userdata('user_id') == $instructor_id) { redirect('user/courses/'); } else { redirect('user/course_form/course_edit/' . $course_id); } } } else { $this->session->set_flashdata('error_message', get_phrase('a_course_should_have_at_least_one_instructor')); redirect('user/course_form/course_edit/' . $course_id); } } else { $this->session->set_flashdata('error_message', get_phrase('invalid_instructor_id')); redirect('user/course_form/course_edit/' . $course_id); } } else { $this->session->set_flashdata('error_message', get_phrase('a_course_should_have_at_least_one_instructor')); redirect('user/course_form/course_edit/' . $course_id); } } //Blog start function add_blog() { $page_data['page_title'] = get_phrase('add_blog'); $page_data['page_name'] = 'blog_add'; $this->load->view('backend/index', $page_data); } function edit_blog($blog_id = "") { $page_data['blog'] = $this->crud_model->get_blogs($blog_id)->row_array(); $page_data['page_title'] = get_phrase('edit_blog'); $page_data['page_name'] = 'blog_edit'; $this->load->view('backend/index', $page_data); } function blog($param1 = "", $param2 = "") { if (!get_frontend_settings('instructors_blog_permission')) { $this->session->set_flashdata('error_message', get_phrase('access_to_the_blog_section_denied')); redirect(site_url('user/dashboard'), 'refresh'); } if ($param1 == 'add') { $this->crud_model->add_blog(); $this->session->set_flashdata('flash_message', get_phrase('blog_added_successfully')); redirect(site_url('user/pending_blog'), 'refresh'); } elseif ($param1 == 'update') { if ($this->check_validity($param2)) { $this->crud_model->update_blog($param2); } $this->session->set_flashdata('flash_message', get_phrase('blog_updated_successfully')); redirect(site_url('user/blog'), 'refresh'); } elseif ($param1 == 'status') { if ($this->check_validity($param2)) { $this->crud_model->update_blog_status($param2); } $this->session->set_flashdata('flash_message', get_phrase('blog_status_has_been_updated')); redirect(site_url('user/blog'), 'refresh'); } elseif ($param1 == 'delete') { if ($this->check_validity($param2)) { $this->crud_model->blog_delete($param2); } $this->session->set_flashdata('flash_message', get_phrase('blog_deleted_successfully')); redirect(site_url('user/blog'), 'refresh'); } $page_data['blogs'] = $this->crud_model->get_blogs_by_user_id($this->session->userdata('user_id')); $page_data['page_title'] = get_phrase('blog'); $page_data['page_name'] = 'blog'; $this->load->view('backend/index', $page_data); } function pending_blog($param1 = "", $param2 = "") { if ($param1 == 'delete') { if ($this->check_validity($param2)) { $this->crud_model->blog_delete($param2); } $this->session->set_flashdata('flash_message', get_phrase('blog_deleted_successfully')); redirect(site_url('user/pending_blog'), 'refresh'); } $page_data['pending_blogs'] = $this->crud_model->get_instructors_pending_blog($this->session->userdata('user_id')); $page_data['page_title'] = get_phrase('pending_blog'); $page_data['page_name'] = 'pending_blog'; $this->load->view('backend/index', $page_data); } function check_validity($blog_id = "") { $this->db->where('user_id', $this->session->userdata('user_id')); $this->db->where('blog_id', $blog_id); $query = $this->db->get('blogs'); if ($query->num_rows() > 0) { return true; } else { return false; } } //End Blog function start_quiz($quiz_id = "", $retake = "") { $quiz_details = $this->crud_model->get_lessons('lesson', $quiz_id)->row_array(); $data['quiz_id'] = $quiz_details['id']; $data['user_id'] = $this->session->userdata('user_id'); $data['user_answers'] = json_encode(array()); $data['correct_answers'] = json_encode(array()); $data['date_added'] = time(); $data['date_updated'] = time(); $data['is_submitted'] = 0; $data['total_obtained_marks'] = 0; $row = $this->db->get_where('quiz_results', array('user_id' => $data['user_id'], 'quiz_id' => $quiz_id)); $total_attemped = $this->db->where('quiz_id', $quiz_id)->where('user_id', $data['user_id'])->get('quiz_results')->num_rows(); if ($quiz_details['quiz_attempt'] == 0 && $row->num_rows() <= 0 || $quiz_details['quiz_attempt'] > ($total_attemped - 1)) : if ($this->db->get_where('quiz_results', array('user_id' => $data['user_id'], 'is_submitted' => 0, 'quiz_id' => $quiz_id))->num_rows() == 0) : $this->db->insert('quiz_results', $data); endif; endif; if ($retake != "") { $course_title = $this->crud_model->get_course_by_id($quiz_details['course_id'])->row('title'); redirect(site_url('home/lesson/' . slugify($course_title) . '/' . $quiz_details['course_id'] . '/' . $quiz_details['id']), 'refresh'); } $page_data['quiz_questions'] = $this->db->get_where('question', array('quiz_id' => $quiz_id)); $page_data['quiz_id'] = $quiz_id; $this->load->view('lessons/quiz_answer_sheet', $page_data); } function submit_quiz_answer($quiz_id = "", $question_id = "", $question_type = "") { //Quize details $user_id = $this->session->userdata('user_id'); $quiz_details = $this->crud_model->get_lessons('lesson', $quiz_id)->row_array(); $total_seconds = time_to_seconds($quiz_details['duration']); $total_marks = json_decode($quiz_details['attachment'], true)['total_marks']; //Question details $question_details = $this->db->get_where('question', array('id' => $question_id))->row_array(); $results = $this->db->order_by('quiz_result_id', 'desc')->get_where('quiz_results', array('quiz_id' => $quiz_id, 'user_id' => $user_id)); if ($results->num_rows() > 0 && ($total_seconds + $results->row('date_added')) > time() || $total_seconds == 0) { $result = $results->row_array(); $correct_answer_question_ids = json_decode($result['correct_answers'], true); $answers = $this->input->post('answer'); $user_answers = json_decode($result['user_answers'], true); $user_answers[$question_id] = $answers; if ($question_type == 'multiple_choice') { $is_correct_answer = 1; $currect_answers = json_decode($question_details['correct_answers'], true); foreach ($answers as $answer) { if (!in_array($answer, $currect_answers)) { $is_correct_answer = 0; } } if (!is_array($answers) || count($answers) <= 0 || count($currect_answers) != count($answers)) { $is_correct_answer = 0; } } elseif ($question_type == 'single_choice') { $is_correct_answer = 0; $currect_answers = json_decode($question_details['correct_answers'], true); if (in_array($answers[0], $currect_answers)) { $is_correct_answer = 1; } } elseif ($question_type == 'fill_in_the_blank') { $is_correct_answer = 1; $currect_answers = json_decode(strtolower($question_details['correct_answers']), true); foreach ($answers as $key => $answer) { $answer = strtolower($answer); if ($answer != $currect_answers[$key]) { $is_correct_answer = 0; } } if (!is_array($answers) || count($answers) <= 0 || count($currect_answers) != count($answers)) { $is_correct_answer = 0; } } if ($is_correct_answer == 1) { if (!in_array($question_id, $correct_answer_question_ids)) { array_push($correct_answer_question_ids, $question_id); } } else { $updated_correct_answer_question_ids = array(); foreach ($correct_answer_question_ids as $correct_answer_question_id) { if ($correct_answer_question_id != $question_id) { array_push($updated_correct_answer_question_ids, $correct_answer_question_id); } } $correct_answer_question_ids = $updated_correct_answer_question_ids; } $total_questions = $this->db->get_where('question', array('quiz_id' => $quiz_id))->num_rows(); $data['total_obtained_marks'] = round(($total_marks / $total_questions) * count($correct_answer_question_ids), 1); $data['user_answers'] = json_encode($user_answers); $data['correct_answers'] = json_encode($correct_answer_question_ids); $data['date_updated'] = time(); $this->db->where('user_id', $user_id); $this->db->where('quiz_id', $quiz_id); $this->db->where('is_submitted', 0); $this->db->update('quiz_results', $data); } else { $this->finish_quize_submission($quiz_id); $response['status'] = 'time_over'; $response['message'] = site_phrase('time_over'); echo json_encode($response); } } function finish_quize_submission($quiz_id = "") { $user_id = $this->session->userdata('user_id'); $data['is_submitted'] = 1; $this->db->where('user_id', $user_id); $this->db->where('is_submitted', 0); $this->db->where('quiz_id', $quiz_id); $this->db->update('quiz_results', $data); //Mark this quiz as completed $lesson = $this->crud_model->get_lessons('lesson', $quiz_id)->row_array(); $completed_lessons = $this->crud_model->get_watch_histories($user_id, $lesson['course_id'])->row_array(); $course_details = $this->crud_model->get_course_by_id($lesson['course_id'])->row_array(); $quiz_results = $this->db->where('user_id', $user_id)->where('quiz_id', $quiz_id)->order_by('quiz_result_id', 'DESC')->get('quiz_results')->row_array(); $completed_lessons = json_decode($completed_lessons['completed_lesson'], true); if (!is_array($completed_lessons) || !in_array($quiz_id, $completed_lessons)) { //check passing mark $quiz_attribute = json_decode($lesson['attachment'], true); $pass_mark = $quiz_attribute['pass_mark'] ?? 0; $drip_content_for_passing_rule = $quiz_attribute['drip_content_for_passing_rule'] ?? 'not_applicable'; if ($course_details['enable_drip_content'] && $drip_content_for_passing_rule == 'applicable') { if ($pass_mark <= $quiz_results['total_obtained_marks']) { $this->crud_model->update_watch_history_manually($quiz_id, $lesson['course_id'], $user_id); } } else { $this->crud_model->update_watch_history_manually($quiz_id, $lesson['course_id'], $user_id); } } $response['status'] = 'submit'; $response['message'] = site_phrase('quiz_submission_successfully'); echo json_encode($response); } function ai_img_download() { $this->load->model('addons/ai_model'); $this->ai_model->ai_img_download(); } function chat_gpt() { if (isset($_POST['service_type']) && !empty($_POST['service_type'])) { $this->load->model('addons/ai_model'); echo $this->ai_model->chat_gpt(); } else { $this->load->view('backend/admin/chat_gpt'); } } function gpt_assistant() { $this->load->model('addons/ai_model'); echo $this->ai_model->gpt_assistant(); } function student_academic_progress($course_id = "") { $course_details = $this->crud_model->get_course_by_id($course_id)->row_array(); $multi_instructors = explode(',', $course_details['user_id']); if (!in_array($this->session->userdata('user_id'), $multi_instructors)) { return false; } $page_data['course_details'] = $course_details; $this->load->view('backend/user/student_academic_progress', $page_data); } function student_academic_quiz_result($course_id = "", $student_id = "") { $course_details = $this->crud_model->get_course_by_id($course_id)->row_array(); $multi_instructors = explode(',', $course_details['user_id']); if (!in_array($this->session->userdata('user_id'), $multi_instructors)) { return false; } $page_data['course_details'] = $course_details; $page_data['student_id'] = $student_id; $this->load->view('backend/user/student_academic_quiz_result', $page_data); } function student_certificate($user_id = "", $course_id = "") { $this->load->model('addons/Certificate_model', 'certificate_model'); $course_progress = $this->crud_model->get_watch_histories($user_id, $course_id)->row('course_progress'); if ($course_progress >= 100) { $this->certificate_model->check_certificate_eligibility($course_id, $user_id); $certificate = $this->db->get_where('certificates', array('course_id' => $course_id, 'student_id' => $user_id)); redirect(site_url('certificate/' . $certificate->row('shareable_url'))); } else { $this->session->set_flashdata('error_message', get_phrase('The course is not compleated yet')); redirect(site_url('user/course_form/course_edit/' . $certificate->row('shareable_url'))); } } function resource_files($param1 = "", $param2 = "") { if ($param1 == 'add') { if (isset($_FILES['resource_file']['name']) && $_FILES['resource_file']['name'] != "") { $data['file_name'] = random(20) . '.' . pathinfo($_FILES['resource_file']['name'], PATHINFO_EXTENSION); move_uploaded_file($_FILES['resource_file']['tmp_name'], 'uploads/resource_files/' . $data['file_name']); } $data['title'] = $this->input->post('title'); $data['lesson_id'] = $param2; $data['created_at'] = time(); $this->db->insert('resource_files', $data); $response['replace'] = ['elem' => '.resource_file_content', 'content' => $this->load->view('backend/user/resource_files', ['param2' => $param2], true)]; echo json_encode($response); } elseif ($param1 == 'update') { $file_details = $this->db->get_where('resource_files', ['id' => $param2])->row_array(); if (isset($_FILES['resource_file']['name']) && $_FILES['resource_file']['name'] != "") { if (file_exists('uploads/resource_files/' . $file_details['file_name']) && $file_details['file_name']) { unlink('uploads/resource_files/' . $file_details['file_name']); } $data['file_name'] = random(20) . '.' . pathinfo($_FILES['resource_file']['name'], PATHINFO_EXTENSION); move_uploaded_file($_FILES['resource_file']['tmp_name'], 'uploads/resource_files/' . $data['file_name']); } $data['title'] = $this->input->post('title'); $data['updated_at'] = time(); $this->db->where('id', $param2); $this->db->update('resource_files', $data); $response['replace'] = ['elem' => '.resource_file_content', 'content' => $this->load->view('backend/user/resource_files', ['param2' => $file_details['lesson_id']], true)]; echo json_encode($response); } elseif ($param1 == 'delete') { $file_details = $this->db->get_where('resource_files', ['id' => $param2])->row_array(); if (file_exists('uploads/resource_files/' . $file_details['file_name']) && $file_details['file_name']) { unlink('uploads/resource_files/' . $file_details['file_name']); } $this->db->where('id', $param2); $this->db->delete('resource_files'); $response['replace'] = ['elem' => '.resource_file_content', 'content' => $this->load->view('backend/user/resource_files', ['param2' => $file_details['lesson_id']], true)]; $response['success'] = get_phrase('Resource deleted successfully'); $response['fadeOut'] = '#resource_file_' . $file_details['id']; echo json_encode($response); } } function save_bbb_meeting($course_id = "") { $user_id = $this->session->userdata('user_id'); if (!$this->crud_model->is_course_instructor($course_id, $user_id)) { return; } $data['meeting_id'] = $this->input->post('bbb_meeting_id'); $data['moderator_pw'] = $this->input->post('bbb_moderator_pw'); $data['viewer_pw'] = $this->input->post('bbb_viewer_pw'); $data['instructions'] = $this->input->post('instructions'); if ($this->db->where('course_id', $course_id)->get('bbb_meetings')->num_rows() > 0) { $data['updated_at'] = time(); $this->db->where('course_id', $course_id)->update('bbb_meetings', $data); } else { $data['course_id'] = $course_id; $data['created_at'] = time(); $data['updated_at'] = $data['created_at']; $this->db->insert('bbb_meetings', $data); } echo get_phrase("BigBlueButton Meeting has been updated"); } function start_bbb_meeting($course_id = "") { $user_id = $this->session->userdata('user_id'); if (!$this->crud_model->is_course_instructor($course_id, $user_id)) { return; } $course_details = $this->crud_model->get_courses($course_id)->row_array(); $bbb_meeting = $this->db->where('course_id', $course_id)->get('bbb_meetings'); $current_url = site_url('user/course_form/course_edit/' . $course_id . '?tab=bbb-live-class'); if ($bbb_meeting->num_rows() > 0) { $bbb_meeting = $bbb_meeting->row_array(); //Sanitize API URL START $api_url = get_settings('bbb_setting', true)['endpoint'] ?? ''; // Parse the URL $parsed_url = parse_url($api_url); // Remove the 'api' part if it exists in the path $path = rtrim(str_replace('/api', '', $parsed_url['path']), '/'); // Rebuild the URL $api_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $path; //Sanitize API URL END //Create BBB meeting START $query_data = http_build_query([ 'name' => $course_details['title'], 'meetingID' => $bbb_meeting['meeting_id'], 'attendeePW' => $bbb_meeting['viewer_pw'], 'moderatorPW' => $bbb_meeting['moderator_pw'], 'redirectURL' => $current_url, ]); $response = $this->crud_model->callBbbApi('create', $query_data); //Create BBB meeting END // Handle response & redirect to meeting url if ($response) { $xml = simplexml_load_string($response); $returncode = (string)$xml->returncode; if ($returncode == 'SUCCESS') { $moderator_details = $this->user_model->get_all_user($this->session->userdata('user_id'))->row_array(); //JOIN AS A viewer $full_name = $moderator_details['first_name'] . ' ' . $moderator_details['last_name']; // The full name of the participant $role = 'moderator'; // The role of the user (either "viewer" or "moderator") $join_url = $api_url . "/api/join?meetingID=" . $bbb_meeting['meeting_id'] . "&fullName=$full_name&password=" . $bbb_meeting['moderator_pw'] . "&joinViaHtml5=true&redirect=true&joinParam[role]=$role"; echo $join_url; return; } else { $this->session->set_flashdata('error_message', get_phrase("Failed to create meeting. Error code: ____", [$returncode])); } } else { $this->session->set_flashdata('error_message', get_phrase("Failed to connect to BigBlueButton API")); } } else { $this->session->set_flashdata('error_message', get_phrase("Please save your meeting info first")); } echo $current_url; } function join_bbb_meeting($course_id = "") { if (enroll_status($course_id) == 'valid') { $bbb_meeting = $this->db->where('course_id', $course_id)->get('bbb_meetings'); $current_url = $_SERVER['HTTP_REFERER']; if ($bbb_meeting->num_rows() > 0) { $bbb_meeting = $bbb_meeting->row_array(); //Sanitize API URL START $api_url = get_settings('bbb_setting', true)['endpoint'] ?? ''; // Parse the URL $parsed_url = parse_url($api_url); // Remove the 'api' part if it exists in the path $path = rtrim(str_replace('/api', '', $parsed_url['path']), '/'); // Rebuild the URL $api_url = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $path; //Sanitize API URL END //JOIN AS A viewer [JOIN LINK] $viewer_details = $this->user_model->get_all_user($this->session->userdata('user_id'))->row_array(); $full_name = $viewer_details['first_name'] . ' ' . $viewer_details['last_name']; // The full name of the participant $role = 'viewer'; // The role of the user (either "viewer" or "moderator") $join_url = $api_url . "/api/join?meetingID=" . $bbb_meeting['meeting_id'] . "&fullName=$full_name&password=" . $bbb_meeting['moderator_pw'] . "&joinViaHtml5=true&redirect=true&joinParam[role]=$role"; redirect($join_url, 'refresh'); } else { $this->session->set_flashdata('error_message', get_phrase("Meeting not scheduled yet")); } redirect($current_url, 'refresh'); } else { $this->session->set_flashdata('error_message', get_phrase("Please purchase this course first")); redirect(site_url('home/my_courses'), 'refresh'); } } }