ActionSearch
Package | actions |
---|---|
Inheritance | class ActionSearch » Action » LsObject |
Since | 1.0 |
Source Code | /classes/actions/ActionSearch.class.php |
Экшен обработки поиска по сайту через поисковый движок Sphinx
Protected Properties
Property | Type | Description | Defined 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
Method | Description | Defined 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
Method | Description | Defined 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($aReq, Config::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($aReq, Config::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');
}
Регистрация евентов