public function addAction() { if (!$this->hasACL('edit_people')) { $this->doNoAccessError(); } $request = $this->getRequest(); $validateOnly = $request->isXmlHttpRequest(); if ($validateOnly) { $this->setNoRenderer(); } if ($request->isPost()) { $facilityObj = new Facility(); $obj_id = $this->validateAndSave($facilityObj->createRow(), false); //validate $status = ValidationContainer::instance(); if ($obj_id) { $status->setObjectId($obj_id); } if ($validateOnly) { $this->sendData($status); } else { $this->view->assign('status', $status); } } //locations $this->viewAssignEscaped('locations', Location::getAll()); //facility types $typesArray = OptionList::suggestionList('facility_type_option', 'facility_type_phrase', false, false); $this->viewAssignEscaped('facility_types', $typesArray); //sponsor types $sponsorsArray = OptionList::suggestionList('facility_sponsor_option', 'facility_sponsor_phrase', false, false); $this->viewAssignEscaped('facility_sponsors', $sponsorsArray); }
/** * 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 }