/** * Import data from CSV file into database */ public function import() { $API = new PerchAPI(1.0, 'root_locator'); $Lang = $API->get('Lang'); $Template = $API->get('Template'); $Template->set('locator/address.html', 'locator'); $Addresses = new RootLocator_Addresses($API); $Tasks = new RootLocator_Tasks($API); $data = $this->reader->fetchAssoc(); foreach ($data as $row) { $errors = $this->getRowErrors($row); $warnings = $this->getRowWarnings($row); if ($errors) { $this->addError($row, $Lang->get('ā%sā columns are missing required data', $errors)); continue; } if ($warnings) { $this->addWarning($row, $Lang->get('ā%sā columns are recommended to prevent geocoding errors.', $warnings)); } $imported = $Addresses->create(['addressTitle' => $row['addressTitle'], 'addressBuilding' => $row['addressBuilding'], 'addressStreet' => $row['addressStreet'], 'addressTown' => $row['addressTown'], 'addressRegion' => $row['addressRegion'], 'addressPostcode' => $row['addressPostcode'], 'addressCountry' => $row['addressCountry']]); $imported->index($Template); $Tasks->add('address.geocode', $imported->id()); $this->addSuccess($row); } }
<?php // Data $Addresses = new RootLocator_Addresses($API); $Tasks = new RootLocator_Tasks($API); $result = false; // Master template $Template->set('locator/address.html', 'locator'); // Edit / Create if (isset($_GET['id']) && $_GET['id'] != '') { $addressID = (int) $_GET['id']; $Address = $Addresses->find($addressID); $details = $Address->to_array(); $heading1 = 'Addresses / Edit Address'; } else { $addressID = false; $Address = false; $details = []; $heading1 = 'Locations / Add Address'; } // Forms $Form->handle_empty_block_generation($Template); $Form->require_field('addressTitle', 'This field is required'); $Form->require_field('addressStreet', 'This field is required'); $Form->require_field('addressPostcode', 'This field is required'); $Form->set_required_fields_from_template($Template, $details); if ($Form->submitted()) { $postvars = ['addressTitle', 'addressBuilding', 'addressStreet', 'addressTown', 'addressRegion', 'addressCountry', 'addressPostcode', 'force']; $data = $Form->receive($postvars); // Force? $force = false;
<?php $Addresses = new RootLocator_Addresses(); $errorCount = $Addresses->totalWithErrors(); echo $HTML->subnav($CurrentUser, [['page' => ['root_locator', 'root_locator/edit', 'root_locator/delete'], 'label' => 'Add/Edit', 'priv' => 'root_locator', 'badge' => $errorCount], ['page' => ['root_locator/import'], 'label' => 'Import', 'priv' => 'root_locator.import']]);
<?php $Addresses = new RootLocator_Addresses($API); if (isset($_GET['id']) && $_GET['id'] != '') { $Address = $Addresses->find($_GET['id'], true); } else { PerchUtil::redirect($API->app_path()); } $Form->set_name('delete'); if ($Form->submitted()) { if (is_object($Address)) { $Address->delete(); if ($Form->submitted_via_ajax) { echo $API->app_path() . '/'; exit; } else { PerchUtil::redirect($API->app_path() . '/'); } } else { $Alert->set('error', $Lang->get('Sorry, the address could not be deleted.')); } } $details = $Address->to_array();
<?php $Paging = $API->get('Paging'); $Paging->set_per_page('20'); $Addresses = new RootLocator_Addresses($API); $addresses = []; $filtered = false; if (isset($_GET['chars']) && $_GET['chars'] != '') { $filtered = true; $addresses = $Addresses->filterByTitleChar($_GET['chars'], $Paging); } if (isset($_GET['filter']) && $_GET['filter'] == 'complete') { $filtered = true; $addresses = $Addresses->filterByCoordinates($Paging); } if (isset($_GET['filter']) && $_GET['filter'] == 'failed') { $filtered = true; $addresses = $Addresses->filterByErrors($Paging); } if (!$filtered) { $addresses = $Addresses->all($Paging); } if (!$Settings->get('root_locator_google_api_key')->val()) { $Alert->set('error', $Lang->get('There is no Google API key set. Please add your key Perch Settings.')); } if ($addresses === false) { $Addresses->attempt_install(); } if ($Settings->get('root_locator_update')->val() != '2.0.0') { PerchUtil::redirect($API->app_path() . '/update/'); }
/** * Perform custom queries on address data and output results * * @param array $opts * @param bool $return * * @return void|string */ function root_locator_get_custom(array $opts = [], $return = false) { $defaults = ['address' => null, 'coordinates' => null, 'range' => 25, 'skip-template' => false, 'split-items' => false, 'filter' => false, 'paginate' => false, 'template' => 'address_list.html']; $opts = array_merge($defaults, $opts); if ($opts['skip-template'] || $opts['split-items']) { $return = true; } $API = new PerchAPI(1.0, 'root_locator'); $Addresses = new RootLocator_Addresses($API); $result = $Addresses->getCustom($opts); if ($return) { return $result; } echo $result; }
/** * Run through task queue and mass-geocode * * @param bool $delay * * @return int */ public function processQueue($delay = false) { if (!$this->api) { PerchUtil::debug('Locator: Perch API must be set on Tasks class to process queue', 'error'); return false; } $Addresses = new RootLocator_Addresses($this->api); $Geocoder = RootLocator_GeocoderFactory::createGeocoder(); $Settings = $this->api->get('Settings'); $Template = $this->api->get('Template'); $Template->set('locator/address.html', 'locator'); $batch = $Settings->get('root_locator_batch_size')->val(); $tasks = $this->getBatch('address.geocode', $batch); $count = 0; if (!$tasks) { return $count; } foreach ($tasks as $Task) { $Address = $Addresses->find($Task->addressID()); $result = $Geocoder->geocode($Address->fullAddress()); if (!$Address) { PerchUtil::debug(sprintf('Locator: unable to process address `%s` - no record found', $Task->addressID()), 'error'); $Task->delete(); continue; } // Success, update the address and remove the task if (!$result->hasError()) { PerchUtil::debug('Locator: Geocoding success - clearing task', 'success'); $coordinates = $result->getFirstCoordinates(); $Address->update(['addressLatitude' => $coordinates['latitude'], 'addressLongitude' => $coordinates['longitude'], 'addressError' => null]); $Address->index($Template); $Task->delete(); continue; } // Firstly, if our API limit has been reached then we need to try again tomorrow if ($result->hasError() && $result->getErrorKey() === 'quota_exceeded') { PerchUtil::debug('Locator: API Quota has been exceeded. Delaying queue.', 'notice'); $this->delayQueue(); break; } // If the task has not failed multiple times we can give it the benefit // of the doubt and retry it. if ($result->hasError() && !$Task->isLastAttempt()) { PerchUtil::debug('Locator: Geocoding failed - task reset for a new attempt', 'notice'); $Task->requeue(); continue; } // Ok, we tried everything and now we really do need // to tell the user what's gone wrong. if ($result->hasError() && $Task->isLastAttempt()) { PerchUtil::debug('Locator: Geocoding failed after multiple attempts. Clearing task and logging error.', 'error'); $Address->update(['addressLatitude' => null, 'addressLongitude' => null, 'addressError' => $result->getErrorKey()]); $Address->index($Template); $Task->delete(); // Admit defeat... } $count++; if ($delay) { sleep((int) $delay); } } return $count; }
<?php $Addresses = new RootLocator_Addresses($API); $Tasks = new RootLocator_Tasks($API); $Paging->set_per_page(10); if ($Paging->is_first_page()) { // Update permissions $UserPrivileges = $API->get('UserPrivileges'); $UserPrivileges->create_privilege('root_locator', 'Access the locator app'); $UserPrivileges->create_privilege('root_locator.import', 'Mass import location data'); // Convert categories $sql = 'UPDATE ' . PERCH_DB_PREFIX . 'category_sets SET setTemplate="~root_locator/templates/locator/category_set.html", setCatTemplate="~root_locator/templates/locator/category.html" WHERE setTemplate="~/jw_locator/templates/locator/category_set.html" AND setCatTemplate="~/jw_locator/templates/locator/category.html"'; $db->execute($sql); } if ($Settings->get('root_locator_update')->val() != '2.0.0') { $legacy = $Addresses->getLegacyData($Paging); if (PerchUtil::count($legacy)) { foreach ($legacy as $row) { // Ok, we have an error and it's not a quota issue, so just save as is. if (isset($row['errorMessage']) && !empty($row['errorMessage']) && $row['errorMessage'] == 'The address could not be found.') { $legacyAddress = $Addresses->create(['addressTitle' => $row['locationTitle'], 'addressBuilding' => $row['locationBuilding'], 'addressStreet' => $row['locationStreet'], 'addressTown' => $row['locationTown'], 'addressRegion' => $row['locationRegion'], 'addressPostcode' => $row['locationPostcode'], 'addressCountry' => $row['locationPostcode'], 'addressDynamicFields' => $row['locationDynamicFields'], 'addressError' => 'no_results']); $legacyAddress->index(); continue; } // Do we have some existing location data we can just simply shift over? if (isset($row['markerLatitude']) && isset($row['markerLongitude'])) { $legacyAddress = $Addresses->create(['addressTitle' => $row['locationTitle'], 'addressBuilding' => $row['locationBuilding'], 'addressStreet' => $row['locationStreet'], 'addressTown' => $row['locationTown'], 'addressRegion' => $row['locationRegion'], 'addressPostcode' => $row['locationPostcode'], 'addressCountry' => $row['locationPostcode'], 'addressDynamicFields' => $row['locationDynamicFields'], 'addressLatitude' => $row['markerLatitude'], 'addressLongitude' => $row['markerLongitude']]); $legacyAddress->index();