/** * Performs a search. * * @return XenForo_ControllerResponse_Abstract */ public function actionSearch() { // note: intentionally not post-only if (!XenForo_Visitor::getInstance()->canSearch()) { throw $this->getNoPermissionResponseException(); } $input = $this->_input->filter(array('keywords' => XenForo_Input::STRING, 'title_only' => XenForo_Input::UINT, 'date' => XenForo_Input::DATE_TIME, 'users' => XenForo_Input::STRING, 'nodes' => array(XenForo_Input::UINT, 'array' => true), 'child_nodes' => XenForo_Input::UINT, 'user_content' => XenForo_Input::STRING, 'order' => XenForo_Input::STRING, 'group_discussion' => XenForo_Input::UINT)); $input['type'] = $this->_handleInputType($input); if (!$input['order']) { $input['order'] = 'date'; } $origKeywords = $input['keywords']; $input['keywords'] = XenForo_Helper_String::stripCensoredText($input['keywords']); // don't allow searching of censored stuff $visitorUserId = XenForo_Visitor::getUserId(); $searchModel = $this->_getSearchModel(); $constraints = $searchModel->getGeneralConstraintsFromInput($input, $errors); if ($errors) { return $this->responseError($errors); } if (!$input['type'] && $input['keywords'] === '' && count($constraints) == 1 && !empty($constraints['user']) && count($constraints['user']) == 1) { // we're searching for messages by a single user $this->_request->setParam('user_id', reset($constraints['user'])); return $this->responseReroute(__CLASS__, 'member'); } if ($input['keywords'] === '' && empty($constraints['user'])) { // must have keyword or user constraint return $this->responseError(new XenForo_Phrase('please_specify_search_query_or_name_of_member')); } $typeHandler = null; if ($input['type']) { if (is_array($input['type'])) { $typeInfo = $input['type']; list($input['type'], $contentInfo) = each($input['type']); list($contentType, $contentId) = each($contentInfo); } $typeHandler = $searchModel->getSearchDataHandler($input['type']); if ($typeHandler) { $constraints = array_merge($constraints, $typeHandler->getTypeConstraintsFromInput($this->_input)); } else { $input['type'] = ''; } } if ($searchModel->allowUserUseCachedSearch()) { $search = $searchModel->getExistingSearch($input['type'], $input['keywords'], $constraints, $input['order'], $input['group_discussion'], $visitorUserId); } else { $search = false; } if (!$search) { $searcher = new XenForo_Search_Searcher($searchModel); if ($typeHandler) { $results = $searcher->searchType($typeHandler, $input['keywords'], $constraints, $input['order'], $input['group_discussion']); $userResults = array(); } else { $results = $searcher->searchGeneral($input['keywords'], $constraints, $input['order']); if ($this->_getUserModel()->canViewMemberList()) { $userResults = $this->_getUserSearch($input['keywords']); } else { $userResults = array(); } } if (!$results && !$userResults) { return $this->getNoSearchResultsResponse($searcher); } $warnings = $searcher->getErrors() + $searcher->getWarnings(); $search = $searchModel->insertSearch($results, $input['type'], $origKeywords, $constraints, $input['order'], $input['group_discussion'], $userResults, $warnings, $visitorUserId); } return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, XenForo_Link::buildPublicLink('search', $search), ''); }