Newer
Older
* Definition of Drupal\views\Plugin\views\filter\Numeric.
namespace Drupal\views\Plugin\views\filter;
use Drupal\Component\Annotation\PluginID;
/**
* Simple filter to handle greater than/less than filters
*
* @ingroup views_filter_handlers
* @PluginID("numeric")
class Numeric extends FilterPluginBase {
Alex Pott
committed
protected $alwaysMultiple = TRUE;
protected function defineOptions() {
$options = parent::defineOptions();
$options['value'] = array(
'contains' => array(
'min' => array('default' => ''),
'max' => array('default' => ''),
'value' => array('default' => ''),
),
);
return $options;
}
function operators() {
$operators = array(
'<' => array(
'title' => t('Is less than'),
'method' => 'opSimple',
'short' => t('<'),
'values' => 1,
),
'<=' => array(
'title' => t('Is less than or equal to'),
'method' => 'opSimple',
'short' => t('<='),
'values' => 1,
),
'=' => array(
'title' => t('Is equal to'),
'method' => 'opSimple',
'short' => t('='),
'values' => 1,
),
'!=' => array(
'title' => t('Is not equal to'),
'method' => 'opSimple',
'short' => t('!='),
'values' => 1,
),
'>=' => array(
'title' => t('Is greater than or equal to'),
'method' => 'opSimple',
'short' => t('>='),
'values' => 1,
),
'>' => array(
'title' => t('Is greater than'),
'method' => 'opSimple',
'short' => t('>'),
'values' => 1,
),
'between' => array(
'title' => t('Is between'),
'method' => 'opBetween',
'short' => t('between'),
'values' => 2,
),
'not between' => array(
'title' => t('Is not between'),
'method' => 'opBetween',
'short' => t('not between'),
'values' => 2,
),
catch
committed
'regular_expression' => array(
'title' => t('Regular expression'),
'short' => t('regex'),
'method' => 'op_regex',
'values' => 1,
),
);
// if the definition allows for the empty operator, add it.
if (!empty($this->definition['allow empty'])) {
$operators += array(
'empty' => array(
'title' => t('Is empty (NULL)'),
'method' => 'opEmpty',
'short' => t('empty'),
'values' => 0,
),
'not empty' => array(
'title' => t('Is not empty (NOT NULL)'),
'method' => 'opEmpty',
'short' => t('not empty'),
'values' => 0,
),
);
}
return $operators;
}
/**
* Provide a list of all the numeric operators
*/
Alex Pott
committed
public function operatorOptions($which = 'title') {
$options = array();
foreach ($this->operators() as $id => $info) {
$options[$id] = $info[$which];
}
return $options;
}
Alex Pott
committed
protected function operatorValues($values = 1) {
$options = array();
foreach ($this->operators() as $id => $info) {
if ($info['values'] == $values) {
$options[] = $id;
}
}
return $options;
}
/**
* Provide a simple textfield for equality
*/
protected function valueForm(&$form, &$form_state) {
$form['value']['#tree'] = TRUE;
// 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';
if (!empty($form['operator'])) {
$source = ':input[name="options[operator]"]';
}
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.
Alex Pott
committed
$which = in_array($this->operator, $this->operatorValues(2)) ? 'minmax' : 'value';
$source = ':input[name="' . $this->options['expose']['operator_id'] . '"]';
}
}
if ($which == 'all') {
$form['value']['value'] = array(
'#type' => 'textfield',
'#title' => empty($form_state['exposed']) ? t('Value') : '',
'#size' => 30,
'#default_value' => $this->value['value'],
);
// Setup #states for all operators with one value.
Alex Pott
committed
foreach ($this->operatorValues(1) as $operator) {
$form['value']['value']['#states']['visible'][] = array(
$source => array('value' => $operator),
);
}
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
if (!empty($form_state['exposed']) && !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' => $this->value['value'],
);
if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
$form_state['input'][$identifier] = $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') {
$states = array();
// Setup #states for all operators with two values.
Alex Pott
committed
foreach ($this->operatorValues(2) as $operator) {
$states['#states']['visible'][] = array(
$source => array('value' => $operator),
);
}
$form['value']['min'] += $states;
$form['value']['max'] += $states;
}
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'])) {
// Ensure there is something in the 'value'.
$form['value'] = array(
'#type' => 'value',
'#value' => NULL
);
}
}
}
public function query() {
$this->ensureMyTable();
$field = "$this->tableAlias.$this->realField";
$info = $this->operators();
if (!empty($info[$this->operator]['method'])) {
$this->{$info[$this->operator]['method']}($field);
}
}
protected function opBetween($field) {
Alex Pott
committed
$this->query->addWhere($this->options['group'], $field, array($this->value['min'], $this->value['max']), 'BETWEEN');
Alex Pott
committed
$this->query->addWhere($this->options['group'], db_or()->condition($field, $this->value['min'], '<=')->condition($field, $this->value['max'], '>='));
protected function opSimple($field) {
Alex Pott
committed
$this->query->addWhere($this->options['group'], $field, $this->value['value'], $this->operator);
protected function opEmpty($field) {
if ($this->operator == 'empty') {
$operator = "IS NULL";
}
else {
$operator = "IS NOT NULL";
}
Alex Pott
committed
$this->query->addWhere($this->options['group'], $field, NULL, $operator);
catch
committed
/**
* Filters by a regular expression.
*
* @param string $field
* The expression pointing to the queries field, for example "foo.bar".
*/
Angie Byron
committed
protected function opRegex($field) {
catch
committed
$this->query->addWhere($this->options['group'], $field, $this->value, 'REGEXP');
public function adminSummary() {
if ($this->isAGroup()) {
Tim Plunkett
committed
return t('grouped');
}
if (!empty($this->options['exposed'])) {
return t('exposed');
}
Alex Pott
committed
$options = $this->operatorOptions('short');
$output = check_plain($options[$this->operator]);
Alex Pott
committed
if (in_array($this->operator, $this->operatorValues(2))) {
$output .= ' ' . t('@min and @max', array('@min' => $this->value['min'], '@max' => $this->value['max']));
}
Alex Pott
committed
elseif (in_array($this->operator, $this->operatorValues(1))) {
$output .= ' ' . check_plain($this->value['value']);
}
return $output;
}
/**
* Do some minor translation of the exposed input
*/
public function acceptExposedInput($input) {
if (empty($this->options['exposed'])) {
return TRUE;
}
// rewrite the input value so that it's in the correct format so that
// the parent gets the right data.
if (!empty($this->options['expose']['identifier'])) {
$value = &$input[$this->options['expose']['identifier']];
if (!is_array($value)) {
$value = array(
'value' => $value,
);
}
}
$rc = parent::acceptExposedInput($input);
if (empty($this->options['expose']['required'])) {
// We have to do some of our own checking for non-required filters.
$info = $this->operators();
if (!empty($info[$this->operator]['values'])) {
switch ($info[$this->operator]['values']) {
case 1:
if ($value['value'] === '') {
return FALSE;
}
break;
case 2:
if ($value['min'] === '' && $value['max'] === '') {
return FALSE;
}
break;
}
}
}
return $rc;
}