value_value = t('True'); if (isset($this->definition['label'])) { $this->value_value = $this->definition['label']; } if (isset($this->definition['accept_null'])) { $this->accept_null = (bool) $this->definition['accept null']; } $this->value_options = NULL; parent::construct(); } /** * Return the possible options for this filter. * * Child classes should override this function to set the possible values * for the filter. Since this is a boolean filter, the array should have * two possible keys: 1 for "True" and 0 for "False", although the labels * can be whatever makes sense for the filter. These values are used for * configuring the filter, when the filter is exposed, and in the admin * summary of the filter. Normally, this should be static data, but if it's * dynamic for some reason, child classes should use a guard to reduce * database hits as much as possible. */ function get_value_options() { if (isset($this->definition['type'])) { if ($this->definition['type'] == 'yes-no') { $this->value_options = array(1 => t('Yes'), 0 => t('No')); } if ($this->definition['type'] == 'on-off') { $this->value_options = array(1 => t('On'), 0 => t('Off')); } } // Provide a fallback if the above didn't set anything. if (!isset($this->value_options)) { $this->value_options = array(1 => t('True'), 0 => t('False')); } } function option_definition() { $options = parent::option_definition(); $options['value']['default'] = FALSE; return $options; } function operator_form(&$form, &$form_state) { $form['operator'] = array(); } function value_form(&$form, &$form_state) { if (empty($this->value_options)) { // Initialize the array of possible values for this filter. $this->get_value_options(); } if (!empty($form_state['exposed'])) { // Exposed filter: use a select box to save space. $filter_form_type = 'select'; } else { // Configuring a filter: use radios for clarity. $filter_form_type = 'radios'; } $form['value'] = array( '#type' => $filter_form_type, '#title' => $this->value_value, '#options' => $this->value_options, '#default_value' => $this->value, ); if (!empty($this->options['exposed'])) { $identifier = $this->options['expose']['identifier']; if (!isset($form_state['input'][$identifier])) { $form_state['input'][$identifier] = $this->value; } // If we're configuring an exposed filter, add an option. $any_label = variable_get('views_exposed_filter_any_label', 'old_any') == 'old_any' ? t('') : t('- Any -'); if ($form['value']['#type'] != 'select') { $any_label = check_plain($any_label); } $form['value']['#options'] = array('All' => $any_label) + $form['value']['#options']; } } function value_validate(&$form, &$form_state) { if ($form_state['values']['options']['value'] == 'All' && empty($form_state['values']['options']['expose']['optional'])) { form_set_error('value', t('You must select a value unless this is an optional exposed filter.')); } } function admin_summary() { if (!empty($this->options['exposed'])) { return t('exposed'); } if (empty($this->value_options)) { $this->get_value_options(); } // Now that we have the valid options for this filter, just return the // human-readable label based on the current value. The value_options // array is keyed with either 0 or 1, so if the current value is not // empty, use the label for 1, and if it's empty, use the label for 0. return $this->value_options[!empty($this->value)]; } function expose_options() { parent::expose_options(); $this->options['expose']['operator'] = ''; $this->options['expose']['label'] = $this->value_value; $this->options['expose']['optional'] = FALSE; } function query() { $this->ensure_my_table(); $where = "$this->table_alias.$this->real_field "; if (empty($this->value)) { $where .= '= 0'; if ($this->accept_null) { $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)"; } } else { $where .= '<> 0'; } $this->query->add_where($this->options['group'], $where); } }