You are here

location.admin.inc in Location 7.4

Admin forms for Location.

File

location.admin.inc
View source
<?php

/**
 * @file
 * Admin forms for Location.
 */

/**
 * Admin settings form.
 *
 * @ingroup form
 */
function location_admin_settings() {

  // Recalculate the supported countries.
  cache_clear_all('location:supported-countries', 'cache');
  _location_supported_countries();
  $iso_list_sorted = location_get_iso3166_list();
  array_multisort($iso_list_sorted);
  $iso_list_sorted = array_merge(array(
    '' => '',
  ), $iso_list_sorted);
  $form = array();

  // @@@TODO 7.x -- Verify integrity of site_default_country and direct user
  // to the appropriate place to change it if necessary.
  $form['location_display_location'] = array(
    '#type' => 'radios',
    '#title' => t('Toggle location display'),
    '#default_value' => variable_get('location_display_location', 1),
    '#options' => array(
      0 => t('Disable the display of locations.'),
      1 => t('Enable the display of locations.'),
    ),
    '#description' => t('If you are interested in turning off locations and having a custom theme control their display, you may want to disable the display of locations so your theme can take that function.'),
  );
  $form['location_use_province_abbreviation'] = array(
    '#type' => 'radios',
    '#title' => t('Province display'),
    '#default_value' => variable_get('location_use_province_abbreviation', 1),
    '#options' => array(
      0 => t('Display full province name.'),
      1 => t('Display province/state code.'),
    ),
  );
  $form['location_usegmap'] = array(
    '#type' => 'checkbox',
    '#title' => t('Use a Google Map to set latitude and longitude '),
    '#default_value' => variable_get('location_usegmap', FALSE),
    '#description' => t('If the gmap.module is installed and <a href="@enabled">enabled</a>, and this setting is also turned on, users that are allowed to manually enter latitude/longitude coordinates will be able to do so with an interactive Google Map.  You should also make sure you have entered a <a href="@google_maps_api_key">Google Maps API key</a> into your <a href="@gmap_module_settings">gmap module settings</a>.', array(
      '@enabled' => url('admin/modules'),
      '@google_maps_api_key' => 'http://www.google.com/apis/maps',
      '@gmap_module_settings' => url('admin/config/services/gmap'),
    )),
  );
  $form['location_locpick_macro'] = array(
    '#type' => 'textfield',
    '#title' => t('Location chooser macro'),
    '#size' => 50,
    '#maxlength' => 500,
    '#default_value' => variable_get('location_locpick_macro', '[gmap]'),
    '#description' => t('If you would like to change the macro used to generate the location chooser map, you can do so here. Note: Behaviors <em>locpick</em> and <em>collapsehack</em> are forced to be enabled and cannot be changed.'),
  );
  $form['location_jit_geocoding'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enable JIT geocoding'),
    '#default_value' => variable_get('location_jit_geocoding', FALSE),
    '#description' => t('If you are going to be importing locations in bulk directly into the database, you may wish to enable JIT geocoding and load the locations with source set to 4 (LOCATION_LATLON_JIT_GEOCODING). The system will automatically geocode locations as they are loaded.'),
  );
  $form['maplink_external'] = array(
    '#type' => 'fieldset',
    '#title' => t('Map link'),
  );
  $form['maplink_external']['location_maplink_external'] = array(
    '#type' => 'checkbox',
    '#title' => t('Open map link in new window'),
    '#default_value' => variable_get('location_maplink_external', 0),
    '#description' => t('Select this if you want the map link to open in a separate window'),
  );
  $form['maplink_external']['location_maplink_external_method'] = array(
    '#type' => 'radios',
    '#title' => t('Open in new window method'),
    '#options' => array(
      'target="_blank"' => 'target="_blank"',
      'rel="external"' => 'rel="external"',
    ),
    '#default_value' => variable_get('location_maplink_external_method', 'target="_blank"'),
    '#description' => t('If you have selected to open map in a new window this controls the method used to open in a new window.  target="_blank" will just work but is not XTHML Strict compliant.  rel="external" is XHTML Strict compliant but will not open in a new window unless you add some jQuery to your site to add the target attribute. If you are unsure leave set to target="_blank"'),
  );
  return system_settings_form($form);
}

/**
 * Settings page for map links.
 */
