cms-token/@core/app/Http/Controllers/CoursesController.php

575 lines
22 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Actions\SlugChecker;
use App\Course;
use App\CourseCurriculm;
use App\CourseCurriculmLang;
use App\CourseInstructor;
use App\CourseLang;
use App\CourseLession;
use App\CourseLessionLang;
use App\CoursesCategory;
use App\Helpers\NexelitHelpers;
use App\Http\Requests\SlugCheckRequest;
use App\Knowledgebase;
use App\Language;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class CoursesController extends Controller
{
const BASE_PATH = 'backend.courses.';
private $all_languages;
public function __construct()
{
$this->all_languages = $this->all_languages ?? Language::all();
}
public function all()
{
$all_courses = Course::all();
return view(self::BASE_PATH . 'courses-all')->with(['all_courses' => $all_courses]);
}
public function new()
{
$all_categories = CoursesCategory::with('lang')->get();
$all_instructor = CourseInstructor::all();
return view(self::BASE_PATH . 'course-new')->with([
'all_categories' => $all_categories,
'all_instructor' => $all_instructor,
'all_languages' => $this->all_languages,
]);
}
public function store(Request $request)
{
//validate data
$this->validate($request, [
'title' => 'check_array:1',
'price' => 'required|numeric',
'max_student' => 'nullable|numeric',
'duration' => 'required|string',
'duration_type' => 'required|string',
'instructor_id' => 'required|string',
'external_url' => 'nullable|string',
'featured' => 'nullable|string',
'image' => 'nullable|string',
'og_meta_image' => 'nullable|string',
'status' => 'required|string',
'curriculum_title' => 'check_array:1',
],[
'title.check_array' => __('enter title for all languages'),
'curriculum_title.check_array' => __('enter curriculum title for all languages'),
]);
DB::beginTransaction();
//insert data in course
$course_id = Course::create([
'image' => $request->image,
'status' => $request->status,
'duration' => $request->duration,
'duration_type' => $request->duration_type,
'max_student' => $request->max_student,
'enrolled_student' => 0,
'featured' => $request->featured,
'external_url' => $request->external_url,
'price' => $request->price,
'sale_price' => $request->sale_price,
'enroll_required' => $request->enroll_required,
'og_meta_image' => $request->og_meta_image,
'instructor_id' => $request->instructor_id,
'categories_id' => $request->categories_id
])->id;
$curriculum_title = $request->curriculum_title;
$curriculum_description = $request->curriculum_description;
$course_lesson = $request->course_lesson;
$currculmn_ids = [];
foreach ($curriculum_title as $key => $cur_title) {
//insert data in curruculmn talbe
$curriculum_id = CourseCurriculm::create([
'course_id' => $course_id
])->id;
$currculmn_ids[] = $curriculum_id;
foreach ($this->all_languages as $lang) {
CourseCurriculmLang::create([
'curriculum_id' => $curriculum_id,
'lang' => $lang->slug,
'title' => $cur_title[$lang->slug] ?? '',
'description' => $curriculum_description[$key][$lang->slug] ?? ''
]);
}
//
//insert data in lession with curriculmn and course
foreach ($course_lesson[$key] as $lesson) {
$lesson_id = CourseLession::create([
'course_id' => $course_id,
'curriculum_id' => $curriculum_id,
'status' => 'publish',
'preview' => 'no'
])->id;
foreach ($this->all_languages as $lang) {
CourseLessionLang::create([
'lession_id' => $lesson_id,
'lang' => $lang->slug,
'title' => $lesson
]);
}
}
}
Course::findOrFail($course_id)->update([
'curriculum_id' => $currculmn_ids,
]);
//
foreach ($this->all_languages as $lang) {
//course lang
CourseLang::create([
'course_id' => $course_id,
'lang' => $lang->slug,
'title' => $request->title[$lang->slug] ?? '',
'slug' => $request->slug[$lang->slug] ? \Str::slug($request->slug[$lang->slug]) : \Str::slug($request->title[$lang->slug] ?? ''),
'description' => $request->description[$lang->slug] ?? '',
'meta_tag' => $request->meta_tags[$lang->slug] ?? '',
'meta_title' => $request->meta_title[$lang->slug] ?? '',
'meta_description' => $request->meta_description[$lang->slug] ?? '',
'og_meta_title' => $request->og_meta_title[$lang->slug] ?? '',
]);
}
DB::commit();
try {
} catch (\Throwable $e) {
DB::rollBack();
}
return back()->with(NexelitHelpers::item_new());
}
public function edit($id)
{
$all_categories = CoursesCategory::with('lang')->get();
$all_instructor = CourseInstructor::all();
$course = Course::findOrFail($id);
$curriculumn_ids = unserialize($course->curriculum_id,['class' => false]);
$all_curriculumns = CourseCurriculm::whereIn('id',$curriculumn_ids)->get();
$all_curriculumn_with_lesson = [];
foreach ($all_curriculumns as $curriculumn){
$all_lang = $curriculumn->lang_all;
foreach ($all_lang as $item){
$all_curriculumn_with_lesson[$curriculumn->id]['curriculum'][$item->lang] = [
'title' => $item->title,
'description' => $item->description
];
}
$all_lesson = CourseLession::where(['curriculum_id' => $curriculumn->id, 'course_id' => $id])->get();
foreach ($all_lesson as $lesson){
$all_langs = $lesson->lang_all;
foreach ($all_langs as $lang){
$all_curriculumn_with_lesson[$curriculumn->id]['lessons'][$lesson->id][$lang->lang] = [
'curriculum_id' => $lesson->curriculum_id,
'lession_id' => $lang->lession_id,
'title' => $lang->title
];
}
}
}
return view(self::BASE_PATH . 'course-edit')->with([
'all_categories' => $all_categories,
'all_instructor' => $all_instructor,
'all_languages' => $this->all_languages,
'course' => $course,
'all_curriculumn_with_lesson' => $all_curriculumn_with_lesson,
]);
}
//currilumn_ajax
public function currilumn_ajax(Request $request)
{
//get course details for curricu update
$course_details = Course::findOrFail($request->course_id);
//add new curriculmn
$curriculmn_id = CourseCurriculm::create([
'course_id' => $request->course_id
])->id;
$cur_ids = unserialize($course_details->curriculum_id, ['class' => false]);
$cur_ids[] = $curriculmn_id;
$course_details->curriculum_id = $cur_ids;
$course_details->save();
//add new data for curilumn lang
$lession_id = CourseLession::create([
'course_id' => $request->course_id,
'curriculum_id' => $curriculmn_id,
'status' => 'publish'
])->id;
foreach ($this->all_languages as $lang) {
CourseCurriculmLang::create([
'curriculum_id' => $curriculmn_id,
'lang' => $lang->slug,
'title' => __('curriculum title'),
'description' => '',
]);
CourseLessionLang::create([
'lession_id' => $lession_id,
'lang' => $lang->slug,
'title' => __('lesson title')
]);
}
//return json response with curricumn id
return response()->json([
'lesson_id' => $lession_id,
'curriculum_id' => $curriculmn_id,
]);
}
public function currilumn_ajax_delete(Request $request)
{
$curriculmn__id = $request->curriculmn__id;
CourseCurriculm::find($curriculmn__id)->delete();
CourseCurriculmLang::where('curriculum_id', $curriculmn__id)->delete();
$all_lesson = CourseLession::where('curriculum_id', $curriculmn__id)->pluck('id');
CourseLession::where('curriculum_id', $curriculmn__id)->delete();
CourseLessionLang::whereIn('lession_id', $all_lesson)->delete();
$course_details = Course::findOrFail($request->course_id);
$cur_ids = unserialize($course_details->curriculum_id, ['class' => false]);
unset($cur_ids[$curriculmn__id]);
$course_details->curriculum_id = $cur_ids;
$course_details->save();
return response()->json('ok');
}
public function update(Request $request)
{
//validate data
$this->validate($request, [
'title' => 'check_array:1',
'price' => 'required|numeric',
'max_student' => 'nullable|numeric',
'duration' => 'required|string',
'duration_type' => 'required|string',
'instructor_id' => 'required|string',
'external_url' => 'nullable|string',
'featured' => 'nullable|string',
'image' => 'nullable|string',
'og_meta_image' => 'nullable|string',
'status' => 'required|string',
'curriculum_title' => 'check_array:1',
],[
'title.check_array' => __('enter title for all languages')
]);
$course_id = $request->id;
//insert data in course
Course::findOrFail($course_id)->update([
'image' => $request->image,
'status' => $request->status,
'duration' => $request->duration,
'duration_type' => $request->duration_type,
'max_student' => $request->max_student,
'featured' => $request->featured,
'external_url' => $request->external_url,
'price' => $request->price,
'sale_price' => $request->sale_price,
'enroll_required' => $request->enroll_required,
'og_meta_image' => $request->og_meta_image,
'instructor_id' => $request->instructor_id,
'categories_id' => $request->categories_id,
'curriculum_id' => array_keys($request->curriculum_title)
]);
$curriculum_title = $request->curriculum_title;
$curriculum_description = $request->curriculum_description;
$course_lesson = $request->course_lesson;
foreach ($curriculum_title as $cur_id => $cur_title) {
foreach ($this->all_languages as $lang) {
$first_curr = CourseCurriculmLang::where(['curriculum_id' => $cur_id, 'lang' => $lang->slug])->first();
if ($first_curr){
CourseCurriculmLang::updateOrCreate(
['curriculum_id' => $cur_id, 'lang' => $lang->slug],
[
'title' => $cur_title[$lang->slug] ?? '',
'description' => $curriculum_description[$cur_id][$lang->slug] ?? ''
]);
}else{
CourseCurriculmLang::create([
'curriculum_id' => $cur_id,
'lang' => $lang->slug,
'title' => $cur_title[$lang->slug] ?? '',
'description' => $curriculum_description[$cur_id][$lang->slug] ?? ''
]);
}
}
//insert data in lesson with curriculum and course
foreach ($course_lesson[$cur_id] as $les_id => $less_title) {
if (is_array($less_title)) {
CourseLessionLang::where(['lession_id' => $les_id, 'lang' => get_default_language()])->update([
'title' => is_array($less_title) ? current($less_title) : ''
]);
} else {
$lsesson_id = CourseLession::create([
'course_id' => $course_id,
'curriculum_id' => $cur_id,
'status' => 'publish'
])->id;
foreach ($this->all_languages as $langu) {
CourseLessionLang::create([
'lession_id' => $lsesson_id,
'lang' => $langu->slug,
'title' => $less_title
]);
}
}
}
}
foreach ($this->all_languages as $lang) {
//course lang
$slug = \Str::slug($request->slug[$lang->slug] ?? '') ;
CourseLang::updateOrCreate(
['course_id' => $course_id, 'lang' => $lang->slug],
[
'course_id' => $course_id,
'lang' =>$lang->slug,
'title' => $request->title[$lang->slug] ?? '',
'slug' => $slug ?? \Str::slug($request->title[$lang->slug] ?? ''),
'description' => $request->description[$lang->slug] ?? '',
'meta_tag' => $request->meta_tags[$lang->slug] ?? '',
'meta_title' => $request->meta_title[$lang->slug] ?? '',
'meta_description' => $request->meta_description[$lang->slug] ?? '',
'og_meta_title' => $request->og_meta_title[$lang->slug] ?? '',
]);
}
return back()->with(NexelitHelpers::item_update());
}
public function delete($id)
{
$course = Course::findOrFail($id);
$curse_id = $course->id;
$curriculum_ids = unserialize($course->curriculum_id, ['class' => false]);
$all_lesson = CourseLession::whereIn('curriculum_id', $curriculum_ids)->get()->pluck('id');
// delete course
$course->delete();
//delete course lang
CourseLang::where('course_id', $curse_id)->delete();
//delete curriculum table
CourseCurriculm::whereIn('id', $curriculum_ids)->delete();
//delete curriculum lang table
CourseCurriculmLang::whereIn('curriculum_id', $curriculum_ids)->delete();
// delete lesson table
CourseLession::whereIn('id', $all_lesson)->delete();
//delete lesson lang table
CourseLessionLang::whereIn('lession_id', $all_lesson)->delete();
return back()->with(NexelitHelpers::item_delete());
}
public function bulk_action(Request $request)
{
$courses = Course::whereIn('id', $request->ids)->get();
foreach ($courses as $course) {
$curse_id = $course->id;
$curriculum_ids = unserialize($course->curriculum_id, ['class' => false]);
$all_lesson = CourseLession::whereIn('curriculum_id', $curriculum_ids)->get()->pluck('id');
// delete course
$course->delete();
//delete course lang
CourseLang::where('course_id', $curse_id)->delete();
//delete curriculum table
CourseCurriculm::whereIn('id', $curriculum_ids)->delete();
//delete curriculum lang table
CourseCurriculmLang::whereIn('curriculum_id', $curriculum_ids)->delete();
// delete lesson table
CourseLession::whereIn('id', $all_lesson)->delete();
//delete lesson lang table
CourseLessionLang::whereIn('lession_id', $all_lesson)->delete();
}
return response()->json('ok');
}
public function clone(Request $request)
{
$course = Course::findOrFail($request->id);
$curriculum_ids = unserialize($course->curriculum_id, ['class' => false]);
$all_curriculum = CourseCurriculm::whereIn('id', $curriculum_ids)->get();
DB::beginTransaction();
//insert data in course
$course_id = Course::create([
'image' => $course->image,
'status' => 'draft',
'duration' => $course->duration,
'duration_type' => $course->duration_type,
'max_student' => $course->max_student,
'enrolled_student' => 0,
'featured' => $course->featured,
'external_url' => $course->external_url,
'price' => $course->price,
'sale_price' => $course->sale_price,
'enroll_required' => $course->enroll_required,
'og_meta_image' => $course->og_meta_image,
'instructor_id' => $course->instructor_id,
'categories_id' => $course->categories_id
])->id;
$currculmn_ids = [];
foreach ($all_curriculum as $curr) {
$curriculum_id = CourseCurriculm::create([
'course_id' => $course_id
])->id;
$currculmn_ids[] = $curriculum_id;
$course_curr_lang = CourseCurriculmLang::where('curriculum_id', $curr->id)->get();
foreach ($course_curr_lang as $cur_lang) {
CourseCurriculmLang::create([
'curriculum_id' => $curriculum_id,
'lang' => $cur_lang->lang,
'title' => $cur_lang->title,
'description' => $cur_lang->description
]);
}
$course_lessons = CourseLession::where(['curriculum_id' => $curr->id, 'course_id' => $course_id])->get();
foreach ($course_lessons as $cur_lesson) {
$lesson_lang = CourseLessionLang::where('lession_id', $cur_lesson->id)->get();
$lesson_id = CourseLession::create([
'course_id' => $course_id,
'curriculum_id' => $curriculum_id,
'video_embed_code' => $cur_lesson->video_embed_code,
'status' => $cur_lesson->status,
'duration' => $cur_lesson->duration,
'duration_type' => $cur_lesson->duration_type,
'preview' => $cur_lesson->preview,
])->id;
foreach ($lesson_lang as $lesso_item) {
CourseLessionLang::create([
'lession_id' => $lesson_id,
'lang' => $lesso_item->lang,
'title' => $lesso_item->title,
'description' => $lesso_item->description,
]);
}
}
}
Course::findOrFail($course_id)->update([
'curriculum_id' => $currculmn_ids,
]);
$all_course_langs = CourseLang::where('course_id', $course->id)->get();
foreach ($all_course_langs as $curse_lang) {
CourseLang::create([
'course_id' => $course_id,
'lang' => $curse_lang->lang,
'title' => $curse_lang->title,
'slug' => $curse_lang->slug,
'description' => $curse_lang->description,
'meta_tag' => $curse_lang->meta_tags,
'meta_title' => $curse_lang->meta_title,
'meta_description' => $curse_lang->meta_description,
'og_meta_title' => $curse_lang->og_meta_title,
]);
}
DB::commit();
try {
} catch (\Throwable $e) {
DB::rollBack();
}
return back()->with(NexelitHelpers::item_clone());
}
public function settings(){
return view(self::BASE_PATH.'course-settings')->with(['all_languages' => $this->all_languages]);
}
public function settings_update(Request $request){
$this->validate($request,[
'course_page_items' => 'required|string',
'course_notify_mail' => 'nullable|string',
]);
foreach ($this->all_languages as $lang){
$this->validate($request,[
'course_single_'.$lang->slug.'_enroll_button_text' => 'nullable|string',
'course_single_'.$lang->slug.'_reviews_tab_title' => 'nullable|string',
'course_single_'.$lang->slug.'_instructor_tab_title' => 'nullable|string',
'course_single_'.$lang->slug.'_curriculum_tab_title' => 'nullable|string',
'course_single_'.$lang->slug.'_overview_tab_title' => 'nullable|string',
'course_single_'.$lang->slug.'_client_feedback_title' => 'nullable|string',
'course_single_'.$lang->slug.'_leave_feedback_title' => 'nullable|string',
'course_success_'.$lang->slug.'_title' => 'nullable|string',
'course_success_'.$lang->slug.'_description' => 'nullable|string',
'course_cancel_'.$lang->slug.'_title' => 'nullable|string',
'course_cancel_'.$lang->slug.'_description' => 'nullable|string',
]);
$all_fields = [
'course_single_'.$lang->slug.'_enroll_button_text',
'course_single_'.$lang->slug.'_reviews_tab_title',
'course_single_'.$lang->slug.'_instructor_tab_title',
'course_single_'.$lang->slug.'_curriculum_tab_title',
'course_single_'.$lang->slug.'_overview_tab_title',
'course_single_'.$lang->slug.'_client_feedback_title',
'course_single_'.$lang->slug.'_leave_feedback_title',
'course_success_'.$lang->slug.'_title',
'course_success_'.$lang->slug.'_description' ,
'course_cancel_'.$lang->slug.'_title',
'course_cancel_'.$lang->slug.'_description'
];
foreach ($all_fields as $field){
update_static_option($field,$request->$field);
}
}
$fields = [
'course_page_items',
'course_notify_mail',
'course_certificate_bg_image',
];
foreach ($fields as $field){
update_static_option($field,$request->$field);
}
return back()->with(NexelitHelpers::settings_update());
}
public function slug_check(SlugCheckRequest $request){
$user_given_slug = $request->slug;
$query = CourseLang::where(['slug' => $user_given_slug]);
return SlugChecker::Check($request,$query);
}
}