/**
  * 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;
Example #3
0
<?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/');
}
Example #6
0
/**
 * 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;
 }
Example #8
0
<?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();