function location_map_link_options_form() {
  $form = array();
  $form['countries'] = array(
    '#type' => 'markup',
    '#markup' => '',
  );
  foreach (_location_supported_countries() as $country_iso => $country_name) {
    location_load_country($country_iso);
    $form['countries'][$country_iso] = array(
      '#type' => 'markup',
      '#markup' => '',
    );
    $form['countries'][$country_iso]['label_' . $country_iso] = array(
      '#type' => 'markup',
      '#markup' => $country_name,
    );

    // Set up '#options' array for mapping providers for the current country
    $mapping_options = array();
    $provider_function = 'location_map_link_' . $country_iso . '_providers';
    $default_provider_function = 'location_map_link_' . $country_iso . '_default_providers';
    $checked = variable_get('location_map_link_' . $country_iso, function_exists($default_provider_function) ? $default_provider_function() : array());

    //print "Calling provider function $provider_function";
    if (function_exists($provider_function)) {
      foreach ($provider_function() as $name => $details) {
        $mapping_options[$name] = '<a href="' . $details['url'] . '">' . $details['name'] . '</a> (<a href="' . $details['tos'] . '">Terms of Use</a>)';
      }
    }
    if (count($mapping_options)) {
      $form['countries'][$country_iso]['location_map_link_' . $country_iso] = array(
        '#title' => '',
        '#type' => 'checkboxes',
        '#default_value' => $checked,
        '#options' => $mapping_options,
      );
    }
    else {
      $form['countries'][$country_iso]['location_map_link_' . $country_iso] = array(
        '#type' => 'markup',
        '#markup' => t('None supported.'),
      );
    }
  }
  $form = system_settings_form($form);
  $form['#theme'] = 'location_map_link_options';
  return $form;
}
function location_geocoding_options_form() {
  $form = array();
  $form['location_geocode_google_minimum_accuracy'] = array(
    '#type' => 'select',
    '#title' => t('Google Maps geocoding minimum accuracy'),
    '#options' => location_google_geocode_accuracy_codes(),
    '#default_value' => variable_get('location_geocode_google_minimum_accuracy', '3'),
    '#description' => t('The Google Maps geocoding API returns results with a given accuracy. Any responses below this minimum accuracy will be ignored. See a !accuracy_values_link.', array(
      '!accuracy_values_link' => '<a href="http://code.google.com/apis/maps/documentation/reference.html#GGeoAddressAccuracy">description of these values</a>',
    )),
  );
  $form['countries'] = array();

  // First, we build two arrays to help us figure out on the fly whether a specific country is covered by a multi-country geocoder,
  // and what the details of the multi-country geocoder are
  // (1) Get list of geocoders
  $general_geocoders_list = location_get_general_geocoder_list();

  // (2) get data about each geocoder and the list of coutnries covered by each geocoder
  $general_geocoders_data = array();
  $general_geocoders_countries = array();
  foreach ($general_geocoders_list as $geocoder_name) {
    location_load_geocoder($geocoder_name);
    $info_function = $geocoder_name . '_geocode_info';
    if (function_exists($info_function)) {
      $general_geocoders_data[$geocoder_name] = $info_function();
    }
    $countries_function = $geocoder_name . '_geocode_country_list';
    if (function_exists($countries_function)) {
      $general_geocoders_countries[$geocoder_name] = $countries_function();
    }
  }
  foreach (_location_supported_countries() as $country_iso => $country_name) {
    location_load_country($country_iso);
    $geocoding_options = array();
    $form['countries'][$country_iso] = array(
      '#type' => 'markup',
      '#markup' => '',
    );
    $form['countries'][$country_iso]['label_' . $country_iso] = array(
      '#type' => 'markup',
      '#markup' => '<div id="' . $country_iso . '">' . $country_name . '</div>',
    );

    // Next, we look for options presented by country specific providers
    $country_specific_provider_function = 'location_geocode_' . $country_iso . '_providers';
    if (function_exists($country_specific_provider_function)) {
      foreach ($country_specific_provider_function() as $name => $details) {
        $geocoding_options[$name . '|' . $country_iso] = '<a href="' . $details['url'] . '">' . $details['name'] . '</a> (<a href="' . $details['tos'] . '">Terms of Use</a>)';
      }
    }
    foreach ($general_geocoders_list as $geocoder_name) {
      if (in_array($country_iso, $general_geocoders_countries[$geocoder_name])) {
        $geocoding_options[$geocoder_name] = '<a href="' . $general_geocoders_data[$geocoder_name]['url'] . '">' . $general_geocoders_data[$geocoder_name]['name'] . '</a> (<a href="' . $general_geocoders_data[$geocoder_name]['tos'] . '">Terms of Use</a>)';
      }
    }
    if (count($geocoding_options)) {
      $geocoding_options = array_merge(array(
        'none' => t('None'),
      ), $geocoding_options);
      $form['countries'][$country_iso]['location_geocode_' . $country_iso] = array(
        '#type' => 'radios',
        '#default_value' => variable_get('location_geocode_' . $country_iso, 'none'),
        '#options' => $geocoding_options,
      );
    }
    else {
      $form['countries'][$country_iso]['location_geocode_' . $country_iso] = array(
        '#type' => 'markup',
        '#markup' => t('None supported.'),
      );
    }
    $current_value = variable_get('location_geocode_' . $country_iso, 'none');
    if ($current_value == 'none') {
      $form['countries'][$country_iso]['location_geocode_config_link_' . $country_iso] = array(
        '#type' => 'markup',
        '#markup' => t('No service selected for country.'),
      );
    }
    else {
      $current_val_chopped = substr($current_value, 0, strpos($current_value, '|'));
      $geocode_settings_form_function_specific = 'location_geocode_' . $country_iso . '_' . $current_val_chopped . '_settings';
      $geocode_settings_form_function_general = $current_value . '_geocode_settings';
      if (function_exists($geocode_settings_form_function_specific)) {
        $form['countries'][$country_iso]['location_geocode_config_link_' . $country_iso] = array(
          '#type' => 'markup',
          '#markup' => l(t('Configure parameters'), 'admin/settings/location/geocoding/' . $country_iso . '/' . $current_val_chopped),
        );
      }
      elseif (function_exists($geocode_settings_form_function_general)) {
        $form['countries'][$country_iso]['location_geocode_config_link_' . $country_iso] = array(
          '#type' => 'markup',
          '#markup' => l(t('Configure parameters'), 'admin/settings/location/geocoding/' . $country_iso . '/' . $current_value),
        );
      }
      else {
        $form['countries'][$country_iso]['location_geocode_config_link_' . $country_iso] = array(
          '#type' => 'markup',
          '#markup' => t('No configuration necessary for selected service.'),
        );
      }
    }
  }
  $form = system_settings_form($form);
  $form['#theme'] = 'location_geocoding_options';
  array_unshift($form['#submit'], 'location_geocoding_options_form_submit');
  return $form;
}
function location_geocoding_options_form_submit($form, &$form_state) {
  $general_geocoders = location_get_general_geocoder_list();
  $general_geocoders_in_use = array();
  foreach ($form_state['values'] as $key => $value) {
    if (substr($key, 0, 17) == 'location_geocode_' && $key != 'location_geocode_google_minimum_accuracy') {
      if (in_array($value, $general_geocoders)) {
        $general_geocoders_in_use[$value] = $value;
        variable_set($key, $value);
      }
    }
  }
  variable_set('location_geocode_google_minimum_accuracy', $form_state['values']['location_geocode_google_minimum_accuracy']);
  variable_set('location_general_geocoders_in_use', $general_geocoders_in_use);
}
function theme_location_map_link_options($data) {
  $form = $data['form'];
  $header = array(
    array(
      'align' => 'center',
      'data' => '<center>' . t('Country') . '</center>',
    ),
    array(
      'align' => 'center',
      'data' => '<center>' . t('Options') . '</center>',
    ),
  );
  $rows = array();
  foreach (element_children($form['countries']) as $country_iso) {
    $row = array();
    $row[] = array(
      'data' => drupal_render($form['countries'][$country_iso]['label_' . $country_iso]),
    );
    $row[] = array(
      'data' => drupal_render($form['countries'][$country_iso]['location_map_link_' . $country_iso]),
    );
    $rows[] = $row;
  }
  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
  $output .= drupal_render_children($form);
  return $output;
}
function theme_location_geocoding_options($data) {
  $output = drupal_render($form['location_geocode_google_minimum_accuracy']);
  $form = $data['form'];
  $header = array(
    array(
      'align' => 'center',
      'data' => '<center>' . t('Country') . '</center>',
    ),
    array(
      'align' => 'center',
      'data' => '<center>' . t('Options') . '</center>',
    ),
    array(
      'align' => 'center',
      'data' => '<center>' . t('Configure') . '</center>',
    ),
  );
  $rows = array();
  foreach (element_children($form['countries']) as $country_iso) {
    $row = array();
    $row[] = array(
      'data' => drupal_render($form['countries'][$country_iso]['label_' . $country_iso]),
    );
    $row[] = array(
      'data' => drupal_render($form['countries'][$country_iso]['location_geocode_' . $country_iso]),
    );
    $row[] = array(
      'data' => drupal_render($form['countries'][$country_iso]['location_geocode_config_link_' . $country_iso]),
    );
    $rows[] = $row;
  }
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
  $output .= drupal_render_children($form);
  return $output;
}

