You are here

function search_api_location_page_form_search_api_page_admin_edit_alter in Search API Location 7.2

Implements hook_form_FORM_ID_alter().

File

search_api_location_page/search_api_location_page.module, line 184

Code

function search_api_location_page_form_search_api_page_admin_edit_alter(&$form, &$form_state) {
  $page = $form_state['page'];
  $index = search_api_index_load($page->index_id);
  if ($fields = search_api_location_get_location_fields($index)) {
    $options = isset($page->options['search_api_location']) ? $page->options['search_api_location'] : array();
    $form['#validate'][] = 'search_api_location_page_edit_validate';
    $form['options']['search_api_location'] = array(
      '#type' => 'fieldset',
      '#title' => t('Location filters'),
      '#collapsible' => TRUE,
      '#tree' => TRUE,
      '#prefix' => '<div id="search-api-loaction-fieldset">',
      '#suffix' => '</div>',
    );
    $form['submit']['#weight'] = 5;
    $radius_types = array(
      'fixed' => t('Fixed value'),
      'textfield' => t('Text field'),
      'select' => t('Select field'),
    );
    $plugin_options = search_api_location_get_input_plugin_options();
    $plugin_default = key($plugin_options);

    // Use a reference here so we don't have to check for isset().
    $values =& $form_state['values']['options']['search_api_location'];
    foreach ($fields as $key => $field) {
      $css_key = '#edit-options-search-api-location-' . drupal_clean_css_identifier($key);
      $states['visible'][$css_key . '-enabled']['checked'] = TRUE;
      $options += array(
        $key => array(),
      );
      $options[$key] += array(
        'enabled' => FALSE,
        'compact' => FALSE,
        'plugin' => $plugin_default,
        'plugin_settings' => array(),
        'radius_type' => 'fixed',
        'radius_value' => 5,
        'radius_unit' => '1',
        'radius_options' => "- -\n5 5 km\n10 10 km\n16.0935 10 mi",
      );
      if (is_array($options[$key]['radius_options'])) {
        $radius_options = array();
        foreach ($options[$key]['radius_options'] as $range => $label) {
          $range = isset($range) ? $range : '-';
          $radius_options[] = "{$range} {$label}";
        }
        $options[$key]['radius_options'] = implode("\n", $radius_options);
      }
      $form['options']['search_api_location'][$key] = array(
        '#type' => 'fieldset',
        '#title' => check_plain($field['name']),
        '#collapsible' => TRUE,
      );
      $form['options']['search_api_location'][$key]['enabled'] = array(
        '#type' => 'checkbox',
        '#title' => t('Include location filter'),
        '#default_value' => $options[$key]['enabled'],
      );
      $form['options']['search_api_location'][$key]['compact'] = array(
        '#type' => 'checkbox',
        '#title' => t('Show filter in the search block'),
        '#default_value' => $options[$key]['compact'],
        '#states' => $states,
      );
      $form['options']['search_api_location'][$key]['plugin'] = array(
        '#type' => 'select',
        '#title' => t('Input method'),
        '#description' => t('Select the method to use for parsing locations entered by the user.'),
        '#options' => $plugin_options,
        '#default_value' => $options[$key]['plugin'],
        '#states' => $states,
        '#ajax' => array(
          'callback' => 'search_api_location_page_ajax_callback',
          'wrapper' => 'search-api-loaction-fieldset',
        ),
      );
      $plugin_id = !empty($values[$key]['plugin']) ? $values[$key]['plugin'] : $options[$key]['plugin'];
      $plugin = search_api_location_get_input_plugins($plugin_id);
      $form['options']['search_api_location'][$key]['plugin_settings'] = array(
        '#type' => 'fieldset',
        '#title' => t('Input method settings'),
        '#description' => $plugin['description'],
        '#states' => $states,
      );
      if (!empty($plugin['form callback'])) {
        $plugin_options = $plugin_id == $options[$key]['plugin'] ? $options[$key]['plugin_settings'] : array();
        $plugin_form = $plugin['form callback']($form_state, $plugin_options);
        if ($plugin_form) {
          $form['options']['search_api_location'][$key]['plugin_settings'] += $plugin_form;
        }
      }
      $form['options']['search_api_location'][$key]['radius_type'] = array(
        '#type' => 'select',
        '#title' => t('Type of distance filter'),
        '#options' => $radius_types,
        '#default_value' => $options[$key]['radius_type'],
        '#states' => $states,
      );
      $states['visible'][$css_key . '-radius-type']['value'] = 'fixed';
      $form['options']['search_api_location'][$key]['radius_value'] = array(
        '#type' => 'textfield',
        '#title' => t('Maximum distance from location (in kilometers)'),
        '#default_value' => $options[$key]['radius_value'],
        '#states' => $states,
      );
      $states['visible'][$css_key . '-radius-type']['value'] = 'textfield';
      $form['options']['search_api_location'][$key]['radius_unit'] = array(
        '#type' => 'select',
        '#title' => t('Unit used'),
        '#options' => search_api_location_get_units(),
        '#default_value' => $options[$key]['radius_unit'],
        '#states' => $states,
      );
      $states['visible'][$css_key . '-radius-type']['value'] = 'select';
      $form['options']['search_api_location'][$key]['radius_options'] = array(
        '#type' => 'textarea',
        '#title' => t('Distance options'),
        '#description' => t('Add one line per option for “Distance” you want to provide. The first part of each line is the distance in kilometers, everything after the first space is the label. Include a line starting with "- " to include a no-op option.'),
        '#default_value' => $options[$key]['radius_options'],
        '#states' => $states,
      );
    }
  }
}