Issue #1171360 by jbguerraz, drunken monkey: Added possibility to restrict the option...
authorThomas Seidl
Mon, 30 May 2011 23:17:57 +0000 (01:17 +0200)
committerThomas Seidl
Mon, 30 May 2011 23:17:57 +0000 (01:17 +0200)
CHANGELOG.txt
contrib/search_api_views/includes/handler_filter_options.inc

index 1be6ae4..8200588 100644 (file)
@@ -6,6 +6,8 @@ API changes:
 - #1138992 by becw, drunken monkey: Added read-only indexes.
 
 Others:
+- #1171360 by jbguerraz, drunken monkey: Added possibility to restrict the
+  options to display in an exposed options filter.
 - #1161676 by awolfey, drunken monkey: Added Stopwords processor.
 - #1166514 by drunken monkey: Fixed parseKeys() to handle incomplete quoting.
 - #1161966 by JoeMcGuire: Added Search API Spellcheck support for Pages.
index c892416..4479fac 100644 (file)
@@ -9,24 +9,96 @@
  */
 class SearchApiViewsHandlerFilterOptions extends SearchApiViewsHandlerFilter {
 
+  protected $value_form_type = 'checkboxes';
+
   /**
    * Provide a list of options for the operator form.
    */
   public function operator_options() {
     return array(
-      '=' => t('is one of'),
-      '<>' => t('is not one of'),
+      '=' => t('Is one of'),
+      '<>' => t('Is not one of'),
     );
   }
 
   /**
+   * Set "reduce" option to FALSE by default.
+   */
+  public function expose_options() {
+    parent::expose_options();
+    $this->options['expose']['reduce'] = FALSE;
+  }
+
+  /**
+   * Add the "reduce" option to the exposed form.
+   */
+  public function expose_form(&$form, &$form_state) {
+    parent::expose_form($form, $form_state);
+    $form['expose']['reduce'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Limit list to selected items'),
+      '#description' => t('If checked, the only items presented to the user will be the ones selected here.'),
+      '#default_value' => !empty($this->options['expose']['reduce']),
+    );
+  }
+
+  /**
+   * Define "reduce" option.
+   */
+  public function option_definition() {
+    $options = parent::option_definition();
+    $options['expose']['contains']['reduce'] = array('default' => FALSE);
+    return $options;
+  }
+
+  /**
+   * Reduce the options according to the selection.
+   */
+  protected function reduce_value_options() {
+    $options = array();
+    foreach ($this->definition['options'] as $id => $option) {
+      if (isset($this->options['value'][$id])) {
+        $options[$id] = $option;
+      }
+    }
+    return $options;
+  }
+
+  /**
+   * Save set checkboxes.
+   */
+  public function value_submit($form, &$form_state) {
+    // Drupal's FAPI system automatically puts '0' in for any checkbox that
+    // was not set, and the key to the checkbox if it is set.
+    // Unfortunately, this means that if the key to that checkbox is 0,
+    // we are unable to tell if that checkbox was set or not.
+
+    // Luckily, the '#value' on the checkboxes form actually contains
+    // *only* a list of checkboxes that were set, and we can use that
+    // instead.
+
+    $form_state['values']['options']['value'] = $form['value']['#value'];
+  }
+
+  /**
    * Provide a form for setting options.
    */
   public function value_form(&$form, &$form_state) {
+    $options = array();
+    if (empty($form_state['exposed'])) {
+      // Add a select all option to the value form.
+      $options = array('all' => t('Select all'));
+    }
+    if (!empty($this->options['expose']['reduce']) && !empty($form_state['exposed'])) {
+      $options += $this->reduce_value_options($form_state);
+    }
+    else {
+      $options += $this->definition['options'];
+    }
     $form['value'] = array(
-      '#type' => 'select',
+      '#type' => $this->value_form_type,
       '#title' => empty($form_state['exposed']) ? t('Value') : '',
-      '#options' => $this->definition['options'],
+      '#options' => $options,
       '#multiple' => TRUE,
       '#size' => min(4, count($this->definition['options'])),
       '#default_value' => isset($this->value) ? $this->value : array(),