123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- /**
- * @file
- * Contains SearchApiViewsHandlerFilterNumeric.
- */
- /**
- * Views filter handler class for handling numeric and "string" fields.
- */
- class SearchApiViewsHandlerFilterNumeric extends SearchApiViewsHandlerFilter {
- /**
- * {@inheritdoc}
- */
- public function init(&$view, &$options) {
- parent::init($view, $options);
- $this->normalizeValue();
- }
- /**
- * {@inheritdoc}
- */
- public function option_definition() {
- $options = parent::option_definition();
- $options['value'] = array(
- 'contains' => array(
- 'value' => array('default' => ''),
- 'min' => array('default' => ''),
- 'max' => array('default' => ''),
- ),
- );
- return $options;
- }
- /**
- * {@inheritdoc}
- */
- public function operator_options() {
- $operators = parent::operator_options();
- $index = search_api_index_load(substr($this->table, 17));
- $server = NULL;
- try {
- if ($index) {
- $server = $index->server();
- }
- }
- catch (SearchApiException $e) {
- // Ignore.
- }
- if ($server && $server->supportsFeature('search_api_between')) {
- $operators += array(
- 'between' => t('Is between'),
- 'not between' => t('Is not between'),
- );
- }
- return $operators;
- }
- /**
- * Provides a form for setting the filter value.
- *
- * Heavily borrowed from views_handler_filter_numeric.
- *
- * @see views_handler_filter_numeric::value_form()
- */
- public function value_form(&$form, &$form_state) {
- $form['value']['#tree'] = TRUE;
- $single_field_operators = $this->operator_options();
- unset(
- $single_field_operators['empty'],
- $single_field_operators['not empty'],
- $single_field_operators['between'],
- $single_field_operators['not between']
- );
- $between_operators = array('between', 'not between');
- // We have to make some choices when creating this as an exposed
- // filter form. For example, if the operator is locked and thus
- // not rendered, we can't render dependencies; instead we only
- // render the form items we need.
- $which = 'all';
- $source = NULL;
- if (!empty($form['operator'])) {
- $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator';
- }
- $identifier = NULL;
- if (!empty($form_state['exposed'])) {
- $identifier = $this->options['expose']['identifier'];
- if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator_id'])) {
- // Exposed and locked.
- $which = in_array($this->operator, $between_operators) ? 'minmax' : 'value';
- }
- else {
- $source = 'edit-' . drupal_html_id($this->options['expose']['operator_id']);
- }
- }
- // Hide the value box if the operator is 'empty' or 'not empty'.
- // Radios share the same selector so we have to add some dummy selector.
- if ($which == 'all') {
- $form['value']['value'] = array(
- '#type' => 'textfield',
- '#title' => empty($form_state['exposed']) ? t('Value') : '',
- '#size' => 30,
- '#default_value' => $this->value['value'],
- '#dependency' => array($source => array_keys($single_field_operators)),
- );
- if ($identifier && !isset($form_state['input'][$identifier]['value'])) {
- $form_state['input'][$identifier]['value'] = $this->value['value'];
- }
- }
- elseif ($which == 'value') {
- // When exposed we drop the value-value and just do value if
- // the operator is locked.
- $form['value'] = array(
- '#type' => 'textfield',
- '#title' => empty($form_state['exposed']) ? t('Value') : '',
- '#size' => 30,
- '#default_value' => isset($this->value['value']) ? $this->value['value'] : '',
- );
- if ($identifier && !isset($form_state['input'][$identifier])) {
- $form_state['input'][$identifier] = isset($this->value['value']) ? $this->value['value'] : '';
- }
- }
- if ($which == 'all' || $which == 'minmax') {
- $form['value']['min'] = array(
- '#type' => 'textfield',
- '#title' => empty($form_state['exposed']) ? t('Min') : '',
- '#size' => 30,
- '#default_value' => $this->value['min'],
- );
- $form['value']['max'] = array(
- '#type' => 'textfield',
- '#title' => empty($form_state['exposed']) ? t('And max') : t('And'),
- '#size' => 30,
- '#default_value' => $this->value['max'],
- );
- if ($which == 'all') {
- $form['value']['min']['#dependency'] = array($source => $between_operators);
- $form['value']['max']['#dependency'] = array($source => $between_operators);
- }
- if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['min'])) {
- $form_state['input'][$identifier]['min'] = $this->value['min'];
- }
- if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['max'])) {
- $form_state['input'][$identifier]['max'] = $this->value['max'];
- }
- if (!isset($form['value']['value'])) {
- // Ensure there is something in the 'value'.
- $form['value']['value'] = array(
- '#type' => 'value',
- '#value' => NULL,
- );
- }
- }
- }
- /**
- * {@inheritdoc}
- */
- public function admin_summary() {
- if (!empty($this->options['exposed'])) {
- return t('exposed');
- }
- if ($this->operator === 'empty') {
- return t('is empty');
- }
- if ($this->operator === 'not empty') {
- return t('is not empty');
- }
- if (in_array($this->operator, array('between', 'not between'), TRUE)) {
- // This is of course wrong for translation purposes, but copied from
- // views_handler_filter_numeric::admin_summary() so probably still better
- // to re-use this than to do it correctly.
- $operator = $this->operator === 'between' ? t('between') : t('not between');
- $vars = array(
- '@min' => (string) $this->value['min'],
- '@max' => (string) $this->value['max'],
- );
- return $operator . ' ' . t('@min and @max', $vars);
- }
- return check_plain((string) $this->operator) . ' ' . check_plain((string) $this->value['value']);
- }
- /**
- * {@inheritdoc}
- */
- public function query() {
- $this->normalizeValue();
- if (in_array($this->operator, array('between', 'not between'), TRUE)) {
- $min = $this->value['min'];
- $max = $this->value['max'];
- if ($min !== '' && $max !== '') {
- $this->query->condition($this->real_field, array($min, $max), strtoupper($this->operator), $this->options['group']);
- }
- elseif ($min !== '') {
- $operator = $this->operator === 'between' ? '>=' : '<';
- $this->query->condition($this->real_field, $min, $operator, $this->options['group']);
- }
- elseif ($max !== '') {
- $operator = $this->operator === 'between' ? '<=' : '>';
- $this->query->condition($this->real_field, $min, $operator, $this->options['group']);
- }
- }
- else {
- // The parent handler doesn't expect our value structure, just pass the
- // scalar value instead.
- $this->value = $this->value['value'];
- parent::query();
- }
- }
- /**
- * Sets $this->value to an array of options as defined by the filter.
- *
- * @see SearchApiViewsHandlerFilterNumeric::option_definition()
- */
- protected function normalizeValue() {
- $value = $this->value;
- if (is_array($value) && isset($value[0])) {
- $value = $value[0];
- }
- if (!is_array($value)) {
- $value = array('value' => $value);
- }
- $this->value = array(
- 'value' => isset($value['value']) ? $value['value'] : '',
- 'min' => isset($value['min']) ? $value['min'] : '',
- 'max' => isset($value['max']) ? $value['max'] : '',
- );
- }
- }
|