Example #1
0
 /**
  * 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("&quot;", '"', IPSCookie::get('sfct'));
         $last_term = str_replace("&amp;", '&', $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() . '&amp;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'));
 }