You are here

handler_argument_fulltext.inc in Search API 7

Contains SearchApiViewsHandlerArgumentFulltext.

File

contrib/search_api_views/includes/handler_argument_fulltext.inc
View source
<?php

/**
 * @file
 * Contains SearchApiViewsHandlerArgumentFulltext.
 */

/**
 * Views argument handler class for handling fulltext fields.
 */
class SearchApiViewsHandlerArgumentFulltext extends SearchApiViewsHandlerArgument {

  /**
   * Specify the options this filter uses.
   */
  public function option_definition() {
    $options = parent::option_definition();
    $options['fields'] = array(
      'default' => array(),
    );
    $options['conjunction'] = array(
      'default' => 'AND',
    );
    return $options;
  }

  /**
   * Extend the options form a bit.
   */
  public function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $form['help']['#markup'] = t('Note: You can change how search keys are parsed under "Advanced" > "Query settings".');
    $fields = $this
      ->getFulltextFields();
    if (!empty($fields)) {
      $form['fields'] = array(
        '#type' => 'select',
        '#title' => t('Searched fields'),
        '#description' => t('Select the fields that will be searched. If no fields are selected, all available fulltext fields will be searched.'),
        '#options' => $fields,
        '#size' => min(4, count($fields)),
        '#multiple' => TRUE,
        '#default_value' => $this->options['fields'],
      );
      $form['conjunction'] = array(
        '#title' => t('Operator'),
        '#description' => t('Determines how multiple keywords entered for the search will be combined.'),
        '#type' => 'radios',
        '#options' => array(
          'AND' => t('Contains all of these words'),
          'OR' => t('Contains any of these words'),
        ),
        '#default_value' => $this->options['conjunction'],
      );
    }
    else {
      $form['fields'] = array(
        '#type' => 'value',
        '#value' => array(),
      );
    }
  }

  /**
   * Set up the query for this argument.
   *
   * The argument sent may be found at $this->argument.
   */
  public function query($group_by = FALSE) {
    if ($this->options['fields']) {
      try {
        $this->query
          ->fields($this->options['fields']);
      } catch (SearchApiException $e) {
        $this->query
          ->abort($e
          ->getMessage());
        return;
      }
    }
    if ($this->options['conjunction'] != 'AND') {
      $this->query
        ->setOption('conjunction', $this->options['conjunction']);
    }
    $old = $this->query
      ->getOriginalKeys();
    $this->query
      ->keys($this->argument);
    if ($old) {
      $keys =& $this->query
        ->getKeys();
      if (is_array($keys)) {
        $keys[] = $old;
      }
      elseif (is_array($old)) {

        // We don't support such nonsense.
      }
      else {
        $keys = "({$old}) ({$keys})";
      }
    }
  }

  /**
   * Helper method to get an option list of all available fulltext fields.
   */
  protected function getFulltextFields() {
    $ret = array();
    $index = search_api_index_load(substr($this->table, 17));
    if (!empty($index->options['fields'])) {
      $fields = $index
        ->getFields();
      foreach ($index
        ->getFulltextFields() as $field) {
        $ret[$field] = $fields[$field]['name'];
      }
    }
    return $ret;
  }

}

Classes

Namesort descending Description
SearchApiViewsHandlerArgumentFulltext Views argument handler class for handling fulltext fields.