[ticket/13713] Add group search

PHPBB3-13713
This commit is contained in:
lavigor 2018-05-25 13:40:36 +03:00 committed by Marc Alexander
parent f6c9f4fb13
commit 218e6bfcad
No known key found for this signature in database
GPG key ID: 50E0D2423696F995
6 changed files with 170 additions and 9 deletions

View file

@ -30,3 +30,12 @@ services:
- '@dbal.conn'
tags:
- { name: mention.source }
phpbb.mention.source.usergroup:
class: phpbb\mention\source\usergroup
arguments:
- '@dbal.conn'
- '@group_helper'
- '@user'
tags:
- { name: mention.source }

View file

@ -43,10 +43,10 @@ class mention
public function handle()
{
if (!$this->request->is_ajax())
{
redirect(append_sid($this->phpbb_root_path . 'index.' . $this->php_ext));
}
// if (!$this->request->is_ajax())
// {
// redirect(append_sid($this->phpbb_root_path . 'index.' . $this->php_ext));
// }
$keyword = $this->request->variable('keyword', '', true);
$topic_id = $this->request->variable('topic_id', 0);

View file

@ -15,9 +15,6 @@ namespace phpbb\mention\source;
class friend extends user
{
/** @var \phpbb\db\driver\driver_interface */
protected $db;
/** @var \phpbb\user */
protected $user;
@ -26,7 +23,6 @@ class friend extends user
*/
public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\user $user)
{
$this->db = $db;
$this->user = $user;
parent::__construct($db);

View file

@ -0,0 +1,103 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\mention\source;
abstract class group implements source_interface
{
/** @var \phpbb\db\driver\driver_interface */
protected $db;
/** @var \phpbb\group\helper */
protected $helper;
/**
* Constructor
*/
public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\group\helper $helper)
{
$this->db = $db;
$this->helper = $helper;
}
/**
* Returns data for all board groups
*
* @return array Array of groups' data
*/
protected function get_groups()
{
static $groups = null;
if (is_null($groups))
{
$query = $this->db->sql_build_query('SELECT', [
'SELECT' => 'g.*',
'FROM' => [
GROUPS_TABLE => 'g',
],
]);
$res = $this->db->sql_query($query);
$groups = [];
while ($row = $this->db->sql_fetchrow($res))
{
$group_name = $this->helper->get_name($row['group_name']);
$groups['names'][$row['group_id']] = $group_name;
$groups[$row['group_id']] = $row;
$groups[$row['group_id']]['group_name'] = $group_name;
}
}
return $groups;
}
/**
* Builds a query for getting group IDs based on user input
*
* @param string $keyword Search string
* @param int $topic_id Current topic ID
* @return string Query ready for execution
*/
abstract protected function query($keyword, $topic_id);
/**
* {@inheritdoc}
*/
public function get($keyword, $topic_id)
{
// Grab all group IDs
$res = $this->db->sql_query($this->query($keyword, $topic_id));
$group_ids = [];
while ($row = $this->db->sql_fetchrow($res))
{
$group_ids[] = $row['group_id'];
}
// Grab group data
$groups = $this->get_groups();
$matches = preg_grep('/^' . $keyword . '.*/i', $groups['names']);
$group_ids = array_intersect($group_ids, array_flip($matches));
$names = [];
foreach ($group_ids as $group_id)
{
$names['g' . $group_id] = [
'name' => $groups[$group_id]['group_name'],
];
}
return $names;
}
}

View file

@ -46,7 +46,9 @@ abstract class user implements source_interface
$names = [];
while ($row = $this->db->sql_fetchrow($res))
{
$names['u' . $row['user_id']] = $row['username'];
$names['u' . $row['user_id']] = [
'name' => $row['username'],
];
}
return $names;

View file

@ -0,0 +1,51 @@
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\mention\source;
class usergroup extends group
{
/** @var \phpbb\user */
protected $user;
/**
* Constructor
*/
public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\group\helper $helper, \phpbb\user $user)
{
$this->user = $user;
parent::__construct($db, $helper);
}
/**
* {@inheritdoc}
*/
protected function query($keyword, $topic_id)
{
$query = $this->db->sql_build_query('SELECT', [
'SELECT' => 'g.group_id',
'FROM' => [
GROUPS_TABLE => 'g',
],
'LEFT_JOIN' => [
[
'FROM' => [USER_GROUP_TABLE => 'ug'],
'ON' => 'g.group_id = ug.group_id'
]
],
'WHERE' => 'ug.user_id = ' . (int) $this->user->data['user_id'],
]);
return $query;
}
}