viewDir = 'Center'; //$this->allow = []; } public function index(){ if(!isset($this->user->getRoles()[ADMIN_ROLE_ID])) return $this->setRawJsonResponse('err', _('Access denied.'), [], ['button'=>'goto', 'destination'=>'dashboard']); $this->actionTitle = _("Clinical center"); $user_id = $this->user->getUserId(); $center_id = $this->getPost('center_id', 0); $this->view->centerId = $center_id; $this->view->isEditing = $center_id == 0 ? false : true; $center_data = null; if($this->view->isEditing){ $center_data = $this->db->where('id', $center_id)->getOne('clinical_centers'); if($center_data == null) return $this->setRawJsonResponse('err', 'Access denied.', [], ['button'=>'goto', 'destination'=>'dashboard']); // centerData['medical_specialties'] => [[index] => specialty_id] $center_data['medical_specialties'] = $this->db->where('center_id', $center_id)->getValue('clinical_center_medical_specialties_to', 'specialty_id', null); } $this->view->centerData = $center_data; $this->view->continents = array_merge([0=>['code'=>null, 'name'=>'...']], $this->db->get('continents')); if($this->view->isEditing){ $this->view->countries = $this->db ->orderBy('country_name', 'ASC') ->where('continent_iso2_code', $center_data['continent_code']) ->get('countries', null, ['country_iso2_code as code', 'country_name as name']); } $this->view->allSpecialties = $this->db ->orderBy('description', 'ASC') ->get('users_medical_specialties'); // [index] => [id, description, status] //$this->view->DEBUG = 'NULL'; return $this->setJsonView('index'); } // Ajax function: dynamic loading of the Countries select by Continent public function filterCountries() { $continent_code = $this->getPost('continent_code', null); if($this->db->where('code', $continent_code)->getOne('continents') == null){ return $this->setRawJsonResponse('err', $continent_code . ': ' . _('invalid continent code.'), [], []); } $countries = []; $countries_db = $this->db ->orderBy('country_name', 'ASC') ->where('continent_iso2_code', $continent_code) ->get('countries', null, ['country_iso2_code as code', 'country_name as name']); foreach ($countries_db as $country) { $countries[$country['code']] = $country['name']; } return $this->setRawJsonResponse('ok', '', ['countries'=>$countries]); } // Main function for Clinical Center saving and updating public function centerSave(){ // Check: only Administrator can save if(!isset($this->user->getRoles()[ADMIN_ROLE_ID])) return $this->setRawJsonResponse('err', _('Save denied.'), [], ['button'=>'goto', 'destination'=>'dashboard']); $now = date('Y-m-d H:i:s'); $user_id = $this->user->getUserId(); $data = $this->getPost('data', null); $center_id = $data['center_id']['value']; // Check: modify a clinical center only if exists if($center_id != 0 && $this->db->where('id', $center_id)->getOne('clinical_centers') == null) return $this->setRawJsonResponse('err', _('Save denied.'), [], ['button'=>'goto', 'destination'=>'dashboard']); $center_validate_data = []; $center_validate_data = $this->centerValidate($data); $specialties_validate_data = []; $devices_validate_data = []; $this->view->DEBUG = $center_validate_data; return $this->setJsonView('centerSave'); if(isset($center_validate_data['ok'])){ //unset($center_validate_data['ok']['center_id']); $specialties_validate_data = $center_validate_data['ok']['medical_specialties']; unset($center_validate_data['ok']['medical_specialties']); $center_validate_data['ok']['updated_by'] = $user_id; $center_validate_data['ok']['updated_at'] = $now; //$this->view->DEBUG = $center_validate_data; //return $this->setJsonView('centerSave'); if($center_id == 0){ // INSERT $center_validate_data['ok']['created_by'] = $user_id; $center_validate_data['ok']['created_at'] = $now; $center_id = $this->db->insert('clinical_centers', $center_validate_data['ok']); if($center_id) return $this->setRawJsonResponse('ok', _('Clinical center created successfully.'), [], ['button'=>'goto', 'destination'=>'centers/'.time()]); else return $this->setRawJsonResponse('err', _('Clinical center insert error.'), [], ['button'=>'goto', 'destination'=>'centers/'.time()]); } else { // UPDATE if($this->db->where('id', $center_id)->update('clinical_centers', $center_validate_data['ok'])) return $this->setRawJsonResponse('ok', _('Clinical center updated successfully.'), [], ['button'=>'goto', 'destination'=>'centers/'.time()]); else return $this->setRawJsonResponse('err', _('Clinical center update error.'), [], ['button'=>'goto', 'destination'=>'centers/'.time()]); } } if(isset($center_validate_data['err'])){ $err_class = isset($center_validate_data['err']['field-class']) ? ['class'=>$center_validate_data['err']['field-class']] : []; return $this->setRawJsonResponse('err', $center_validate_data['err']['err_msg'], $err_class); } // For debugging... // $this->view->DEBUG = 'DEBUG CONTENT'; // return $this->setJsonView('centerSave'); // return $this->setRawJsonResponse('ok', _('MESSAGGIO DI CONFERMA'), [], ['button'=>'goto', 'destination'=>'centers/'.time()]); // return $this->setRawJsonResponse('err', 'MESSAGGIO DI ERRORE del tipo label: required field', ['class'=>'field-CAMPO1']); } // Return an array // [ok] => [field => value] // [err] => [ // err_msg => error message formatted // field-class => filed-FieldName to highlight the error on the page // ] private function centerValidate($form_data){ $result = []; if($form_data['description']['value'] == null){ $result['err']['err_msg'] = '' . $form_data['description']['label'] . ':' . _(' required field.'); $result['err']['field-class'] = 'field-description'; return $result; } if((int)$form_data['anonymize']['value'] != 0 && (int)$form_data['anonymize']['value'] != 1){ $result['err']['err_msg'] = '' . $form_data['anonymize']['label'] . ':' . _(' invalid value.'); $result['err']['field-class'] = 'field-anonymize'; return $result; } if($form_data['continent_code']['value'] == null){ $result['err']['err_msg'] = '' . $form_data['continent_code']['label'] . ':' . _(' required field.'); $result['err']['field-class'] = 'field-continent_code'; return $result; } if($this->db->where('code', $form_data['continent_code']['value'])->getOne('continents') == null){ $result['err']['err_msg'] = _('Save denied. ') . $form_data['continent_code']['value'] . _(': invalid value.'); $result['err']['field-class'] = 'field-continent_code'; return $result; } if($form_data['country_code']['value'] == null){ $result['err']['err_msg'] = '' . $form_data['continent_code']['label'] . ':' . _(' required field.'); $result['err']['field-class'] = 'field-country_code'; return $result; } if($this->db->where('country_iso2_code', $form_data['country_code']['value'])->getOne('countries') == null){ $result['err']['err_msg'] = _('Save denied. ') . $form_data['country_code']['value'] . _(': invalid value.'); $result['err']['field-class'] = 'field-country_code'; return $result; } if($this->db->where('country_iso2_code', $form_data['country_code']['value'])->getOne('countries')['continent_iso2_code'] != $form_data['continent_code']['value']){ $result['err']['err_msg'] = _('Save denied.'); $result['err']['field-class'] = 'field-country_code'; return $result; } if($form_data['lat']['value']!=null && !preg_match('/^[-]?[0-9]{1,2}\.[0-9]{1,8}$/', $form_data['lat']['value'])){ $result['err']['err_msg'] = '' . $form_data['lat']['label'] . ':' . _(' invalid value.'); $result['err']['field-class'] = 'field-lat'; return $result; } if($form_data['lng']['value']!=null && !preg_match('/^[-]?[0-9]{1,2}\.[0-9]{1,8}$/', $form_data['lng']['value'])){ $result['err']['err_msg'] = '' . $form_data['lng']['label'] . ':' . _(' invalid value.'); $result['err']['field-class'] = 'field-lng'; return $result; } if($form_data['lat']['value']!=null && $form_data['lng']['value']==null){ $result['err']['err_msg'] = '' . $form_data['lng']['label'] . ':' . _(' required field.'); $result['err']['field-class'] = 'field-lng'; return $result; } if($form_data['lat']['value']==null && $form_data['lng']['value']!=null){ $result['err']['err_msg'] = '' . $form_data['lat']['label'] . ':' . _(' required field.'); $result['err']['field-class'] = 'field-lat'; return $result; } // Medical specialties validation if(isset($form_data['medical_specialties']['value']) && is_array($form_data['medical_specialties']['value'])){ $all_active_specialties = $this->db->where('status', 1)->getValue('users_medical_specialties', 'id', null); $center_specialties = $this->db->where('center_id', $form_data['center_id']['value'])->getValue('clinical_center_medical_specialties_to', 'specialty_id', null); foreach ($form_data['medical_specialties']['value'] as $specialty_id) { if(!in_array($specialty_id, $all_active_specialties)){ $result['err']['err_msg'] = '' . $form_data['medical_specialties']['label'] . ':' . _(' invalid value.'); $result['err']['field-class'] = 'field-medical_specialties'; return $result; } } } else $form_data['medical_specialties']['value'] = []; // List of editable fields of the clinical center $center_writable_fields = []; foreach($this->db->rawQuery('describe clinical_centers') as $attribute) $center_writable_fields[] = $attribute['Field']; $center_writable_fields[] = 'medical_specialties'; // Field not in clinical_centers table // The following fields are editable only from the controller $center_writable_fields = array_diff($center_writable_fields, ['id', 'group_id', 'country_id', 'created_by', 'created_at', 'updated_by', 'updated_at', 'deleted_by', 'deleted_at']); foreach ($center_writable_fields as $field) { $result['ok'][$field] = $this->utility->deepTrim($form_data[$field]['value']); } // foreach ($form_data as $form_field => $values) { // if(in_array($form_field, $center_writable_fields)){ // $result['ok'][$form_field] = $values['value']; // } else { // // } // } return $result; } //List all Clinical Centers in the Group function centersList() { if(!$this->checkPermissions([ADMIN_ROLE_ID])) { return $this->redirect('login', 'permissionDenied'); } $results = $this->db ->where('cc.group_id', $this->userGroupId) ->join('continents cnts', 'cnts.code=cc.continent_code', 'INNER') ->join('countries cntrs', 'cntrs.country_iso2_code=cc.country_code', 'INNER') ->orderBy('cnts.name', 'asc') ->get('clinical_centers cc', null, ['cc.id center_id', 'cc.description', 'cnts.name continent_name', 'cntrs.country_name', 'cc.anonymize', 'cc.notes']); $activeSpecialties = $this->getActiveMedicalSpecialtiesIdByGroupId($this->userGroupId); foreach($results as $index => $item) { $specialties = $this->db ->where('ccmst.center_id', $item['center_id']) ->join('users_medical_specialties ums', 'ums.id=ccmst.specialty_id', 'INNER') ->get('clinical_center_medical_specialties_to ccmst', null, ['ums.id', 'ums.description']); $translated = []; if (!empty($specialties)) { foreach($specialties as $indecSpec => $specialty) { $translated[$specialty['id']]['description'] = _($specialty['description']); $translated[$specialty['id']]['active'] = in_array($specialty['id'], $activeSpecialties) ? true : false; } } $results[$index]['specialties'] = $translated; } $this->view->centers = $results; $this->actionTitle = _('Clinical Centers'); $this->breadcrumbs = [['hash'=>null, 'label'=>$this->actionTitle]]; return $this->setJsonView('centersList'); } }