From 41b80efa0e5c87060281d57ff524168e77bfb4fd Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 13 Aug 2015 15:58:04 +0200 Subject: [PATCH] FilterEditor: Support queries implementing the FilterColumns interface refs #9029 --- library/Icinga/Web/Widget/FilterEditor.php | 54 ++++++++++++---------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/library/Icinga/Web/Widget/FilterEditor.php b/library/Icinga/Web/Widget/FilterEditor.php index ef09080e2..238a79130 100644 --- a/library/Icinga/Web/Widget/FilterEditor.php +++ b/library/Icinga/Web/Widget/FilterEditor.php @@ -4,6 +4,7 @@ namespace Icinga\Web\Widget; use Icinga\Data\Filterable; +use Icinga\Data\FilterColumns; use Icinga\Data\Filter\Filter; use Icinga\Data\Filter\FilterExpression; use Icinga\Data\Filter\FilterChain; @@ -232,19 +233,25 @@ class FilterEditor extends AbstractWidget if (strpos($search, '=') !== false) { list($k, $v) = preg_split('/=/', $search); $filter = $this->mergeRootExpression($filter, trim($k), '=', ltrim($v)); - } elseif (! empty($this->searchColumns)) { - if (! $this->resetSearchColumns($filter)) { - $filter = Filter::matchAll(); - } - $filters = array(); - $search = ltrim($search); - foreach ($this->searchColumns as $searchColumn) { - $filters[] = Filter::expression($searchColumn, '=', "*$search*"); - } - $filter = $filter->andFilter(new FilterOr($filters)); } else { - Notification::error(mt('monitoring', 'Cannot search here')); - return $this; + if ($this->searchColumns === null && $this->query instanceof FilterColumns) { + $this->searchColumns = $this->query->getSearchColumns(); + } + + if (! empty($this->searchColumns)) { + if (! $this->resetSearchColumns($filter)) { + $filter = Filter::matchAll(); + } + $filters = array(); + $search = ltrim($search); + foreach ($this->searchColumns as $searchColumn) { + $filters[] = Filter::expression($searchColumn, '=', "*$search*"); + } + $filter = $filter->andFilter(new FilterOr($filters)); + } else { + Notification::error(mt('monitoring', 'Cannot search here')); + return $this; + } } $url = $this->url()->setQueryString( @@ -500,12 +507,14 @@ class FilterEditor extends AbstractWidget ); } - protected function arrayForSelect($array) + protected function arrayForSelect($array, $flip = false) { $res = array(); foreach ($array as $k => $v) { if (is_int($k)) { - $res[$v] = $v; + $res[str_replace('_', ' ', ucfirst($v))] = $v; + } elseif ($flip) { + $res[$v] = $k; } else { $res[$k] = $v; } @@ -576,20 +585,15 @@ class FilterEditor extends AbstractWidget ); } - if ($this->cachedColumnSelect === null) { - $this->cachedColumnSelect = $this->arrayForSelect($this->query->getColumns()); + if ($this->cachedColumnSelect === null && $this->query instanceof FilterColumns) { + $this->cachedColumnSelect = $this->arrayForSelect($this->query->getFilterColumns(), true); asort($this->cachedColumnSelect); - } - $cols = $this->cachedColumnSelect; - $seen = false; - foreach ($cols as $k => & $v) { - $v = str_replace('_', ' ', ucfirst($v)); - if ($k === $active) { - $seen = true; - } + } elseif ($this->cachedColumnSelect === null) { + throw new ProgrammingError('No columns set nor does the query provide any'); } - if (!$seen) { + $cols = $this->cachedColumnSelect; + if (! isset($cols[$active])) { $cols[$active] = str_replace('_', ' ', ucfirst(ltrim($active, '_'))); }