ActionSearch

Package actions
Inheritance class ActionSearch » Action » LsObject
Since 1.0
Source Code /classes/actions/ActionSearch.class.php
Экшен обработки поиска по сайту через поисковый движок Sphinx

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
aParams array Список параметров из URL Action
aParamsEventMatch array Список совпадений по регулярному выражению для евента Action
aRegisterEvent array Список зарегистрированных евентов Action
aSphinxRes null|array Массив результата от Сфинкса ActionSearch
bIsResults bool Поиск вернул результат или нет ActionSearch
oEngine Engine|null Объект ядра Action
sActionTemplate string|null Шаблон экшена Action
sCurrentAction null|string Текущий экшен Action
sCurrentEvent string|null Текущий евент Action
sCurrentEventName string|null Имя текущий евента Action
sDefaultEvent string|null Дефолтный евент Action
sTypesEnabled array Допустимые типы поиска с параметрами ActionSearch

Public Methods

Hide inherited methods

MethodDescriptionDefined By
EventComments() Поиск комментариев ActionSearch
EventIndex() Отображение формы поиска ActionSearch
EventOpenSearch() Обработка стандарта для браузеров Open Search ActionSearch
EventShutdown() Выполняется при завершение экшена, после вызова основного евента Action
EventTopics() Поиск топиков ActionSearch
ExecEvent() Запускает евент на выполнение Action
GetActionClass() Получить каталог с шаблонами экшена(совпадает с именем класса) Action
GetCurrentEventName() Возвращает имя евента Action
GetDefaultEvent() Получает евент по умолчанию Action
GetParam() Получает параметр из URL по его номеру, если его нет то null Action
GetParams() Получает список параметров из УРЛ Action
GetTemplate() Получить шаблон Action
Init() Инициализация ActionSearch
SetDefaultEvent() Устанавливает евент по умолчанию Action
SetParam() Установить значение параметра(эмуляция параметра в URL). Action
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Action
__construct() Конструктор Action

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
AddEvent() Добавляет евент в экшен Action
AddEventPreg() Добавляет евент в экшен, используя регулярное вырожение для евента и параметров Action
EventNotFound() Вызывается в том случаи если не найден евент который запросили через URL Action
GetEventMatch() Возвращает элементы совпадения по регулярному выражению для евента Action
GetParamEventMatch() Возвращает элементы совпадения по регулярному выражению для параметров евента Action
PrepareResults() Поиск и формирование результата ActionSearch
RegisterEvent() Регистрация евентов ActionSearch
SetTemplate() Устанавливает какой шаблон выводить Action
SetTemplateAction() Устанавливает какой шаблон выводить Action

Property Details

aSphinxRes property
protected null|array $aSphinxRes;

Массив результата от Сфинкса

bIsResults property
protected bool $bIsResults;

Поиск вернул результат или нет

sTypesEnabled property
protected array $sTypesEnabled;

Допустимые типы поиска с параметрами

Method Details

EventComments() method
public void EventComments()
Source Code: /classes/actions/ActionSearch.class.php#125 (show)
function EventComments(){
    
/**
     * Ищем
     */
    
$aReq $this->PrepareRequest();
    
$aRes $this->PrepareResults($aReqConfig::Get('module.comment.per_page'));
    if(
FALSE === $aRes) {
        
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
        return 
Router::Action('error');
    }
    
/**
     * Если поиск дал результаты
     */
    
if($this->bIsResults){
        
/**
         *  Получаем топик-объекты по списку идентификаторов
         */
        
$aComments $this->Comment_GetCommentsAdditionalData(array_keys($this->aSphinxRes['matches']));
        
/**
         * Конфигурируем парсер jevix
         */
        
$this->Text_LoadJevixConfig('search');
        
/**
         * Делаем сниппеты
         */
        
foreach($aComments AS $oComment){
            
$oComment->setText($this->Text_JevixParser($this->Sphinx_GetSnippet(
                                                           
htmlspecialchars($oComment->getText()),
                                                           
'comments',
                                                           
$aReq['q'],
                                                           
'<span class="searched-item">',
                                                           
'</span>'
                                                       
)));
        }
        
/**
         *  Отправляем данные в шаблон
         */
        
$this->Viewer_Assign('aRes'$aRes);
        
$this->Viewer_Assign('aComments'$aComments);
    }
}

Поиск комментариев

EventIndex() method
public void EventIndex()
Source Code: /classes/actions/ActionSearch.class.php#63 (show)
function EventIndex(){
}

Отображение формы поиска

EventOpenSearch() method
public void EventOpenSearch()
Source Code: /classes/actions/ActionSearch.class.php#68 (show)
function EventOpenSearch(){
    
Router::SetIsShowStats(false);
    
$this->Viewer_Assign('sAdminMail'Config::Get('sys.mail.from_email'));
}

Обработка стандарта для браузеров Open Search

EventTopics() method
public void EventTopics()
Source Code: /classes/actions/ActionSearch.class.php#76 (show)
function EventTopics(){
    
/**
     * Ищем
     */
    
$aReq $this->PrepareRequest();
    
$aRes $this->PrepareResults($aReqConfig::Get('module.topic.per_page'));
    if(
FALSE === $aRes) {
        
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
        return 
Router::Action('error');
    }
    
/**
     * Если поиск дал результаты
     */
    
if($this->bIsResults){
        
/**
         * Получаем топик-объекты по списку идентификаторов
         */
        
$aTopics $this->Topic_GetTopicsAdditionalData(array_keys($this->aSphinxRes['matches']));
        
/**
         * Конфигурируем парсер jevix
         */
        
$this->Text_LoadJevixConfig('search');
        
/**
         *  Делаем сниппеты
         */
        
foreach($aTopics AS $oTopic){
            
/**
             * Т.к. текст в сниппетах небольшой, то можно прогнать через парсер
             */
            
$oTopic->setTextShort($this->Text_JevixParser($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);
    }
}

Поиск топиков

Init() method
public void Init()
Source Code: /classes/actions/ActionSearch.class.php#47 (show)
public function Init() {
    
$this->SetDefaultEvent('index');
    
$this->Viewer_AddHtmlTitle($this->Lang_Get('search'));
}

Инициализация

PrepareResults() method
protected array|bool PrepareResults(array $aReq, int $iLimit)
$aReq array
$iLimit int
{return} array|bool
Source Code: /classes/actions/ActionSearch.class.php#199 (show)
protected 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])
                
Router::Location(Router::GetPath('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,
            
Config::Get('pagination.pages.count'),
            
Router::GetPath('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;
}

Поиск и формирование результата

RegisterEvent() method
protected void RegisterEvent()
Source Code: /classes/actions/ActionSearch.class.php#54 (show)
protected function RegisterEvent() {
    
$this->AddEvent('index','EventIndex');
    
$this->AddEvent('topics','EventTopics');
    
$this->AddEvent('comments','EventComments');
    
$this->AddEvent('opensearch','EventOpenSearch');
}

Регистрация евентов