/** * Returns false if the name already exists */ public static function isUnique($facilityName, $id = false) { $fac = new Facility(); $select = $fac->select(); $select->where("facility_name = ?", $facilityName); if ($id) { $select->where("id != ?", $id); } if ($fac->fetchRow($select)) { return false; } return true; }
public function facilitiesAction() { try { require_once 'models/table/Facility.php'; $facilityTable = new Facility(); $select = $facilityTable->select()->from('facility', array('*'))->setIntegrityCheck(false); $rowRay = $facilityTable->fetchAll($select)->toArray(); $sorted = array(); foreach ($rowRay as $row) { $sorted[$row['id']] = $row; } /* $sorted = $facilityTable->_fill_lookup($sorted, 'location_city', 'city_id', 'city_name'); $sorted = $facilityTable->_fill_lookup($sorted, 'location_district', 'district_id', 'district_name'); $sorted = $facilityTable->_fill_lookup($sorted, 'location_province', 'province_id', 'province_name'); */ $locations = Location::getAll(); foreach ($sorted as $id => $row) { $city_info = Location::getCityInfo($row['location_id'], $this->setting('num_location_tiers'), $locations); if (count($city_info)) { if ($city_info[0]) { $sorted[$id]['city_name'] = $city_info[0]; } if ($city_info[1]) { $sorted[$id]['province_name'] = $locations[$city_info[1]]['name']; } if ($city_info[2]) { $sorted[$id]['district_name'] = $locations[$city_info[2]]['name']; } if ($city_info[3]) { $sorted[$id]['region_c_name'] = $locations[$city_info[3]]['name']; } if ($city_info[4]) { $sorted[$id]['region_d_name'] = $locations[$city_info[4]]['name']; } if ($city_info[5]) { $sorted[$id]['region_e_name'] = $locations[$city_info[5]]['name']; } if ($city_info[6]) { $sorted[$id]['region_f_name'] = $locations[$city_info[6]]['name']; } if ($city_info[7]) { $sorted[$id]['region_g_name'] = $locations[$city_info[7]]['name']; } if ($city_info[8]) { $sorted[$id]['region_h_name'] = $locations[$city_info[8]]['name']; } if ($city_info[9]) { $sorted[$id]['region_i_name'] = $locations[$city_info[9]]['name']; } } unset($sorted[$id]['location_id']); } $sorted = $facilityTable->_fill_lookup($sorted, 'facility_type_option', 'type_option_id', 'facility_type_phrase'); $sorted = $facilityTable->_fill_lookup($sorted, 'facility_sponsor_option', 'sponsor_option_id', 'facility_sponsor_phrase'); if ($this->getSanParam('outputType') == 'csv') { $this->sendData($this->reportHeaders(false, $sorted)); } $this->view->assign('data', $sorted); } catch (Exception $e) { echo $e->getMessage(); error_log($e->getMessage()); } }
protected function validateAndSave($facilityRow, $checkName = true) { $districtText = $this->tr('Region B (Health District)'); $provinceText = $this->tr('Region A (Province)'); $localRegionText = $this->tr('Region C (Local Region)'); //validate $status = ValidationContainer::instance(); //check for required fields if ($checkName) { $status->checkRequired($this, 'facility_name', 'Facility name'); //check for unique if ($this->_getParam('facility_name') and !Facility::isUnique($this->_getParam('facility_name'), $this->_getParam('id'))) { $status->addError('facility_name', t('That name already exists.')); } } // validate lat & long require_once 'Zend/Validate/Float.php'; require_once 'Zend/Validate/Between.php'; $lat = $this->getSanParam('facility_latitude'); $long = $this->getSanParam('facility_longitude'); $validator = new Zend_Validate_Float(); $validbetween = new Zend_Validate_Between('-180', '180'); if ($lat && (!$validator->isValid($lat) || !$validbetween->isValid($lat))) { $status->addError('facility_latitude', t('That latitude and longitude does not appear to be valid.')); } if ($long && (!$validator->isValid($long) || !$validbetween->isValid($long))) { $status->addError('facility_longitude', t('That latitude and longitude does not appear to be valid.')); } $status->checkRequired($this, 'facility_type_id', t('Facility type')); $status->checkRequired($this, 'facility_province_id', $provinceText); if ($this->setting('display_region_b')) { $status->checkRequired($this, 'facility_district_id', $districtText); } if ($this->setting('display_region_c')) { $status->checkRequired($this, 'facility_region_c_id', $localRegionText); } //$status->checkRequired ( $this, 'facility_city', t ( "City is required." ) ); list($location_params, $facility_location_tier, $facility_location_id) = $this->getLocationCriteriaValues(array(), 'facility'); $city_id = false; if ($this->getSanParam('facility_city') && !$this->getSanParam('is_new_city')) { $city_id = Location::verifyHierarchy($location_params['facility_city'], $location_params['facility_city_parent_id'], $this->setting('num_location_tiers')); if ($city_id === false) { $status->addError('facility_city', t("That city does not appear to be located in the chosen region. If you want to create a new city, check the new city box.")); } } $sponsor_date_array = $this->getSanParam('sponsor_start_date'); // may or may not be array $sponsor_end_date_array = $this->getSanParam('sponsor_end_date'); $sponsor_id = $this->getSanParam('facility_sponsor_id') ? $this->getSanParam('facility_sponsor_id') : null; if (is_array($sponsor_id)) { $sponsor_array = $sponsor_id; $sponsor_id = $sponsor_id[0]; } // todo case where multip array and no_allow_multi if (@$this->setting('require_sponsor_dates')) { $status->checkRequired($this, 'sponsor_option_id', t('Sponsor dates are required.') . "\n"); if ($this->setting('allow_multi_sponsors')) { // and multiple sponsors option if (!is_array($this->getSanParam('sponsor_option_id'))) { $status->addError('sponsor_end_date', t('Sponsor dates are required.') . "\n"); } foreach ($sponsor_array as $i => $val) { if (empty($sponsor_date_array[$i]) || !empty($val)) { $status->addError('sponsor_start_date', t('Sponsor dates are required.') . "\n"); } if (empty($sponsor_end_date_array[$i]) || !empty($val)) { $status->addError('sponsor_end_date', t('Sponsor dates are required.') . "\n"); } } } } // end validation if ($status->hasError()) { $status->setStatusMessage(t('The facility could not be saved.')); } else { $location_id = null; if ($city_id === false && $this->getSanParam('is_new_city')) { $location_id = Location::insertIfNotFound($location_params['facility_city'], $location_params['facility_city_parent_id'], $this->setting('num_location_tiers')); if ($location_id === false) { $status->addError('facility_city', t('Could not save that city.')); } } else { if ($city_id) { $location_id = $city_id; } else { if ($this->setting('display_region_c')) { $location_id = $this->getSanParam('facility_region_c_id'); } else { if ($this->setting('display_region_b')) { $location_id = $this->getSanParam('facility_district_id'); } else { $location_id = $this->getSanParam('facility_province_id'); } } } if (strstr($location_id, '_')) { $parts = explode('_', $location_id); $location_id = $parts[count($parts) - 1]; } } // save row if ($location_id) { //map db field names to FORM field names $facilityRow->facility_name = $this->getSanParam('facility_name'); $facilityRow->location_id = $location_id; $facilityRow->type_option_id = $this->getSanParam('facility_type_id') ? $this->getSanParam('facility_type_id') : null; $facilityRow->facility_comments = $this->_getParam('facility_comments'); $facilityRow->address_1 = $this->getSanParam('facility_address1'); $facilityRow->address_2 = $this->getSanParam('facility_address2'); $facilityRow->lat = $lat; $facilityRow->long = $long; $facilityRow->postal_code = $this->getSanParam('facility_postal_code'); $facilityRow->phone = $this->getSanParam('facility_phone'); $facilityRow->fax = $this->getSanParam('facility_fax'); $facilityRow->sponsor_option_id = $sponsor_id; //dupecheck $dupe = new Facility(); $select = $dupe->select()->where('location_id =' . $facilityRow->location_id . ' and facility_name = "' . $facilityRow->facility_name . '"'); if (!$facilityRow->id && $dupe->fetchRow($select)) { $status->status = ''; $status->setStatusMessage(t('The facility could not be saved. A facility with this name already exists in that location.')); return false; } $obj_id = $facilityRow->save(); $_SESSION['status'] = t('The facility was saved.'); if ($obj_id) { if (!Facility::saveSponsors($obj_id, $sponsor_array, $sponsor_date_array, $sponsor_end_date_array)) { $status->setStatusMessage(t('There was an error saving sponsor data though.')); return false; } $status->setStatusMessage(t('The facility was saved.')); $status->setRedirect('/facility/view/id/' . $obj_id); return $obj_id; } else { unset($_SESSION['status']); $status->setStatusMessage(t('ERROR: The facility could not be saved.')); } } } return false; }
/** * Import a facility */ public function importAction() { $this->view->assign('pageTitle', t('Import a facility')); require_once 'models/table/Location.php'; require_once 'models/table/Facility.php'; // template redirect if ($this->getSanParam('download')) { return $this->importFacilityTemplateAction(); } if (!$this->hasACL('import_facility')) { $this->doNoAccessError(); } //CSV STUFF $filename = $_FILES['upload']['tmp_name']; if ($filename) { $facilityObj = new Facility(); $errs = array(); while ($row = $this->_csv_get_row($filename)) { $values = array(); if (!is_array($row)) { continue; } // sanity? if (!isset($cols)) { // set headers (field names) $cols = $row; // first row is headers (field names) continue; } $countValidFields = 0; if (!empty($row)) { // add foreach ($row as $i => $v) { // proccess each column if (empty($v) && $v !== '0') { continue; } if ($v == 'n/a') { // has to be able to process values from a data export $v = NULL; } $countValidFields++; $delimiter = strpos($v, ','); // is this field a comma seperated list too (or array)? if ($delimiter && $v[$delimiter - 1] != '\\') { // handle arrays as field values(Export), and comma seperated values(import manual entry), and strings or int $values[$cols[$i]] = explode(',', $this->sanitize($v)); } else { $values[$cols[$i]] = $this->sanitize($v); } } } // done now all fields are named and in $values[my_field] if ($countValidFields) { //validate if (isset($values['uuid'])) { unset($values['uuid']); } if (isset($values['id'])) { unset($values['id']); } if (isset($values['is_deleted'])) { unset($values['is_deleted']); } if (isset($values['created_by'])) { unset($values['created_by']); } if (isset($values['modified_by'])) { unset($values['modified_by']); } if (isset($values['timestamp_created'])) { unset($values['timestamp_created']); } if (isset($values['timestamp_updated'])) { unset($values['timestamp_updated']); } if (!$this->hasACL('approve_trainings')) { unset($values['approved']); } if ($values['sponsor_option_id']) { $sponsors = $this->_array_me($values['sponsor_option_id']); // could be an array, we dont want one $values['sponsor_option_id'] = $sponsors[0]; } //required if (empty($values['facility_name'])) { $errs[] = t('Error adding facility, Facility name cannot be empty.'); continue; } if (empty($values['address_1'])) { $values['address_1'] = ''; } if (empty($values['address_2'])) { $values['address_2'] = ''; } //locations $num_location_tiers = $this->setting('num_location_tiers'); $bSuccess = true; $location_id = null; if ($values['location_id']) { $location_id = $values['location_id']; } $tier = 1; if (!$location_id) { for ($i = 0; $i <= $num_location_tiers; $i++) { // insert/find locations $r = 11 + $i; // first location field in csv row // could use this too: $values[t('Region A (Province)')] if (empty($row[$r]) || $bSuccess == false) { continue; } $location_id = Location::insertIfNotFound($row[$r], $location_id, $tier); if (!$location_id) { $bSuccess = false; break; } $tier++; } } if (!$bSuccess) { $errs[] = t('Error locating/creating region or city:') . ' ' . $row[$r] . ' ' . t('Facility') . ': ' . $values['facility_name']; continue; // couldnt save location } $values['location_id'] = $location_id; //dupecheck $dupe = new Facility(); $select = $dupe->select()->where('location_id =' . $location_id . ' and facility_name = "' . $values['facility_name'] . '"'); if ($dupe->fetchRow($select)) { $errs[] = t('The facility could not be saved. A facility with this name already exists in that location.') . ' ' . t('Facility') . ': ' . $values['facility_name']; $bSuccess = false; } //save if ($bSuccess) { try { $tableObj = $facilityObj->createRow(); $tableObj = ITechController::fillFromArray($tableObj, $values); $tableObj->type_option_id = $this->_importHelperFindOrCreate('facility_type_option', 'facility_type_phrase', $tableObj->type_option_id); if ($values['type_option_id'] && !$tableObj->type_option_id) { $errs[] = t("Couldn't save facility type for facility:") . ' ' . $tableObj->facility_name; } $row_id = $tableObj->save(); } catch (Exception $e) { $errored = 1; $errs[] = nl2br($e->getMessage()) . ' ' . t('ERROR: The facility could not be saved.'); } if (!$row_id) { $errored = 1; } //save linked tables if ($row_id && $this->setting('allow_multi_sponsors')) { if ($sponsors || $values['sponsor_start_date'] || $values['sponsor_end_date']) { $dates1 = $this->_array_me($values['sponsor_start_date']); $dates2 = $this->_array_me($values['sponsor_end_date']); foreach ($sponsors as $i => $phrase) { // insert or get id $sponsors[$i] = $this->_importHelperFindOrCreate('facility_sponsor_option', 'facility_sponsor_phrase', $phrase); } //facility_type_option_id multiAssign (insert via helper) if (!Facility::saveSponsors($row_id, $sponsors, $dates1, $dates2)) { // save $errs[] = t('There was an error saving sponsor data though.') . ' ' . t('Facility') . ': ' . $tableObj->facility_name; } } } } //sucess - done } //loop } // done processing rows $_POST['redirect'] = null; $status = ValidationContainer::instance(); if (empty($errored) && empty($errs)) { $stat = t('Your changes have been saved.'); } else { $stat = t('Error importing data. Some data may have been imported and some may not have.'); } foreach ($errs as $errmsg) { $stat .= '<br>' . 'Error: ' . htmlspecialchars($errmsg, ENT_QUOTES); } $status->setStatusMessage($stat); $this->view->assign('status', $status); } // done with import }