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
 }