/** * Do a boolean search * * @param array &$filters filter array * @param string $search term * * @return void */ private function doBooleanSearch(&$filters, $search) { $input = $this->app->input; $mode = $input->get('search-mode-advanced', 'and'); if (trim($search) == '') { return; } $this->testBooleanSearchLength($search); $search = explode(' ', $search); switch ($mode) { case 'all': $operator = '+'; break; case 'none': $operator = '-'; break; default: case 'exact': case 'any': $operator = ''; break; } foreach ($search as &$s) { $s = $operator . $s . '*'; } $search = implode(' ', $search); if ($mode == 'exact') { $search = '"' . $search . '"'; } if ($mode == 'none') { /** * Have to do it like this as the -operator removes records matched from * previous +operators (so if you just have -operator) * no records are returned */ $search = '+(a* b* c* d* e* f* g* h* i* j* k* l* m* n* o* p* q* r* s* t* u* v* w* x* y* z*) ' . $search; } $input->set('override_join_val_column_concat', 1); $names = $this->listModel->getSearchAllFields(); if (empty($names)) { return; } $input->set('override_join_val_column_concat', 0); $names = implode(", ", $names); $filters['value'][9999] = $search; $filters['condition'][9999] = 'AGAINST'; $filters['join'][9999] = 'AND'; $filters['no-filter-setup'][9999] = 0; $filters['hidden'][9999] = 0; $filters['key'][9999] = "MATCH(" . $names . ")"; $filters['key2'][9999] = "MATCH(" . $names . ")"; $filters['search_type'][9999] = 'searchall'; $filters['match'][9999] = 1; $filters['full_words_only'][9999] = 0; $filters['eval'][9999] = 0; $filters['required'][9999] = 0; $filters['access'][9999] = 0; $filters['grouped_to_previous'][9999] = 1; $filters['label'][9999] = ''; $filters['elementid'][9999] = -1; $filters['raw'][9999] = false; }