/**
 * Location Utilities form.
 */
function location_util_form() {
  $form['province_clear'] = array(
    '#type' => 'fieldset',
    '#title' => t('Clear province cache'),
    '#description' => t('If you have modified location.xx.inc files, you will need to clear the province cache to get Location to recognize the modifications.'),
  );
  $form['province_clear']['province_clear_submit'] = array(
    '#type' => 'submit',
    '#value' => t('Clear province cache'),
    '#submit' => array(
      'location_util_form_clear_province_cache_submit',
    ),
  );
  $form['supported_countries_clear'] = array(
    '#type' => 'fieldset',
    '#title' => t('Clear supported country list'),
    '#description' => t('If you have added support for a new country, you will need to clear the supported country list to get Location to recognize the modifications.'),
  );
  $form['supported_countries_clear']['supported_countries_clear_submit'] = array(
    '#type' => 'submit',
    '#value' => t('Clear supported country list'),
    '#submit' => array(
      'location_util_form_clear_supported_countries_submit',
    ),
  );
  return $form;
}

/**
 * Location utilities form: Clear province cache.
 */
function location_util_form_clear_province_cache_submit() {
  drupal_set_message(t('Location province cache cleared.'));
  cache_clear_all('provinces:', 'cache_location', TRUE);
}

/**
 * Location utilities form: Clear supported countries cache.
 */
