View source
<?php
class views_handler_filter_in_operator extends views_handler_filter {
var $value_form_type = 'checkboxes';
var $value_options = NULL;
function construct() {
parent::construct();
$this->value_title = t('Options');
$this->value_options = NULL;
}
function get_value_options() {
if (isset($this->value_options)) {
return;
}
if (isset($this->definition['options callback']) && is_callable($this->definition['options callback'])) {
if (isset($this->definition['options arguments']) && is_array($this->definition['options arguments'])) {
$this->value_options = call_user_func_array($this->definition['options callback'], $this->definition['options arguments']);
}
else {
$this->value_options = call_user_func($this->definition['options callback']);
}
}
else {
$this->value_options = array(
t('Yes'),
t('No'),
);
}
return $this->value_options;
}
function expose_options() {
parent::expose_options();
$this->options['expose']['reduce'] = FALSE;
}
function expose_form_right(&$form, &$form_state) {
parent::expose_form_right($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']),
);
}
function option_definition() {
$options = parent::option_definition();
$options['operator']['default'] = 'in';
$options['value']['default'] = array();
$options['expose']['contains']['reduce'] = array(
'default' => FALSE,
);
return $options;
}
function operators() {
$operators = array(
'in' => array(
'title' => t('Is one of'),
'short' => t('in'),
'short_single' => t('='),
'method' => 'op_simple',
'values' => 1,
),
'not in' => array(
'title' => t('Is not one of'),
'short' => t('not in'),
'short_single' => t('<>'),
'method' => 'op_simple',
'values' => 1,
),
);
if (!empty($this->definition['allow empty'])) {
$operators += array(
'empty' => array(
'title' => t('Is empty (NULL)'),
'method' => 'op_empty',
'short' => t('empty'),
'values' => 0,
),
'not empty' => array(
'title' => t('Is not empty (NOT NULL)'),
'method' => 'op_empty',
'short' => t('not empty'),
'values' => 0,
),
);
}
return $operators;
}
function operator_options($which = 'title') {
$options = array();
foreach ($this
->operators() as $id => $info) {
$options[$id] = $info[$which];
}
return $options;
}
function operator_values($values = 1) {
$options = array();
foreach ($this
->operators() as $id => $info) {
if (isset($info['values']) && $info['values'] == $values) {
$options[] = $id;
}
}
return $options;
}
function value_form(&$form, &$form_state) {
$form['value'] = array();
$this
->get_value_options();
$options = $this->value_options;
$default_value = (array) $this->value;
$which = 'all';
if (!empty($form['operator'])) {
$source = $form['operator']['#type'] == 'radios' ? 'radio:options[operator]' : 'edit-options-operator';
}
if (!empty($form_state['exposed'])) {
$identifier = $this->options['expose']['identifier'];
if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator'])) {
$which = in_array($this->operator, $this
->operator_values(1)) ? 'value' : 'none';
}
else {
$source = 'edit-' . form_clean_id($this->options['expose']['operator']);
}
if (!empty($this->options['expose']['reduce'])) {
$options = $this
->reduce_value_options();
if (empty($this->options['expose']['single']) && !empty($this->options['expose']['optional'])) {
$default_value = array();
}
}
if (!empty($this->options['expose']['single'])) {
if (!empty($this->options['expose']['optional']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) {
$default_value = 'All';
}
else {
if (empty($default_value)) {
$keys = array_keys($options);
$default_value = array_shift($keys);
}
else {
$copy = $default_value;
$default_value = array_shift($copy);
}
}
}
}
if ($which == 'all' || $which == 'value') {
$form['value'] = array(
'#type' => $this->value_form_type,
'#title' => $this->value_title,
'#options' => $options,
'#default_value' => $default_value,
'#multiple' => TRUE,
'#size' => count($options) > 8 ? 8 : count($options),
);
if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
$form_state['input'][$identifier] = $default_value;
}
$process = array();
if ($this->value_form_type == 'checkboxes') {
$process[] = 'views_process_check_options';
}
if ($which == 'all') {
if (empty($form_state['exposed']) && ($this->value_form_type == 'checkboxes' || $this->value_form_type == 'radios')) {
$process[] = "expand_{$this->value_form_type}";
$form['value']['#prefix'] = '<div id="edit-options-value-wrapper">';
$form['value']['#suffix'] = '</div>';
}
$process[] = 'views_process_dependency';
$form['value']['#dependency'] = array(
$source => $this
->operator_values(1),
);
}
if (!empty($process)) {
$form['value']['#process'] = $process;
}
}
}
function reduce_value_options($input = NULL) {
if (!isset($input)) {
$input = $this->value_options;
}
$options = array();
foreach ($input as $id => $option) {
if (is_array($option)) {
$options[$id] = $this
->reduce_value_options($option);
continue;
}
else {
if (is_object($option)) {
$keys = array_keys($option->option);
$key = array_shift($keys);
if (isset($this->options['value'][$key])) {
$options[$id] = $option;
}
}
else {
if (isset($this->options['value'][$id])) {
$options[$id] = $option;
}
}
}
}
return $options;
}
function accept_exposed_input($input) {
if (empty($this->options['exposed'])) {
return TRUE;
}
if (!empty($this->options['expose']['single']) && !empty($this->options['expose']['optional']) && !empty($this->options['expose']['limit'])) {
$identifier = $this->options['expose']['identifier'];
if ($input[$identifier] == 'All') {
return TRUE;
}
}
return parent::accept_exposed_input($input);
}
function value_submit($form, &$form_state) {
$form_state['values']['options']['value'] = $form['value']['#value'];
}
function admin_summary() {
if (!empty($this->options['exposed'])) {
return t('exposed');
}
$info = $this
->operators();
$this
->get_value_options();
if (!is_array($this->value)) {
return;
}
$operator = check_plain($info[$this->operator]['short']);
$values = '';
if (in_array($this->operator, $this
->operator_values(1))) {
foreach ($this->value as $value) {
if (!isset($this->value_options[$value])) {
unset($this->value[$value]);
}
}
if (count($this->value) == 0) {
$values = t('Unknown');
}
else {
if (count($this->value) == 1) {
if (isset($info[$this->operator]['short_single'])) {
$operator = check_plain($info[$this->operator]['short_single']);
}
$keys = $this->value;
$value = array_shift($keys);
if (isset($this->value_options[$value])) {
$values = check_plain($this->value_options[$value]);
}
else {
$values = '';
}
}
else {
foreach ($this->value as $value) {
if ($values !== '') {
$values .= ', ';
}
if (strlen($values) > 8) {
$values .= '...';
break;
}
if (isset($this->value_options[$value])) {
$values .= check_plain($this->value_options[$value]);
}
}
}
}
}
return $operator . ($values !== '' ? ' ' . $values : '');
}
function query() {
$info = $this
->operators();
if (!empty($info[$this->operator]['method'])) {
$this
->{$info[$this->operator]['method']}();
}
}
function op_simple() {
if (empty($this->value)) {
return;
}
$this
->ensure_my_table();
$placeholder = !empty($this->definition['numeric']) ? '%d' : "'%s'";
$replace = array_fill(0, sizeof($this->value), $placeholder);
$in = ' (' . implode(", ", $replace) . ')';
$this->query
->add_where($this->options['group'], "{$this->table_alias}.{$this->real_field} " . $this->operator . $in, array_values($this->value));
}
function op_empty() {
$this
->ensure_my_table();
$field = "{$this->table_alias}.{$this->real_field}";
if ($this->operator == 'empty') {
$operator = "IS NULL";
}
else {
$operator = "IS NOT NULL";
}
$this->query
->add_where($this->options['group'], "{$field} {$operator}");
}
function validate() {
$this
->get_value_options();
$errors = array();
if (in_array($this->operator, $this
->operator_values(0))) {
return array();
}
if (!in_array($this->operator, $this
->operator_values(1))) {
$errors[] = t('The operator is invalid on filter: @filter.', array(
'@filter' => $this
->ui_name(TRUE),
));
}
if (is_array($this->value)) {
if (!isset($this->value_options)) {
return $errors;
}
if ($this->options['exposed'] && !$this->options['expose']['required'] && empty($this->value)) {
return $errors;
}
$flat_options = form_options_flatten($this->value_options, TRUE);
foreach ($this->value as $value) {
if (!isset($flat_options[$value])) {
unset($this->value[$value]);
}
}
if (count($this->value) == 0) {
$errors[] = t('No valid values found on filter: @filter.', array(
'@filter' => $this
->ui_name(TRUE),
));
}
}
elseif (!empty($this->value) && ($this->operator == 'in' || $this->operator == 'not in')) {
$errors[] = t('The value @value is not an array for @operator on filter: @filter', array(
'@value' => views_var_export($this->value),
'@operator' => $this->operator,
'@filter' => $this
->ui_name(TRUE),
));
}
return $errors;
}
}