HEX
Server: Apache/2.4.59 (Debian)
System: Linux skycube.cz 4.19.0-25-amd64 #1 SMP Debian 4.19.289-2 (2023-08-08) x86_64
User: ilya (534)
PHP: 7.3.31-1~deb10u7
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: /var/www/ilya/data/www/irk2.ru/classes/actions/ActionSearch.class.php
<?
class ActionSearch extends Action {	
	private $sTypesEnabled = array('topics' => array('topic_publish' => 1), 'comments' => array('comment_delete' => 0));
	private $aSphinxRes = null;
	private $bIsResults = FALSE;
	
	public function Init() {
		$this->SetDefaultEvent('index');
		$this->Viewer_AddHtmlTitle('Поиск');
	}
	
	protected function RegisterEvent() {
		$this->AddEvent('index','EventIndex');
		$this->AddEvent('topics','EventTopics');
		$this->AddEvent('comments','EventComments');
		$this->AddEvent('opensearch','EventOpenSearch');
	}
	
	function EventIndex(){
	}
	
	function EventOpenSearch(){
		Router::SetIsShowStats(false);
		$this->Viewer_Assign('sAdminMail', SYS_MAIL_FROM_EMAIL);
	}
	/**
	 * Поиск топиков
	 *
	 * @return unknown
	 */
	function EventTopics(){
		/**
		 * Ищем
		 */
		$aReq = $this->PrepareRequest();
		$aRes = $this->PrepareResults($aReq, BLOG_TOPIC_PER_PAGE);
		if(FALSE === $aRes) {
			$this->Message_AddErrorSingle('Возникли технические неполадки, пожалуйста повторите позже.','Внутреняя ошибка');
			return Router::Action('error');
		}
		/**
		 * Если поиск дал результаты
		 */
		if($this->bIsResults){
			/**
			 * Получаем топик-объекты по списку идентификаторов
			 */
			$aTopics = $this->Topic_GetTopicsByArrayId(array_keys($this->aSphinxRes['matches']), null, -1);			
			/**
			 *  Делаем сниппеты 
			 */
			foreach($aTopics AS $oTopic){
				$oTopic->setTextShort($this->Sphinx_GetSnippet(
					$oTopic->getText(), 
					'topics', 
					$aReq['q'], 
					'<span class="searched-item">', 
					'</span>'
				));
			}						
			/**
			 *  Отправляем данные в шаблон 
			 */
			$this->Viewer_Assign('bIsResults', TRUE);
			$this->Viewer_Assign('aRes', $aRes);
			$this->Viewer_Assign('aTopics', $aTopics);
		}
	}
	/**
	 * Поиск комментариев
	 *
	 * @return unknown
	 */
	function EventComments(){
		/**
		 * Ищем
		 */
		$aReq = $this->PrepareRequest();
		$aRes = $this->PrepareResults($aReq, BLOG_COMMENT_PER_PAGE);
		if(FALSE === $aRes) {
			$this->Message_AddErrorSingle('Возникли технические неполадки, пожалуйста повторите позже.','Внутреняя ошибка');
			return Router::Action('error');
		}
		/**
		 * Если поиск дал результаты
		 */
		if($this->bIsResults){
			/**
			 *  Получаем топик-объекты по списку идентификаторов
			 */		
			$aComments = $this->Comment_GetCommentsByArrayId(array_keys($this->aSphinxRes['matches']));			
			/** 
			 * Делаем сниппеты 
			 */
			foreach($aComments AS $oComment){
				$oComment->setText($this->Sphinx_GetSnippet(
					$oComment->getText(), 
					'comments', 
					$aReq['q'], 
					'<span class="searched-item">', 
					'</span>'
				));
			}			
			/**
			 *  Отправляем данные в шаблон 
			 */
			$this->Viewer_Assign('aRes', $aRes);
			$this->Viewer_Assign('aComments', $aComments);
		}
	}
	/**
	 * Подготовка запроса на поиск
	 *
	 * @return unknown
	 */
	private function PrepareRequest(){
		$aReq['q'] = getRequest('q');
		if (!func_check($aReq['q'],'text', 2, 255)) {
			/**
			 *  Если запрос слишком короткий перенаправляем на начальную страницу поиска
			 * Хотя тут лучше показывать юзеру в чем он виноват
			 */
			func_header_location(DIR_WEB_ROOT.'/search/');
		}
		$aReq['sType'] = Router::GetActionEvent();		
		/**
		 * Определяем текущую страницу вывода результата
		 */
		$aReq['iPage'] = intval(preg_replace('#^page(\d+)$#', '\1', $this->getParam(0)));
		if(!$aReq['iPage']) { $aReq['iPage'] = 1; }		
		/**
		 *  Передача данных в шаблонизатор 
		 */
		$this->Viewer_Assign('aReq', $aReq);		
		return $aReq;
	}
	/**
	 * Поиск и формирование результата
	 *
	 * @param unknown_type $aReq
	 * @param unknown_type $iLimit
	 * @return unknown
	 */
	private function PrepareResults($aReq, $iLimit){
		/**
		 *  Количество результатов по типам
		 */
		foreach($this->sTypesEnabled as $sType => $aExtra){
			$aRes['aCounts'][$sType] = intval($this->Sphinx_GetNumResultsByType($aReq['q'], $sType, $aExtra));
		}		
		if($aRes['aCounts'][$aReq['sType']] == 0){ 
			/**
			 *  Объектов необходимого типа не найдено 
			 */
			unset($this->sTypesEnabled[$aReq['sType']]);
			/**
			 * Проверяем отсальные типы
			 */
			foreach(array_keys($this->sTypesEnabled) as $sType){
				if($aRes['aCounts'][$sType])
					func_header_location(DIR_WEB_ROOT.'/search/'.$sType.'/?q='.$aReq['q']);
			}
		} elseif(($aReq['iPage']-1)*$iLimit <= $aRes['aCounts'][$aReq['sType']]) {
			/**
			 * Ищем
			 */
			$this->aSphinxRes = $this->Sphinx_FindContent(
				$aReq['q'], 
				$aReq['sType'], 
				($aReq['iPage']-1)*$iLimit, 
				$iLimit, 
				$this->sTypesEnabled[$aReq['sType']]
			);
			/**
			 * Возможно демон Сфинкса не доступен
			 */
			if (FALSE === $this->aSphinxRes) {
				return FALSE;
			}
			
			$this->bIsResults = TRUE;
			/**
			 * Формируем постраничный вывод
			 */
			$aPaging = $this->Viewer_MakePaging(
				$aRes['aCounts'][$aReq['sType']], 
				$aReq['iPage'], 
				$iLimit, 
				4, 
				DIR_WEB_ROOT.'/search/'.$aReq['sType'], 
				array(
					'q' => $aReq['q']
				)
			);
			$this->Viewer_Assign('aPaging', $aPaging);
		}
		
		$this->SetTemplateAction('results');
		$this->Viewer_AddHtmlTitle($aReq['q']);
		$this->Viewer_Assign('bIsResults', $this->bIsResults);
		return $aRes;
	}
}
?>