/** * Processes a search request * * @return @e void */ public function searchResults() { /* Search Term */ if (isset($this->request['search_term']) && !is_string($this->request['search_term'])) { $this->registry->getClass('output')->showError('invalid_search_term', 10312564); } $_st = $this->searchController->formatSearchTerm(trim($this->request['search_term'])); $search_term = $_st['search_term']; $removedTerms = $_st['removed']; /* Set up some defaults */ $this->settings['max_search_word'] = $this->settings['max_search_word'] ? $this->settings['max_search_word'] : 300; /* Did we come in off a post request? */ if ($this->request['request_method'] == 'post') { /* Set a no-expires header */ $this->registry->getClass('output')->setCacheExpirationSeconds(30 * 60); } if (is_array($this->request['search_app_filters'])) { array_walk_recursive($this->request['search_app_filters'], create_function('&$item, $key', '$item = IPSText::htmlspecialchars($item);')); } /* App specific */ if (isset($this->request['search_sort_by_' . $this->request['search_app']])) { $this->request['search_sort_by'] = $_POST['search_sort_by_' . $this->request['search_app']] ? htmlspecialchars($_POST['search_sort_by_' . $this->request['search_app']]) : $this->request['search_sort_by_' . $this->request['search_app']]; $this->request['search_sort_order'] = $_POST['search_sort_order_' . $this->request['search_app']] ? htmlspecialchars($_POST['search_sort_order_' . $this->request['search_app']]) : $this->request['search_sort_order_' . $this->request['search_app']]; } /* Populate the registry */ IPSSearchRegistry::set('in.search_app', $this->request['search_app']); IPSSearchRegistry::set('in.raw_search_term', trim($this->request['search_term'])); IPSSearchRegistry::set('in.clean_search_term', $search_term); IPSSearchRegistry::set('in.raw_search_tags', str_replace('&', '&', trim(IPSText::parseCleanValue(IPSText::urldecode_furlSafe($_REQUEST['search_tags']))))); IPSSearchRegistry::set('in.search_higlight', str_replace('.', '', $this->request['search_term'])); IPSSearchRegistry::set('in.search_date_end', ($this->request['search_date_start'] && $this->request['search_date_end'] and !is_array($this->request['search_date_end'])) ? $this->request['search_date_end'] : 'now'); IPSSearchRegistry::set('in.search_date_start', ($this->request['search_date_start'] and !is_array($this->request['search_date_start'])) ? $this->request['search_date_start'] : ''); IPSSearchRegistry::set('in.search_author', !empty($this->request['search_author']) ? $this->request['search_author'] : ''); /* Set sort filters */ $this->_setSortFilters(); /* These can be overridden in the actual engine scripts */ // IPSSearchRegistry::set('set.hardLimit' , 0 ); IPSSearchRegistry::set('set.resultsCutToLimit', false); IPSSearchRegistry::set('set.resultsAsForum', false); /* Are we option to show titles only / search in titles only */ IPSSearchRegistry::set('opt.searchType', (!empty($this->request['search_content']) and in_array($this->request['search_content'], array('both', 'titles', 'content'))) ? $this->request['search_content'] : 'both'); /* Time check */ if (IPSSearchRegistry::get('in.search_date_start') and strtotime(IPSSearchRegistry::get('in.search_date_start')) > time()) { IPSSearchRegistry::set('in.search_date_start', 'now'); } if (IPSSearchRegistry::get('in.search_date_end') and strtotime(IPSSearchRegistry::get('in.search_date_end')) > time()) { IPSSearchRegistry::set('in.search_date_end', 'now'); } /* Do some date checking */ if (IPSSearchRegistry::get('in.search_date_end') and IPSSearchRegistry::get('in.search_date_start') and strtotime(IPSSearchRegistry::get('in.search_date_start')) > strtotime(IPSSearchRegistry::get('in.search_date_end'))) { $this->searchAdvancedForm($this->lang->words['search_invalid_date_range']); return; } /** * Lower limit */ if ($this->settings['min_search_word'] && !IPSSearchRegistry::get('in.search_author') && !IPSSearchRegistry::get('in.raw_search_tags')) { if ($this->settings['search_method'] == 'sphinx' && substr_count($search_term, '"') >= 2) { $_ok = true; } else { $_words = explode(' ', preg_replace("#\"(.*?)\"#", '', $search_term)); $_ok = $search_term ? true : false; foreach ($_words as $_word) { $_word = preg_replace('#^\\+(.+?)$#', "\\1", $_word); if (!$_word or $_word == '|') { continue; } if (strlen($_word) < $this->settings['min_search_word']) { $_ok = false; break; } } } if (!$_ok) { $this->searchAdvancedForm(sprintf($this->lang->words['search_term_short'], $this->settings['min_search_word']), $removedTerms); return; } } /** * Ok this is an upper limit. * If you needed to change this, you could do so via conf_global.php by adding: * $INFO['max_search_word'] = #####; */ if ($this->settings['max_search_word'] && strlen(IPSSearchRegistry::get('in.raw_search_term')) > $this->settings['max_search_word']) { $this->searchAdvancedForm(sprintf($this->lang->words['search_term_long'], $this->settings['max_search_word'])); return; } /* Search Flood Check */ if ($this->memberData['g_search_flood']) { /* Check for a cookie */ $last_search = IPSCookie::get('sfc'); $last_term = str_replace(""", '"', IPSCookie::get('sfct')); $last_term = str_replace("&", '&', $last_term); /* If we have a last search time, check it */ if ($last_search && $last_term) { if (time() - $last_search <= $this->memberData['g_search_flood'] && $last_term != IPSSearchRegistry::get('in.raw_search_term')) { $this->searchAdvancedForm(sprintf($this->lang->words['xml_flood'], $this->memberData['g_search_flood'] - (time() - $last_search))); return; } else { /* Reset the cookie */ IPSCookie::set('sfc', time()); IPSCookie::set('sfct', urlencode(IPSSearchRegistry::get('in.raw_search_term'))); } } else { IPSCookie::set('sfc', time()); IPSCookie::set('sfct', urlencode(IPSSearchRegistry::get('in.raw_search_term'))); } } /* Clean search term for results view */ $_search_term = trim(preg_replace('#(^|\\s)(\\+|\\-|\\||\\~)#', " ", $search_term)); /* Got tag search only but app doesn't support tags */ if (IPSSearchRegistry::get('in.raw_search_tags') && !IPSSearchRegistry::get('config.can_searchTags') && !IPSSearchRegistry::get('in.raw_search_term')) { $count = 0; $results = array(); } else { if (IPSLib::appIsSearchable(IPSSearchRegistry::get('in.search_app'), 'search')) { /* Perform the search */ $this->searchController->search(); /* Get count */ $count = $this->searchController->getResultCount(); /* Get results which will be array of IDs */ $results = $this->searchController->getResultSet(); /* Get templates to use */ $template = $this->searchController->fetchTemplates(); /* Fetch sort details */ $sortDropDown = $this->searchController->fetchSortDropDown(); /* Set default sort option */ $_a = IPSSearchRegistry::get('in.search_app'); $_k = IPSSearchRegistry::get($_a . '.searchInKey') ? IPSSearchRegistry::get($_a . '.searchInKey') : ''; if ($_k and !$this->request['search_app_filters'][$_a][$_k]['sortKey'] and is_array($sortDropDown) and count($sortDropDown)) { $this->request['search_app_filters'][$_a][$_k]['sortKey'] = key($sortDropDown); } else { if (!$_k and !$this->request['search_app_filters'][$_a]['sortKey'] and is_array($sortDropDown) and count($sortDropDown)) { $this->request['search_app_filters'][$_a]['sortKey'] = key($sortDropDown); } } /* Fetch sort details */ $sortIn = $this->searchController->fetchSortIn(); /* Build pagination */ $links = $this->registry->output->generatePagination(array('totalItems' => $count, 'itemsPerPage' => IPSSearchRegistry::get('opt.search_per_page'), 'currentStartValue' => IPSSearchRegistry::get('in.start'), 'baseUrl' => $this->_buildURLString() . '&search_app=' . IPSSearchRegistry::get('in.search_app'))); /* Showing */ $showing = array('start' => IPSSearchRegistry::get('in.start') + 1, 'end' => IPSSearchRegistry::get('in.start') + IPSSearchRegistry::get('opt.search_per_page') > $count ? $count : IPSSearchRegistry::get('in.start') + IPSSearchRegistry::get('opt.search_per_page')); /* Parse result set */ $results = $this->registry->output->getTemplate($template['group'])->{$template}['template']($results, IPSSearchRegistry::get('opt.searchType') == 'titles' || IPSSearchRegistry::get('opt.noPostPreview') ? 1 : 0); /* Check for sortIn */ if (count($sortIn) && !$this->request['search_app_filters'][$this->request['search_app']]['searchInKey']) { $this->request['search_app_filters'][$this->request['search_app']]['searchInKey'] = $sortIn[0][0]; } } else { $count = 0; $results = array(); } } if ($count < 1) { $this->registry->output->setHeaderCode(404); } /* Output */ $this->title = $this->lang->words['search_results']; $this->output .= $this->registry->output->getTemplate('search')->searchResultsWrapper($results, $sortDropDown, $sortIn, $links, $count, $showing, $_search_term, $this->_buildURLString(), $this->request['search_app'], $removedTerms, IPSSearchRegistry::get('set.hardLimit'), IPSSearchRegistry::get('set.resultsCutToLimit'), IPSSearchRegistry::get('in.raw_search_tags')); }