function location_util_form_clear_supported_countries_submit() {
  drupal_set_message(t('Location supported country list cleared.'));
  cache_clear_all('location:supported-countries', 'cache_location');
}

/**
 * Bundle overview page.
 */
function location_overview_bundles() {

  // Based on node_overview_types().
  $result = db_query('SELECT * FROM {location_bundles}');
  $bundles = array();
  foreach ($result as $row) {
    $bundles[$row->bundle] = $row;
  }
  $field_ui = module_exists('field_ui');
  $header = array(
    t('Name'),
    array(
      'data' => t('Operations'),
      'colspan' => $field_ui ? '4' : '2',
    ),
  );
  $rows = array();
  foreach ($bundles as $key => $bundle) {
    $row = array();
    $row[] = theme('location_bundle_overview', array(
      'name' => $bundle->name,
      'bundle' => $bundle,
    ));
    $bundle_url_str = str_replace('_', '-', $key);
    $row[] = array(
      'data' => l(t('edit'), 'admin/config/location/bundle/' . $bundle_url_str),
    );
    if ($field_ui) {

      // Manage fields.
      $row[] = array(
        'data' => l(t('manage fields'), 'admin/config/location/bundle/' . $bundle_url_str . '/fields'),
      );

      // Display fields.
      $row[] = array(
        'data' => l(t('manage display'), 'admin/config/location/bundle/' . $bundle_url_str . '/display'),
      );
    }

    // Set the delete column.
    $row[] = array(
      'data' => l(t('delete'), 'admin/config/location/bundle/' . $bundle_url_str . '/delete'),
    );
    $rows[] = $row;
  }
  $build['node_table'] = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => $rows,
    '#empty' => t('No content types available. <a href="@link">Add content type</a>.', array(
      '@link' => url('admin/structure/types/add'),
    )),
  );
  return $build;
}
function theme_location_bundle_overview($variables) {
  $name = $variables['name'];
  $bundle = $variables['bundle'];
  $output = check_plain($name);
  $output .= ' <small> (Machine name: ' . check_plain($bundle->bundle) . ')</small>';
  $output .= '<div class="description">' . filter_xss_admin($bundle->description) . '</div>';
  return $output;
}