Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
88.89% |
8 / 9 |
CRAP | |
87.06% |
74 / 85 |
| legend | |
0.00% |
0 / 1 |
|
88.89% |
8 / 9 |
27.47 | |
87.06% |
74 / 85 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| get_group_value | |
100.00% |
1 / 1 |
2 | |
100.00% |
9 / 9 |
|||
| get_group_count | |
100.00% |
1 / 1 |
1 | |
100.00% |
6 / 6 |
|||
| add_group | |
100.00% |
1 / 1 |
2 | |
100.00% |
11 / 11 |
|||
| delete_group | |
100.00% |
1 / 1 |
3 | |
100.00% |
17 / 17 |
|||
| move_up | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| move_down | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| move | |
100.00% |
1 / 1 |
9 | |
100.00% |
26 / 26 |
|||
| group_type_language | |
0.00% |
0 / 1 |
42 | |
0.00% |
0 / 11 |
|||
| <?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\groupposition; | |
| /** | |
| * Legend group position class | |
| * | |
| * group_legend is an ascending list 1, 2, ..., n for groups which are displayed. 1 is the first group, n the last. | |
| * If the value is 0 (self::GROUP_DISABLED) the group is not displayed. | |
| */ | |
| class legend implements \phpbb\groupposition\groupposition_interface | |
| { | |
| /** | |
| * Group is not displayed | |
| */ | |
| const GROUP_DISABLED = 0; | |
| /** | |
| * Database object | |
| * @var \phpbb\db\driver\driver_interface | |
| */ | |
| protected $db; | |
| /** | |
| * User object | |
| * @var \phpbb\user | |
| */ | |
| protected $user; | |
| /** | |
| * Constructor | |
| * | |
| * @param \phpbb\db\driver\driver_interface $db Database object | |
| * @param \phpbb\user $user User object | |
| */ | |
| public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\user $user) | |
| { | |
| $this->db = $db; | |
| $this->user = $user; | |
| } | |
| /** | |
| * Returns the group_legend for a given group, if the group exists. | |
| * | |
| * @param int $group_id group_id of the group to be selected | |
| * @return int position of the group | |
| * @throws \phpbb\groupposition\exception | |
| */ | |
| public function get_group_value($group_id) | |
| { | |
| $sql = 'SELECT group_legend | |
| FROM ' . GROUPS_TABLE . ' | |
| WHERE group_id = ' . (int) $group_id; | |
| $result = $this->db->sql_query($sql); | |
| $current_value = $this->db->sql_fetchfield('group_legend'); | |
| $this->db->sql_freeresult($result); | |
| if ($current_value === false) | |
| { | |
| // Group not found. | |
| throw new \phpbb\groupposition\exception('NO_GROUP'); | |
| } | |
| return (int) $current_value; | |
| } | |
| /** | |
| * Get number of groups, displayed on the legend | |
| * | |
| * @return int value of the last item displayed | |
| */ | |
| public function get_group_count() | |
| { | |
| $sql = 'SELECT group_legend | |
| FROM ' . GROUPS_TABLE . ' | |
| ORDER BY group_legend DESC'; | |
| $result = $this->db->sql_query_limit($sql, 1); | |
| $group_count = (int) $this->db->sql_fetchfield('group_legend'); | |
| $this->db->sql_freeresult($result); | |
| return $group_count; | |
| } | |
| /** | |
| * {@inheritDoc} | |
| */ | |
| public function add_group($group_id) | |
| { | |
| $current_value = $this->get_group_value($group_id); | |
| if ($current_value == self::GROUP_DISABLED) | |
| { | |
| // Group is currently not displayed, add it at the end. | |
| $next_value = 1 + $this->get_group_count(); | |
| $sql = 'UPDATE ' . GROUPS_TABLE . ' | |
| SET group_legend = ' . $next_value . ' | |
| WHERE group_legend = ' . self::GROUP_DISABLED . ' | |
| AND group_id = ' . (int) $group_id; | |
| $this->db->sql_query($sql); | |
| return true; | |
| } | |
| return false; | |
| } | |
| /** | |
| * Deletes a group by setting the field to self::GROUP_DISABLED and closing the gap in the list. | |
| * | |
| * @param int $group_id group_id of the group to be deleted | |
| * @param bool $skip_group Skip setting the value for this group, to save the query, when you need to update it anyway. | |
| * @return bool True if the group was deleted successfully | |
| */ | |
| public function delete_group($group_id, $skip_group = false) | |
| { | |
| $current_value = $this->get_group_value($group_id); | |
| if ($current_value != self::GROUP_DISABLED) | |
| { | |
| $this->db->sql_transaction('begin'); | |
| $sql = 'UPDATE ' . GROUPS_TABLE . ' | |
| SET group_legend = group_legend - 1 | |
| WHERE group_legend > ' . $current_value; | |
| $this->db->sql_query($sql); | |
| if (!$skip_group) | |
| { | |
| $sql = 'UPDATE ' . GROUPS_TABLE . ' | |
| SET group_legend = ' . self::GROUP_DISABLED . ' | |
| WHERE group_id = ' . (int) $group_id; | |
| $this->db->sql_query($sql); | |
| } | |
| $this->db->sql_transaction('commit'); | |
| return true; | |
| } | |
| return false; | |
| } | |
| /** | |
| * {@inheritDoc} | |
| */ | |
| public function move_up($group_id) | |
| { | |
| return $this->move($group_id, 1); | |
| } | |
| /** | |
| * {@inheritDoc} | |
| */ | |
| public function move_down($group_id) | |
| { | |
| return $this->move($group_id, -1); | |
| } | |
| /** | |
| * {@inheritDoc} | |
| */ | |
| public function move($group_id, $delta) | |
| { | |
| $delta = (int) $delta; | |
| if (!$delta) | |
| { | |
| return false; | |
| } | |
| $move_up = ($delta > 0) ? true : false; | |
| $current_value = $this->get_group_value($group_id); | |
| if ($current_value != self::GROUP_DISABLED) | |
| { | |
| $this->db->sql_transaction('begin'); | |
| // First we move all groups between our current value and the target value up/down 1, | |
| // so we have a gap for our group to move. | |
| $sql = 'UPDATE ' . GROUPS_TABLE . ' | |
| SET group_legend = group_legend' . (($move_up) ? ' + 1' : ' - 1') . ' | |
| WHERE group_legend > ' . self::GROUP_DISABLED . ' | |
| AND group_legend' . (($move_up) ? ' >= ' : ' <= ') . ($current_value - $delta) . ' | |
| AND group_legend' . (($move_up) ? ' < ' : ' > ') . $current_value; | |
| $this->db->sql_query($sql); | |
| // Because there might be fewer groups above/below the group than we wanted to move, | |
| // we use the number of changed groups, to update the group. | |
| $delta = (int) $this->db->sql_affectedrows(); | |
| if ($delta) | |
| { | |
| // And now finally, when we moved some other groups and built a gap, | |
| // we can move the desired group to it. | |
| $sql = 'UPDATE ' . GROUPS_TABLE . ' | |
| SET group_legend = group_legend ' . (($move_up) ? ' - ' : ' + ') . $delta . ' | |
| WHERE group_id = ' . (int) $group_id; | |
| $this->db->sql_query($sql); | |
| $this->db->sql_transaction('commit'); | |
| return true; | |
| } | |
| $this->db->sql_transaction('commit'); | |
| } | |
| return false; | |
| } | |
| /** | |
| * Get group type language var | |
| * | |
| * @param int $group_type group_type from the groups-table | |
| * @return string name of the language variable for the given group-type. | |
| */ | |
| static public function group_type_language($group_type) | |
| { | |
| switch ($group_type) | |
| { | |
| case GROUP_OPEN: | |
| return 'GROUP_REQUEST'; | |
| case GROUP_CLOSED: | |
| return 'GROUP_CLOSED'; | |
| case GROUP_HIDDEN: | |
| return 'GROUP_HIDDEN'; | |
| case GROUP_SPECIAL: | |
| return 'GROUP_SPECIAL'; | |
| case GROUP_FREE: | |
| return 'GROUP_OPEN'; | |
| } | |
| } | |
| } |