+ Filter action search results by forums

This commit is contained in:
Visman 2018-10-30 19:06:39 +07:00
parent 81bd6ea514
commit 2345182df6
5 changed files with 42 additions and 20 deletions

View file

@ -74,7 +74,7 @@ class Routing
$r->add('GET', '/search/advanced[/{keywords}/{author}/{forums}/{serch_in:\d}/{sort_by:\d}/{sort_dir:\d}/{show_as:\d}[/{page:[1-9]\d*}]]', 'Search:viewAdvanced', 'SearchAdvanced');
$r->add('POST', '/search/advanced', 'Search:viewAdvanced');
$r->add('GET', '/search[/user/{uid:[2-9]|[1-9]\d+}]/{action:(?!search)\w+}[/{page:[1-9]\d*}]', 'Search:action', 'SearchAction');
$r->add('GET', '/search[/user/{uid:[2-9]|[1-9]\d+}]/{action:(?!search)[a-z_]+}[/in_forum/{forum:[1-9]\d*}][/{page:[1-9]\d*}]', 'Search:action', 'SearchAction');
}
// юзеры
if ($user->viewUsers) {

View file

@ -421,6 +421,12 @@ class Search extends Page
{
$this->c->Lang->load('search');
$forum = isset($args['forum']) ? (int) $args['forum'] : 0;
$forum = $this->c->forums->get($forum);
if (! $forum instanceof Forum) {
return $this->c->Message->message('Bad request');
}
$model = $this->c->search;
$model->page = isset($args['page']) ? (int) $args['page'] : 1;
$action = $args['action'];
@ -435,9 +441,9 @@ class Search extends Page
switch ($action) {
case 'search':
if (1 === $model->showAs) {
$list = $model->actionT($action);
$list = $model->actionT($action, $forum);
} else {
$list = $model->actionP($action);
$list = $model->actionP($action, $forum);
$asTopicsList = false;
}
if ('*' === $args['author']) {
@ -458,10 +464,14 @@ class Search extends Page
break;
}
$uid = $this->user->id;
$list = $model->actionT($action, $uid);
$list = $model->actionT($action, $forum, $uid);
$model->name = \ForkBB\__('Quick search ' . $action);
$model->linkMarker = 'SearchAction';
$model->linkArgs = ['action' => $action];
if ($forum->id) {
$model->linkArgs = ['action' => $action, 'forum' => $forum->id];
} else {
$model->linkArgs = ['action' => $action];
}
$this->fSubIndex = $subIndex[$action];
break;
case 'posts':
@ -475,13 +485,17 @@ class Search extends Page
break;
}
if ($asTopicsList) {
$list = $model->actionT($action, $user->id);
$list = $model->actionT($action, $forum, $user->id);
} else {
$list = $model->actionP($action, $user->id);
$list = $model->actionP($action, $forum, $user->id);
}
$model->name = \ForkBB\__('Quick search user ' . $action, $user->username);
$model->linkMarker = 'SearchAction';
$model->linkArgs = ['action' => $action, 'uid' => $user->id];
if ($forum->id) {
$model->linkArgs = ['action' => $action, 'uid' => $user->id, 'forum' => $forum->id];
} else {
$model->linkArgs = ['action' => $action, 'uid' => $user->id];
}
break;
# default:
@ -492,7 +506,7 @@ class Search extends Page
return $this->c->Message->message('Bad request');
} elseif (empty($list)) {
$this->fIswev = ['i', \ForkBB\__('No hits')];
return $this->view(['advanced' => 'advanced'], 'GET');
return $this->view([], 'GET', true);
}
if ($asTopicsList) {

View file

@ -14,17 +14,21 @@ class ActionP extends Method
* Поисковые действия по сообщениям
*
* @param string $action
* @param Forum $root
* @param int $uid
*
* @throws InvalidArgumentException
*
* @return false|array
*/
public function actionP($action, $uid = null)
public function actionP($action, Forum $root, $uid = null)
{
$root = $this->c->forums->get(0);
if (! $root instanceof Forum || empty($root->descendants)) {
return []; //????
$forums = \array_keys($root->descendants);
if ($root->id) {
$forums[] = $root->id;
}
if (empty($forums)) {
return [];
}
$sql = null;
@ -58,7 +62,7 @@ class ActionP extends Method
if (null !== $sql) {
$vars = [
':forums' => array_keys($root->descendants),
':forums' => $forums,
':uid' => $uid,
];
$list = $this->c->DB->query($sql, $vars)->fetchAll(PDO::FETCH_COLUMN);

View file

@ -14,17 +14,21 @@ class ActionT extends Method
* Поисковые действия по темам
*
* @param string $action
* @param Forum $root
* @param int $uid
*
* @throws InvalidArgumentException
*
* @return false|array
*/
public function actionT($action, $uid = null)
public function actionT($action, Forum $root, $uid = null)
{
$root = $this->c->forums->get(0);
if (! $root instanceof Forum || empty($root->descendants)) {
return []; //????
$forums = \array_keys($root->descendants);
if ($root->id) {
$forums[] = $root->id;
}
if (empty($forums)) {
return [];
}
$sql = null;
@ -65,7 +69,7 @@ class ActionT extends Method
if (null !== $sql) {
$vars = [
':forums' => \array_keys($root->descendants),
':forums' => $forums,
':uid' => $uid,
];
$list = $this->c->DB->query($sql, $vars)->fetchAll(PDO::FETCH_COLUMN);

View file

@ -119,7 +119,7 @@ class Model extends DataModel
}
/**
* Статус наличия не прочитанных сообщений в теме
* Статус наличия непрочитанных сообщений в теме
*
* @return false|int
*/