my_parent_controller(); Response::handleSessionTimeout("bo", /*whitelisted route*/['workshop/register']); //load language files $this->load_language_backoffice(); $this->lang->load('backoffice/events', 'fr'); //origin folders $this->hstroke_origin = origin_folders('hstroke'); $this->banner_origin = origin_folders('banner'); //banner and heartstroke folder $this->banner_folder = banner_bundle(); $this->hstroke_folder = hstroke_bundle(); //load model $this->load->model("event_model"); $this->load->model("event_file_attachment_model"); $this->load->model("user_activity_log_model"); $this->load->helper('htmlpurifier'); $this->workshop_event = new WorkshopEvent(); } public function event_duplicate(){ if($this->input->post()) { if($this->event_model->check_event_title($this->input->post('title'), "")){ output_to_json($this, array( "mtype" => "error", "message" => $this->lang->line("event_title_exist"), "field" => "title" )); }else{ output_to_json($this, array( "mtype" => "success" )); } } } public function is_seats_available($event_schedule_id, $subs_type = 1){ $seats_available = $this->event_model->is_seats_available($event_schedule_id, $subs_type); if($seats_available){ output_to_json($this, array( "available" => 1 )); } else{ output_to_json($this, array( "available" => 0 )); } } public function add_event(){ if($this->input->post()) { if(!empty($this->input->post()["p_discount_apply"])){ $this->input->post()["discount_apply"] = $this->input->post()["p_discount_apply"]; unset($this->input->post()["p_discount_apply"]); } if(!empty($this->input->post()["p_discounted_price"])){ $this->input->post()["discounted_price"] = $this->input->post()["p_discounted_price"]; unset($this->input->post()["p_discounted_price"]); } if(!empty($this->input->post()["p_total_available_seat"])){ $this->input->post()["total_available_seat"] = $this->input->post()["p_total_available_seat"]; unset($this->input->post()["p_total_available_seat"]); } if(!empty($this->input->post()["p_rate"])){ $this->input->post()["rate"] = $this->input->post()["p_rate"]; unset($this->input->post()["p_rate"]); } if(!empty($this->input->post()["d_discount_apply"])){ $this->input->post()["discount_apply"] = $this->input->post()["d_discount_apply"]; unset($this->input->post()["d_discount_apply"]); } if(!empty($this->input->post()["d_discounted_price"])){ $this->input->post()["discounted_price"] = $this->input->post()["d_discounted_price"]; unset($this->input->post()["d_discounted_price"]); } if(!empty($this->input->post()["d_total_available_seat"])){ $this->input->post()["total_available_seat"] = $this->input->post()["d_total_available_seat"]; unset($this->input->post()["d_total_available_seat"]); } if(!empty($this->input->post()["d_rate"])){ $this->input->post()["rate"] = $this->input->post()["d_rate"]; unset($this->input->post()["d_rate"]); } /*if($this->event_model->check_event_title($this->input->post('title'), "")){ output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("event_title_exist"), "mdetail" => array(array("field" => "title", "message" => $this->lang->line("event_title_exist"))) )); } else {*/ $new_event_data = array(); $new_event_data = $this->input->post(); if(isset($new_event_data['session_dates'])) $new_event_data['session_dates'] = json_decode($this->input->post('session_dates')); if(isset($new_event_data['workshop_banner']) && !empty($new_event_data['workshop_banner'])) { $new_event_data['workshop_banner'] = $this->add_event_banner($new_event_data['workshop_banner'], 1, 'banner'); } $new_event = $this->check_boxes_is_checked($new_event_data); //$new_event['workshop_banner'] = $this->add_event_banner(); // This is to solve the problem when saving href with target attribute. XSS removes the target=_blank. if(isset($new_event_data['description'])) $new_event_data['description'] = html_purify($this->input->post('description', FALSE), 'comment'); if(isset($new_event_data['domain'])) $new_event_data['domain'] = $this->event_model->get_university_by_domain($new_event_data['domain']); if(isset($new_event_data['workshop_author_description'])) $new_event_data['workshop_author_description'] = html_purify($this->input->post('workshop_author_description'), false, 'comment'); /* total_combined_seat and remaining_combined_seat values must be the same upon event creation */ // if(isset($new_event_data['seat_feature']) && !empty($new_event_data['seat_feature'])){ // if($new_event_data['seat_feature'] == 2){ // //update event dates with combined features // $new_event_data["remaining_combined_seat"] = (isset($new_event_data['total_combined_seat']) && !empty($new_event_data['total_combined_seat']))?$new_event_data['total_combined_seat']:0; // } // } UNSET($new_event_data["event_sponsor_files"], $new_event_data["event_attachment_files"], $new_event_data["event_attachment"], $new_event_data["speaker"], $new_event_data["event_speaker"], $new_event_data["event_sponsor"], $new_event_data["event_schedule"], $new_event_data["event-file-attachment"]); //try to insert new event in event table $event_id = $this->event_model->add_event($this->data["logged_in"]["user_id"], $new_event); if($event_id) { $act_log = $this->user_activity_log_model->add_activity_log(array( "description" => $this->lang->line("added_new_event")." - ".$new_event_data['title'], "user_id" => $this->data["logged_in"]["user_id"], "action" => "ADD", "table_origin" => "event", "reference_id" => $event_id )); //try to insert event schedules by bulk $catch = $this->add_event_schedule_by_bulk($event_id, $new_event_data); // //try to insert event speakers by bulk $catch = $this->add_event_speaker_by_bulk($event_id); // try to uplaod/insert event attachments $catch = $this->add_event_sponsor_by_bulk($event_id); $catch = $this->add_author_works($event_id); $catch = $this->add_event_venue_photos($event_id); //try to upload/insert event sponsors $catch = $this->add_event_attachment_by_bulk($event_id); $catch = $this->add_event_videos($event_id); // if($new_event_data['use_different_address_per_date'] == 0){ // //reset address per date // $this->load->model("event_schedule_model"); // $this->event_schedule_model->reset_address_per_date($event_id); // } if($act_log){ output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("added_new_event") )); } else { output_to_json($this, array( "mtype" => "warning", "message" => $this->lang->line("unknown_error"), "error_log" => $act_log )); } } else { output_to_json($this, array( "mtype" => "error", "message" => $this->lang->line("unknown_error_on_saving") )); } //} //end of event title name duplicate checker //output_to_json($this, $new_event_data); } else { show_404(); } } //edit event information public function update_event($event_id=0){ if($this->input->post() && $event_id) { if($this->event_model->check_event_title($this->input->post('title'), $event_id)){ output_to_json($this, array( "mtype" => "error", "message" => $this->lang->line("event_title_exist"), "mdetail" => array(array("field" => "title", "message" => $this->lang->line("event_title_exist"))) )); } else { $new_event_data = array(); $is_combined_seat = false; $new_event_data = $this->check_boxes_is_checked($this->input->post()); $this->load->model('event_registration_model'); $reservedSeats = $this->event_registration_model->count_total_reserved_seats($event_id); $new_event_data['remaining_combined_seat'] = (int)$new_event_data['total_available_seat'] - $reservedSeats; $event = $this->event_model->event_details_reserved($event_id); // This is to solve the problem when saving href with target attribute. XSS removes the target=_blank. $new_event_data['description'] = html_purify($this->input->post('description', FALSE), 'comment'); //update remaining seat when total_combined_seat is edited if(isset($new_event_data['seat_feature']) && !empty($new_event_data['seat_feature'])){ if($new_event_data['seat_feature'] == 2){ $is_combined_seat = true; $new_event_data = $this->recalculate_combined_seats($event_id, $new_event_data['total_combined_seat'], $new_event_data); if((int) $new_event_data["total_combined_seat"] >= 1 && (int) $new_event_data["rem_com_seats"] == 0) { $this->load->model('event_wait_list_model'); /** * If the seat feature is combined, make sure to update the affected records in the WL * reset the moderation of the subscribers in the WL so that once the event * becomes available again the subscriber who are already * in the WL can now reserve in the event regardless of the moderation */ $this->event_wait_list_model->resetModeratedReservationsFronWaitingListByEvent($event_id); } } } UNSET($new_event_data["event_sponsor_files"], $new_event_data["event_attachment_files"], $new_event_data["event_attachment"], $new_event_data["speaker"], $new_event_data["event_speaker"], $new_event_data["event_sponsor"], $new_event_data["event_schedule"], $new_event_data["event-file-attachment"], $new_event_data['avl_com_seats'], $new_event_data['rem_com_seats']); $update_event = $this->event_model->update_event($this->data["logged_in"]["user_id"], $new_event_data, $event_id); //update attachments // $this->event_file_attachment_model->attachment_type_action($event_id); if($update_event) { /* when switching from per date to combined seats and/or editing combined seats value, all event dates depending on it must change its status too from locked || full to open or from open to locked || full Here, total_comined_seat could also mean as remaining_combined_seat. */ if($is_combined_seat){ //update event dates with combined features $this->load->model("event_schedule_model"); $this->event_schedule_model->update_combined_feature_event_dates($event_id, $new_event_data['remaining_combined_seat']); } if($new_event_data['use_different_address_per_date'] == 0){ //reset address per date $this->load->model("event_schedule_model"); $this->event_schedule_model->reset_address_per_date($event_id); } $act_log = $this->user_activity_log_model->add_activity_log(array( "description" => $this->lang->line("updated_event")." - ".$this->input->post('title'), "user_id" => $this->data["logged_in"]["user_id"], "action" => "EDIT", "table_origin" => "event", "reference_id" => $event_id )); // Update event schedule/sessions $new_event_data['session_dates'] = json_decode($this->input->post('session_dates')); $this->update_event_schedule_by_bulk($event_id, $new_event_data); $this->update_author_works($event_id); $this->update_venue_photos($event_id); $this->update_event_comments($event_id); $this->update_event_videos($event_id); if($act_log){ if($new_event_data['event_status'] == 'CANCEL' && $event->event_status != 'CANCEL') { $this->workshop_event->sendEventUpdate($event, 4); } else if($this->input->post('sendUpdateEmail')) { if($this->input->post('editedDate')) { $edited_date = json_decode($this->input->post('editedDate')); $event->start_date_time = $edited_date->date; } $this->workshop_event->sendEventUpdate($event, 6); // } else if($new_event_data['event_status'] == 'AVAILABLE' && $event->event_status == 'SOON') { // $this->workshop_event->sendEventUpdate($event, 3); } output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("updated_event") )); } else { output_to_json($this, array( "mtype" => "warning", "message" => $this->lang->line("unknown_error") )); } } else { output_to_json($this, array( "mtype" => "error", "message" => $this->lang->line("unknown_error_on_saving") )); } } } else { show_404(); } } private function recalculate_combined_seats($event_id, $input_seats, $new_event_data){ $this->load->model('event_schedule_model'); $seats_info = $this->event_schedule_model->get_event_sched_combined_seats_info($event_id); $add_to_total_combined_seat = $input_seats - $seats_info["rem_com_seats"]; $new_event_data['total_combined_seat'] = $seats_info["avl_com_seats"] + (($add_to_total_combined_seat<=0)?0:$add_to_total_combined_seat); $new_event_data['remaining_combined_seat'] = $input_seats; return $new_event_data; } //delete event information public function delete_event($event_id=0){ if($this->input->post() && $event_id) { $delete_event = $this->event_model->delete_event($event_id); if($delete_event) { $act_log = $this->user_activity_log_model->add_activity_log(array( "description" => $this->lang->line("event_deleted")." - ".$event_id, "user_id" => $this->data["logged_in"]["user_id"], "action" => "DELETE", "table_origin" => "event", "reference_id" => $event_id )); if ($act_log) { output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("event_deleted") )); } else { output_to_json($this, array( "mtype" => "warning", "message" => $this->lang->line("unknown_error") )); } } } else { show_404(); } } private function check_boxes_is_checked($new_event_data){ /*** Need to check if these fields are checked or not ****/ $new_event['title'] = !empty($new_event_data['title'])? $new_event_data['title']: NULL; $new_event['city_location'] = !empty($new_event_data['city_location'])? $new_event_data['city_location']: NULL; $new_event['address'] = !empty($new_event_data['address'])? $new_event_data['address']: NULL; $new_event['event_type_id'] = !empty($new_event_data['event_type_id'])? $new_event_data['event_type_id']: NULL; $new_event['event_category'] = !empty($new_event_data['event_category'])? $new_event_data['event_category']: NULL; $new_event['rate'] = !empty($new_event_data['rate'])? $new_event_data['rate']: 0; $new_event['number_of_sessions'] = !empty($new_event_data['number_of_sessions'])? $new_event_data['number_of_sessions']: 0; $new_event['hours_per_session'] = !empty($new_event_data['hours_per_session'])? $new_event_data['hours_per_session']: 0; $new_event['total_available_seat'] = !empty($new_event_data['total_available_seat'])? $new_event_data['total_available_seat']: 0; $new_event['remaining_combined_seat'] = !empty($new_event_data['total_available_seat'])? $new_event_data['total_available_seat']: 0; if($new_event_data['workshop_session'] == 'ENLIGNE') { $new_event['start_date_time'] = date("Y-m-d H:i:s"); $new_event['end_date_time'] = date("Y-m-d H:i:s", strtotime('+5 years')); $new_event['reservation_start_date'] = date("Y-m-d H:i:s"); $new_event['reservation_end_date'] = date("Y-m-d H:i:s"); } else { $new_event['start_date_time'] = !empty($new_event_data['start_date_time']) ? $new_event_data['start_date_time'] : NULL; $new_event['end_date_time'] = !empty($new_event_data['end_date_time']) ? $new_event_data['end_date_time'] : NULL; $new_event['reservation_start_date'] = !empty($new_event_data['reservation_start_date']) ? $new_event_data['reservation_start_date'] : NULL; $new_event['reservation_end_date'] = !empty($new_event_data['reservation_end_date']) ? $new_event_data['reservation_end_date'] : NULL; } $new_event['tag'] = $new_event_data['tag']; $new_event['night_class_prices'] = !empty($new_event_data['night_class_prices']) ? $new_event_data['night_class_prices']: NULL; $new_event['event_status'] = !empty($new_event_data['event_status']) ? $new_event_data['event_status'] : NULL; $new_event['back_office_status'] = !empty($new_event_data['back_office_status']) ? $new_event_data['back_office_status'] : 0; $new_event['location'] = $new_event_data['location']; $new_event['description'] = (isset($new_event_data['description']) && !empty($new_event_data['description']))? html_purify($new_event_data['description'], false): ""; $new_event['workshop_author'] = (isset($new_event_data['workshop_author']) && !empty($new_event_data['workshop_author']))?$new_event_data['workshop_author']:NULL; $new_event['author_label'] = (isset($new_event_data['author_label']) && !empty($new_event_data['author_label']))?$new_event_data['author_label']:NULL; $new_event['workshop_event_type'] = (isset($new_event_data['workshop_event_type']) && !empty($new_event_data['workshop_event_type']))?$new_event_data['workshop_event_type']:NULL; $new_event['workshop_author_description'] = (isset($new_event_data['workshop_author_description']) && !empty($new_event_data['workshop_author_description']))? html_purify($new_event_data['workshop_author_description'], false): ""; $new_event['is_favorite'] = (isset($new_event_data['is_favorite']) && !empty($new_event_data['is_favorite']))?1:0; $new_event['workshop_banner'] = (isset($new_event_data['workshop_banner']) && !empty($new_event_data['workshop_banner']))?$new_event_data['workshop_banner']:NULL; $new_event['is_multiple_reservation'] = (isset($new_event_data['is_multiple_reservation']) && !empty($new_event_data['is_multiple_reservation']))?1:0; $new_event['is_multiple_waitlist_reservation'] = (isset($new_event_data['is_multiple_waitlist_reservation']) && !empty($new_event_data['is_multiple_waitlist_reservation']))?1:0; $new_event['use_different_address_per_date'] = (isset($new_event_data['use_different_address_per_date']) && !empty($new_event_data['use_different_address_per_date']))?1:0; $new_event['workshop_author_awards'] = $new_event_data['workshop_author_awards']; $new_event['workshop_session'] = $new_event_data['workshop_session']; $new_event['learning_outcome'] = $new_event_data['learning_outcome']; $new_event['trailer'] = $new_event_data['trailer']; $new_event['similar_events'] = $new_event_data['similar_events']; $new_event['discount_apply'] = !empty($new_event_data['discount_apply']) ? $new_event_data['discount_apply'] : 0; $new_event['discounted_price'] = !empty($new_event_data['discounted_price']) ? $new_event_data['discounted_price'] : 0; return $new_event; } private function add_workshop_event_schedule($event_id=0, $new_event_data){ $this->load->model("event_schedule_model"); $this->event_schedule_model->add_workshop_event_schedule($this->data["logged_in"]["user_id"], $event_id, $new_event_data); } //add event schedule private function add_event_schedule_by_bulk($event_id=0, $new_event_data){ $this->load->model("event_schedule_model"); if($new_event_data['workshop_session'] == 'ENLIGNE') { $event_schedule[] = array( "start_date_time" => date('Y-m-d'), "end_date_time" => date('Y-m-d') ); $result = $this->event_schedule_model->add_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_schedule, $new_event_data); } else { if($new_event_data['session_dates']){ $event_schedule = $new_event_data['session_dates']; if(countVal($event_schedule) > 0){ $result = $this->event_schedule_model->add_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_schedule, $new_event_data); } else { return false; } } } } private function update_event_schedule_by_bulk($event_id, $event_data) { if(!isset($event_data['session_dates']) || !$event_id) return false; $this->load->model("event_schedule_model"); // Delete existing sessions for the event $this->event_schedule_model->delete_event_schedules_by_event_id($event_id); // And add the new updated sessions if(countVal($event_data['session_dates']) > 0){ $this->event_schedule_model->update_event_schedule($this->data["logged_in"]["user_id"], $event_id, $event_data['session_dates'], $event_data); } else { return false; } } //add event speaker private function add_event_speaker_by_bulk($event_id){ if($this->input->post("event_speaker")){ $event_speaker = json_decode($this->input->post("event_speaker"), true); if(countVal($event_speaker) > 0){ $errors = []; $this->load->model("event_speaker_model"); $this->load->model("event_speaker_assignee_model"); foreach ($event_speaker as $key=>$speaker) { $speaker["added_by"] = $this->data["logged_in"]["user_id"]; $speaker["speaker_id"] = $this->event_speaker_model->add_event_speaker($speaker, $event_id); $speaker["event_id"] = $event_id; $check = $this->event_speaker_assignee_model->add_new_speaker_assignee($speaker); if(!$check){ array_push($errors, $speaker); } } //end of for each return count($errors); } else { return false; } } } //add event sponsors private function add_event_sponsor_by_bulk($event_id=0){ if( $event_id && isset($this->data["logged_in"]["user_id"])) { if(!empty($_FILES['event_sponsor_files']) && $this->input->post("event_sponsor")) { //load models $this->load->model("event_sponsor_model"); $this->load->model("event_sponsor_assignee_model"); //files with errors $errors = array(); foreach ($this->input->post("event_sponsor") as $key=>$value) { $data = json_decode($value, true); $uploaded = upload_event_files($this, "sponsors", $_FILES['event_sponsor_files'], $key); if( sizeof($uploaded) > 0 ) { $sponsor_id = $this->event_sponsor_model->add_event_sponsor(array( "file" => $uploaded["file_name"], "sponsor_name" => $data["file_setup"]["file_name"], "file_size" => $uploaded["file_size"], "added_by" => $this->data["logged_in"]["user_id"] )); if( !$sponsor_id ) { array_push($errors, array( "file" => $data["file_setup"]["file_name"] )); } else { //assign sponsor to event $sponsor_assignee_id = $this->event_sponsor_assignee_model->add_event_sponsor_assignee( array( "sponsor_id" => $sponsor_id, "event_id" => $event_id, "added_by" => $this->data["logged_in"]["user_id"] ) ); if(!$sponsor_assignee_id){ array_push($errors, array( "file" => $data["file_setup"]["file_name"] )); } } } } //end of loop if( sizeof($errors) <=0 ) { return true; } return false; //when errors encountered } // return false; } else { show_404(); } } //add workshop banner private function add_event_banner($image, $count, $dir){ list($type, $data) = explode(';', $image); list(, $data) = explode(',', $data); $data = base64_decode($data); $imageName = $count.time().'.png'; $origin = origin_folders($dir); if( (is_dir($origin) && is_writable($origin)) ){ file_put_contents($origin.$imageName, $data); } return $imageName; } private function uploadConfig(string $fileName) { return array( 'upload_path'=> FCPATH . "resources/images/frontoffice/banner/", 'allowed_types' => 'jpeg|jpg|png', 'file_name' => strtotime("now").'_'.$fileName ); } private function add_author_works($event_id) { $this->load->model("event_author_works_model"); if($this->input->post("author_works") && !empty($this->input->post("author_works"))) { $works = json_decode($this->input->post("author_works")); $count=1; foreach($works as $row) { if(!empty($row->image)) { if(substr($row->image, 0, 10) === "data:image") { $row->image = $this->add_event_banner($row->image, $count, 'banner'); $count++; } else { $row->image = ''; } } $this->event_author_works_model->save_work(array_merge((array)$row, ['event_id' => $event_id])); } } } private function add_event_videos($event_id) { $this->load->model("event_video_model"); try { if($this->input->post("event_videos") && !empty($this->input->post("event_videos"))) { $videos = json_decode($this->input->post("event_videos")); foreach($videos as $row) { $this->event_video_model->save_video(array_merge((array)$row, ['event_id' => $event_id])); } } return true; } catch(Exception $e) { return $e; } } private function delete_old_videos($newVideos, $oldVideos) { $this->load->model("event_video_model"); foreach((array)$oldVideos as $oldRow) { $isExists = false; foreach($newVideos as $newRow) { if($newRow == $oldRow->id) { $isExists = true; break; } } if(!$isExists) { $this->event_video_model->delete_video($oldRow->id); } } } private function update_event_videos($event_id) { $this->load->model("event_video_model"); if($this->input->post("event_videos") && !empty($this->input->post("event_videos"))) { $videos = json_decode($this->input->post("event_videos")); $updatedIds = array(); $oldVideos = $this->event_video_model->get_videos_by_event_id($event_id); foreach($videos as $row) { //update if id exists if($row->id > 0) { array_push($updatedIds, $row->id); $this->event_video_model->update_video($row->id, (array)$row); } else { $this->event_video_model->save_video(array_merge((array)$row, ['event_id' => $event_id])); } } $this->delete_old_videos($updatedIds, $oldVideos); } } private function add_event_venue_photos($event_id) { $this->load->model("event_venue_photos_model"); if($this->input->post("venue_photos") && !empty($this->input->post("venue_photos"))) { $photos = json_decode($this->input->post("venue_photos")); $count=1; foreach($photos as $row) { if(!empty($row->photo)) { if(substr($row->photo, 0, 10) === "data:image") { $row->photo = $this->add_event_banner($row->photo, $count, 'events'); $count++; } else { $row->photo = ''; } } $this->event_venue_photos_model->save_photo(array_merge((array)$row, ['event_id' => $event_id])); } } } private function delete_old_works($newWorks, $oldWorks) { $this->load->model("event_author_works_model"); foreach((array)$oldWorks as $oldRow) { $isExists = false; foreach($newWorks as $newRow) { if($newRow == $oldRow->id) { $isExists = true; break; } } if(!$isExists) { $this->event_author_works_model->delete_work($oldRow->id); } } } private function update_author_works($event_id) { $this->load->model("event_author_works_model"); if($this->input->post("author_works") && !empty($this->input->post("author_works"))) { $works = json_decode($this->input->post("author_works")); $updatedIds = array(); $oldWorks = $this->event_author_works_model->get_works_by_event_id($event_id); $count=1; foreach($works as $row) { if(!empty($row->image)) { if(substr($row->image, 0, 10) === "data:image") { $row->image = $this->add_event_banner($row->image, $count, 'banner'); $count++; } else if(substr($row->image, 0, 4) === "http") { $exploded = explode("/", $row->image); $filename = array_pop($exploded); $row->image = $filename; } else { $row->image = NULL; } } //update if id exists if($row->id > 0) { array_push($updatedIds, $row->id); $this->event_author_works_model->update_work($row->id, (array)$row); } else { $this->event_author_works_model->save_work(array_merge((array)$row, ['event_id' => $event_id])); } } $this->delete_old_works($updatedIds, $oldWorks); } } private function delete_old_venue_photos($newPhotos, $oldPhotos) { $this->load->model("event_venue_photos_model"); foreach((array)$oldPhotos as $oldRow) { $isExists = false; foreach($newPhotos as $newRow) { if($newRow == $oldRow->id) { $isExists = true; break; } } if(!$isExists) { $this->event_venue_photos_model->delete_venue_photo($oldRow->id); } } } private function delete_event_comments($newComments, $oldComments) { $this->load->model("event_comment_model"); foreach((array)$oldComments as $oldRow) { $isExists = false; foreach($newComments as $newRow) { if($newRow == $oldRow->id) { $isExists = true; break; } } if(!$isExists) { $this->event_comment_model->delete_comment($oldRow->id); } } } private function update_venue_photos($event_id) { $this->load->model("event_venue_photos_model"); if($this->input->post("venue_photos") && !empty($this->input->post("venue_photos"))) { $photos = json_decode($this->input->post("venue_photos")); $updatedIds = array(); $oldPhotos = $this->event_venue_photos_model->get_venue_photos_by_event_id($event_id); $count=1; foreach($photos as $row) { if(!empty($row->photo)) { if(substr($row->photo, 0, 10) === "data:image") { $row->photo = $this->add_event_banner($row->photo, $count, 'events'); $count++; } else if(substr($row->photo, 0, 4) === "http") { $exploded = explode("/", $row->photo); $filename = array_pop($exploded); $row->photo = $filename; } else { $row->photo = NULL; } } //update if id exists if($row->id > 0) { array_push($updatedIds, $row->id); $this->event_venue_photos_model->update_venue_photo($row->id, (array)$row); } else { $this->event_venue_photos_model->save_photo(array_merge((array)$row, ['event_id' => $event_id])); } } $this->delete_old_venue_photos($updatedIds, $oldPhotos); } } private function update_event_comments($event_id=0) { if($this->input->post("comments") && !empty($this->input->post("comments"))) { $this->load->model("event_comment_model"); $comments = json_decode($this->input->post("comments")); $oldComments = $this->event_comment_model->get_comments_by_event_id($event_id); $updatedIds = array(); foreach($comments as $row) { //add comment if id is null if($row->id == null) { $this->event_comment_model->save_comment(array_merge((array)$row, ['event_id' => $event_id])); } else { //update comment array_push($updatedIds, (int)$row->id); $this->event_comment_model->update_comment($row->id, (array)$row); } } $this->delete_event_comments($updatedIds, $oldComments); } } //add event attachments private function add_event_attachment_by_bulk($event_id=0){ if($event_id && isset($this->data["logged_in"]["user_id"])){ if(!empty($_FILES['event_attachment_files']) && $this->input->post("event_attachment")) { //load models $this->load->model("event_sponsor_model"); $this->load->model("event_sponsor_assignee_model"); $this->load->model("event_file_attachment_model"); //files with errors $errors = array(); foreach ($this->input->post("event_attachment") as $key=>$value) { $data = json_decode($value, true); $uploaded = upload_event_files($this, "events",$_FILES['event_attachment_files'], $key); if( sizeof($uploaded) > 0 ) { $audio_video = array(); //check for autoplay settings : catch if there is one if( isset($data["file_setup"]["autoplay_vaudio"]) ){ $audio_video = array( "autoplay_vaudio" => $data["file_setup"]["autoplay_vaudio"], "preview_default_image" => (isset($data["file_setup"]["preview_default_image"]))?$data["file_setup"]["preview_default_image"]:0 ); } $add_status = $this->event_file_attachment_model->add_event_attachment(array( "file_name" => $uploaded["file_name"], "event_id" => $event_id, "mime_type" => $data["file_setup"]["mime_type"], "description" => $data["file_setup"]["file_name"], "display" => $data["display"] == 'home'? 0:1, "attachment_type" => $data["attachment_type"], "file_size" => $uploaded["file_size"], "added_by" => $this->data["logged_in"]["user_id"] ), $audio_video); if( !$add_status ) { array_push($errors, array( "file" => $data["file_setup"]["file_name"] )); } } } //end of loop if( sizeof($errors) <=0 ) { return true; } return false; //if errors found } return false; } else { show_404(); } } public function event_information($event_id){ if($this->input->post() && $event_id) { $this->load->model("event_schedule_model"); $this->load->model("event_author_works_model"); $this->load->model("event_venue_photos_model"); $this->load->model("event_comment_model"); $this->load->model("event_video_model"); $result = $this->event_model->event_information($event_id); $result->similar_events = json_decode($result->similar_events); $schedule = $this->event_schedule_model->get_all_event_schedule($event_id); $works = $this->event_author_works_model->get_works_by_event_id($event_id); $venuePhotos = $this->event_venue_photos_model->get_venue_photos_by_event_id($event_id); $videos = $this->event_video_model->get_videos_by_event_id($event_id); $comments = $this->event_comment_model->get_comments_by_event_id($event_id); if($result->workshop_session == 'DISTANCE-PRESENTIEL') { $ncp = json_decode($result->night_class_prices); $prices = [ "p_rate" => $ncp->presentiel->rate, "p_total_available_seat" => $ncp->presentiel->total_available_seat, "p_discounted_price" => $ncp->presentiel->discounted_price, "p_discount_apply" => $ncp->presentiel->discount_apply, "p_remaining_combined_seat" => $ncp->presentiel->total_available_seat - $this->event_model->count_total_reserved_seats($event_id, 'soir-presentiel'), "d_rate" => $ncp->distance->rate, "d_total_available_seat" => $ncp->distance->total_available_seat, "d_discounted_price" => $ncp->distance->discounted_price, "d_discount_apply" => $ncp->distance->discount_apply, "d_remaining_combined_seat" => $ncp->distance->total_available_seat - $this->event_model->count_total_reserved_seats($event_id, 'soir-distance') ]; $result = array_merge((array)$result, $prices); } $result = array_merge((array)$result, ["schedules" => (array)$schedule], ["works" =>(array)$works], ["venue_photos" =>(array)$venuePhotos], ["comments"=>(array)$comments], ["event_videos" =>(array)$videos]); output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("event_info_retvd"), "mdata" => $result )); } else { show_404(); } } public function event_info($event_id){ if(is_numeric($event_id)) { $result = $this->event_model->event_information($event_id); output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("event_info_retvd"), "mdata" => $result )); } else { show_404(); } } public function preview_event($event_id=0) { $this->load->model("user_model"); $this->load->model("event_schedule_model"); $this->load->model("event_speaker_assignee_model"); $this->load->model("event_sponsor_assignee_model"); $this->load->model("event_author_works_model"); $this->load->model("event_schedule_model"); $this->load->model("event_video_model"); if($this->input->post() && $event_id) { $result = $this->event_model->event_details($event_id); //$sched = $this->event_schedule_model->preview_get_all_event_schedule($event_id); $sched = $this->event_schedule_model->list_event_schedule($event_id, 1, FALSE); $speakers = $this->event_speaker_assignee_model->event_details_preview($event_id); $sponsor = $this->event_sponsor_assignee_model->event_details_preview($event_id); $author_works = $this->event_author_works_model->get_works_by_event_id($event_id); $videos = $this->event_video_model->get_videos_by_event_id($event_id); //$result->remaining_combined_seat = (int)$result->total_available_seat - (int) $registration; $result->workshop_author_awards = json_decode($result->workshop_author_awards); output_to_json($this, array( "mtype" => "success", "message" => $this->lang->line("event_info_retvd"), "mdata" => $result, "sched" => $sched, "speakers" => $speakers, "sponsor" => $sponsor, "author_works" => $author_works, "event_videos" => $videos )); } else { show_404(); } } public function list_event($export=0){ if($this->input->post() && isset($this->data["logged_in"]["user_id"])){ $list = $this->event_model->get_datatables($this->input->post(), $export, 0); $data = array(); $row = array(); $x = $this->input->post("start"); foreach ($list as $event) { $row["event_order"] = ++$x; $row["event_title"] = $event->event_title; $row["event_type"] = $event->event_type; $row["city"] = $event->city; $row["author"] = $event->author; $row["date_created"] = $event->date_created; $row["bostatus"] = $event->bostatus; $row["event_category"] = $event->event_category; $row["use_different_address_per_date"] = $event->use_different_address_per_date; $row["action"] = array( "event_id" => $event->event_id, "event_schedule" => json_decode("[".$event->event_schedule."]",true), "workshop_session" =>$event->workshop_session ); // $row["bo_status"] = $event->bo_status; array_push($data, $row); } $output = array( "draw" => $_POST['draw'], "recordsTotal" => $this->event_model->count_all($this->input->post(), $export, 0), "recordsFiltered" => $this->event_model->count_filtered($this->input->post(), $export,0), "data" => $data, ); //output to json format output_to_json($this, $output); } else { show_404(); } } public function typeahead_event(){ if($this->input->post("search")) { output_to_json($this, $this->event_model->list_events_for_typeahead($this->input->post("search"))); } } private function unique_code_collection($event_schedules) { $this->load->model("event_schedule_model"); foreach ($event_schedules as $index => $event_sched) { if (!isset($event_sched['item_code']) || empty($event_sched['item_code'])) { output_to_json($this, array( "mtype" => "error", "message" => "Code collection is required for PAID EVENT." )); break; } $result = $this->event_schedule_model->validate_code_collection($event_sched['item_code']); if ($result) { output_to_json($this, array( "mtype" => "error", "message" => "Code collection already used by another event" )); break; } } } public function workshop_register_email() { Event_workshop_informer::register($this); } public function similar_events() { $category = $this->input->get('category'); $event_id = $this->input->get('event_id'); $events = $this->event_model->similar_events(isset($category)?$category: 0, isset($event_id)?$event_id: null); if($events) { output_to_json($this, array( "mtype" => "success", "message" => "Similar events", "mdata" => $events )); } output_to_json($this, array( "mtype" => "error", "message" => "Similar events not found" )); } public function past_events() { $events = $this->event_model->get_past_events(); if($events) { output_to_json($this, array( "mtype" => "success", "message" => "Past events", "mdata" => $events )); } output_to_json($this, array( "mtype" => "error", "message" => "Past events not found" )); } public function selected_past_events() { $events = $this->event_model->get_selected_past_events(); if($events) { output_to_json($this, array( "mtype" => "success", "message" => "Past events", "mdata" => $events )); } output_to_json($this, array( "mtype" => "error", "message" => "Past events not found" )); } public function add_selected_past_events() { $events = $this->event_model->add_selected_past_events(['events' => $this->input->post('events')]); if($events) { output_to_json($this, array( "mtype" => "success", "message" => "Past events", "mdata" => $events )); } output_to_json($this, array( "mtype" => "error", "message" => "Past events not found" )); } }