build[$this->facet['field alias']];
$theme_suffix = '';
$theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet->getAdapter()->getSearcher());
$theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet['field alias']);
$settings = $this->settings->settings;
$step = isset($settings['slider-step']) ? $settings['slider-step'] : 1;
$round_precision = isset($settings['round-precision']) ? (int)$settings['round-precision'] : 0;
$element = array(
'#theme' => 'search_api_ranges_slider' . $theme_suffix,
'#slider' => $this->_buildUISliderForm(),
'#prefix' => '
',
'#suffix' => '
',
'#attached' => array(
'js' => array(
array(
'data' => array(
'search_api_ranges' => array(
$this->facet['field alias'] => array(
'slider-step' => $step,
'round-precision' => $round_precision,
),
),
),
'type' => 'setting'
),
),
),
);
}
/**
* Allows the widget to provide additional settings to the form.
*/
function settingsForm(&$form, &$form_state) {
$form['widget']['widget_settings']['links'][$this->id]['name'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#default_value' => $this->settings->settings['name'],
'#description' => t('The name of the range field.'),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
$form['widget']['widget_settings']['links'][$this->id]['prefix'] = array(
'#type' => 'textfield',
'#title' => t('Prefix'),
'#default_value' => $this->settings->settings['prefix'],
'#description' => t('Adds a prefix to the slider, e.g. $, #.'),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
$form['widget']['widget_settings']['links'][$this->id]['suffix'] = array(
'#type' => 'textfield',
'#title' => t('Suffix'),
'#default_value' => $this->settings->settings['suffix'],
'#description' => t('Adds a suffix to the slider, e.g. €, pcs., etc.'),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
$form['widget']['widget_settings']['links'][$this->id]['auto-submit-delay'] = array(
'#type' => 'textfield',
'#title' => t('Auto Submit Delay'),
'#default_value' => $this->settings->settings['auto-submit-delay'],
'#description' => t('Automatically submit form after the user changes
releases slider handles. Enter a delay in milliseconds,
i.e. 1000 for 1 second.'),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
$form['widget']['widget_settings']['links'][$this->id]['slider-step'] = array(
'#type' => 'textfield',
'#title' => t('Step for the slider'),
'#default_value' => is_numeric($this->settings->settings['slider-step']) ? $this->settings->settings['slider-step'] : 1,
'#description' => t('Default is 1. Can be decimal: 0.1, 0.5 and so on. Use point as delimeter in decimals. From jQuery UI API documentation: Determines the size or amount of each interval or step the slider takes between the min and max. The full specified value range of the slider (max - min) should be evenly divisible by the step.'),
//'#states' => array('invisible' => array( ':input[name="use-decimals"]' => array('checked' => FALSE),),),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
$form['widget']['widget_settings']['links'][$this->id]['round-precision'] = array(
'#type' => 'textfield',
'#title' => t('Round precision'),
'#default_value' => is_numeric($this->settings->settings['round-precision']) ? (int)$this->settings->settings['round-precision'] : 0,
'#description' => t('Specifies the number of decimal digits to round to. Default is 0. Can be only integer number.'),
//'#states' => array('invisible' => array( ':input[name="use-decimals"]' => array('checked' => FALSE),),),
'#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id),),),
);
}
/**
* Returns defaults for the settings form.
*/
function getDefaultSettings() {
return array(
'name' => '',
'prefix' => '',
'suffix' => '',
'auto-submit-delay' => 1500,
'slider-step' => 1,
'round-precision' => 0,
);
}
/**
* Builds a UI slider themed form.
* Performs min/max queries through Search API.
*/
public function _buildUISliderForm() {
$slider = array();
// Get Search API stuff
$searcher = $this->facet->getAdapter()->getSearcher();
$index_id = explode('@', $searcher);
$index = search_api_index_load($index_id[1]);
list($query, $results) = $this->facet->getAdapter()->getCurrentSearch();
$settings = $this->settings->settings;
$round_precision = isset($settings['round-precision']) ? (int)$settings['round-precision'] : 0;
// Make a clone of the query, as to not alter the current search query
$query = clone $query;
// Prepare variables for min/max query
$variables = array(
'index' => $index,
'range_field' => $this->facet['field alias'],
'query' => $query,
'round-precision' => $round_precision,
);
// Query the min/max values for the range slider
$min_value = search_api_ranges_minmax($variables, 'ASC');
$max_value = search_api_ranges_minmax($variables, 'DESC');
// Kill widget if there is nothing to do
if (empty($min_value) && empty($max_value)) {
return array();
};
// Calculate user input from/to values (different concept than min/max)
foreach ($this->facet->getAdapter()->getAllActiveItems() as $key => $active_item) {
if ($active_item['field alias'] == $this->facet['field alias']) {
$values = explode(' ', substr($active_item['value'], 1, -1));
$from_value = round($values[0], $round_precision, PHP_ROUND_HALF_DOWN);
$to_value = round($values[2], $round_precision, PHP_ROUND_HALF_UP);
break;
};
};
// User from/to cannot exceed queried min/max, adjust if needed
if (!isset($from_value) || $from_value < $min_value) {
$from_value = $min_value;
};
if (!isset($to_value) || $max_value < $to_value) {
$to_value = $max_value;
};
// Get facet path field/alias
$range_field = $this->facet['field alias'];
if (module_exists('facetapi_pretty_paths')) {
$processor = new FacetapiUrlProcessorPrettyPaths($this->facet->getAdapter());
$range_field = $processor->getFacetPrettyPathsAlias($this->facet->getFacet());
};
// Prepare the slider variables and return themed form
// @see search-api-ranges-slider.tpl.php
$variables = array(
'range_field' => rawurlencode($range_field),
'name' => $this->settings->settings['name'],
'prefix' => $this->settings->settings['prefix'],
'suffix' => $this->settings->settings['suffix'],
'min' => $min_value,
'max' => $max_value,
'from' => $from_value,
'to' => $to_value,
'auto_submit_delay' => is_numeric($this->settings->settings['auto-submit-delay']) ? $this->settings->settings['auto-submit-delay'] : 0,
'active_items' => $this->facet->getAdapter()->getAllActiveItems(),
'target' => $this->facet->getAdapter()->getSearchPath(),
);
// We need to generate unique form IDs in case multiple forms get rendered
// on the same page. search_api_ranges_forms() takes care of mapping them
// back to the base form ID 'search_api_ranges_block_slider_view_form'.
return drupal_get_form('search_api_ranges_block_slider_view_form_' . $range_field, $variables);
}
}