diff --git a/bootstrap.php b/bootstrap.php index 4b64227a839c1e9cd864db6cc74a1930e9906f98..056c5f01dcd4098d7f8649be2211249a7b9f20f8 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -293,6 +293,10 @@ class Bootstrap { } if (extension_loaded('iconv')) iconv_set_encoding('internal_encoding', 'UTF-8'); + + function mb_str_wc($str) { + return count(preg_split('~[^\p{L}\p{N}\'].+~u', trim($str))); + } } function croak($message) { diff --git a/include/class.queue.php b/include/class.queue.php index 5e9f3dcbf58b778bed1fb2c856f307c8d7390ec3..812f9da30f562f27f2ba2a0a26e2fa2b02e22853 100644 --- a/include/class.queue.php +++ b/include/class.queue.php @@ -174,10 +174,7 @@ class CustomQueue extends VerySimpleModel { */ function getForm($source=null, $searchable=null) { $fields = array(); - $validator = false; if (!isset($searchable)) { - $searchable = $this->getCurrentSearchFields($source); - $validator = true; $fields = array( ':keywords' => new TextboxField(array( 'id' => 3001, @@ -188,11 +185,17 @@ class CustomQueue extends VerySimpleModel { 'classes' => 'full-width headline', 'placeholder' => __('Keywords — Optional'), ), + 'validators' => function($self, $v) { + if (mb_str_wc($v) > 3) + $self->addError(__('Search term cannot have more than 3 keywords')); + }, )), ); + + $searchable = $this->getCurrentSearchFields($source); } - foreach ($searchable as $path=>$field) + foreach ($searchable ?: array() as $path => $field) $fields = array_merge($fields, static::getSearchField($field, $path)); $form = new AdvancedSearchForm($fields, $source); diff --git a/include/class.search.php b/include/class.search.php index 469c3f5e09d164074d0601f20fe85ebfdce70574..f76aacf162a68c01fc21dbd297b8739ab7b7e2a4 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -707,12 +707,9 @@ class SavedQueue extends CustomQueue { * */ function getForm($source=null, $searchable=array()) { - global $thisstaff; - - if (!$this->isAQueue()) - $searchable = $this->getCurrentSearchFields($source, - parent::getCriteria()); - else // Only allow supplemental matches. + $searchable = null; + if ($this->isAQueue()) + // Only allow supplemental matches. $searchable = array_intersect_key($this->getCurrentSearchFields($source), $this->getSupplementalMatches()); diff --git a/scp/tickets.php b/scp/tickets.php index d100f38d7b1af8e1505301922754e5925bc264dc..41ba485384d455527ff8dedeaff05d42c9406a78 100644 --- a/scp/tickets.php +++ b/scp/tickets.php @@ -79,16 +79,20 @@ if (!$ticket) { elseif (isset($_GET['a']) && $_GET['a'] === 'search' && ($_GET['query']) ) { - $key = substr(md5($_GET['query']), -10); - if ($_GET['search-type'] == 'typeahead') { - // Use a faster index - $criteria = ['user__emails__address', 'equal', $_GET['query']]; - } - else { - $criteria = [':keywords', null, $_GET['query']]; + $wc = mb_str_wc($_GET['query']); + if ($wc < 4) { + $key = substr(md5($_GET['query']), -10); + if ($_GET['search-type'] == 'typeahead') { + // Use a faster index + $criteria = ['user__emails__address', 'equal', $_GET['query']]; + } else { + $criteria = [':keywords', null, $_GET['query']]; + } + $_SESSION['advsearch'][$key] = [$criteria]; + $queue_id = "adhoc,{$key}"; + } else { + $errors['err'] = __('Search term cannot have more than 3 keywords'); } - $_SESSION['advsearch'][$key] = [$criteria]; - $queue_id = "adhoc,{$key}"; } $queue_key = sprintf('::Q:%s', ObjectModel::OBJECT_TYPE_TICKET);