diff --git a/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php b/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php index 49f51eb8..a1410cde 100644 --- a/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php +++ b/library/Icingadb/Web/Control/SearchBar/ObjectSuggestions.php @@ -15,6 +15,7 @@ use ipl\Orm\Resolver; use ipl\Sql\Cursor; use ipl\Sql\Expression; use ipl\Sql\Select; +use ipl\Stdlib\Filter as StdlibFilter; use ipl\Web\Control\SearchBar\Suggestions; use PDO; @@ -77,11 +78,11 @@ class ObjectSuggestions extends Suggestions { $model = $this->getModel(); - $quickFilter = Filter::matchAny(); + $quickFilter = StdlibFilter::any(); foreach ($model->getSearchColumns() as $column) { - $where = Filter::where($model->getTableName() . '.' . $column, $searchTerm); - $where->metaData['label'] = $model->getMetaData()[$column]; - $quickFilter->addFilter($where); + $where = StdlibFilter::equal($model->getTableName() . '.' . $column, $searchTerm); + $where->columnLabel = $model->getMetaData()[$column]; + $quickFilter->add($where); } return $quickFilter; diff --git a/library/Icingadb/Web/Controller.php b/library/Icingadb/Web/Controller.php index 7205c32d..1fda2d5b 100644 --- a/library/Icingadb/Web/Controller.php +++ b/library/Icingadb/Web/Controller.php @@ -20,11 +20,14 @@ use ipl\Orm\Common\SortUtil; use ipl\Orm\Compat\FilterProcessor; use ipl\Orm\Query; use ipl\Stdlib\Contract\Paginatable; +use ipl\Stdlib\Filter\Condition; +use ipl\Stdlib\Filter\Rule; use ipl\Web\Compat\CompatController; use ipl\Web\Control\LimitControl; use ipl\Web\Control\PaginationControl; use ipl\Web\Control\SearchBar; use ipl\Web\Control\SortControl; +use ipl\Web\Filter\QueryString; use ipl\Web\Url; class Controller extends CompatController @@ -127,16 +130,34 @@ class Controller extends CompatController * * @return SearchBar */ - public function createSearchBar(array $preserveParams = null) + public function createSearchBar(Query $query, array $preserveParams = null) { $requestUrl = Url::fromRequest(); if ($preserveParams !== null) { $requestUrl = $requestUrl->onlyWith($preserveParams); } + $filter = QueryString::fromString($this->getFilter()->toQueryString()) + ->on(QueryString::ON_CONDITION, function (Condition $condition) use ($query) { + $path = $condition->getColumn(); + if (strpos($path, '.vars.') !== false) { + list($target, $varName) = explode('.vars.', $path); + if (strpos($target, '.') === false) { + // Programmatically translated since the full definition is available in class ObjectSuggestions + $condition->columnLabel = sprintf(t(ucfirst($target) . ' %s', '..'), $varName); + } + } else { + $metaData = $query->getResolver()->getMetaData($query->getModel()); + if (isset($metaData[$path])) { + $condition->columnLabel = $metaData[$path]; + } + } + }) + ->parse(); + $searchBar = new SearchBar(); $searchBar->setSubmitLabel(t('Search')); - $searchBar->setFilter($this->getFilter()); + $searchBar->setFilter($filter); $searchBar->setAction($requestUrl->getAbsoluteUrl()); $searchBar->setIdProtector([$this->getRequest(), 'protectId']); @@ -149,7 +170,7 @@ class Controller extends CompatController $searchBar->on(SearchBar::ON_SENT, function (SearchBar $form) use ($requestUrl) { $existingParams = $requestUrl->getParams(); - $requestUrl->setQueryString($form->getFilter()->toQueryString()); + $requestUrl->setQueryString(QueryString::render($form->getFilter())); foreach ($existingParams->toArray(false) as $name => $value) { if (is_int($name)) { $name = $value; @@ -320,12 +341,12 @@ class Controller extends CompatController return parent::addContent($content); } - public function filter(Query $query, Filter $filter = null) + public function filter(Query $query, Rule $filter = null) { $this->applyMonitoringRestriction($query); FilterProcessor::apply( - $filter ?: $this->getFilter(), + $filter ? Filter::fromQueryString(QueryString::render($filter)) : $this->getFilter(), $query );