forum_map::parse_forums()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 5
c 1
b 0
f 0
nc 3
nop 0
dl 0
loc 10
rs 10
1
<?php
2
/**
3
 *
4
 * phpBB Forum Mapper. A helper class for the phpBB Forum Software package.
5
 *
6
 * @author Dark❶, https://dark1.tech
7
 * @version 1.0.3
8
 * @source https://github.com/Dark1z/phpbbForumMap
9
 * @copyright (c) 2020-forever, Dark❶, https://dark1.tech
10
 * @license GNU General Public License, version 2 (GPL-2.0)
11
 *
12
 */
13
14
namespace dark1\reducesearchindex\core;
15
16
/**
17
 * @ignore
18
 */
19
use phpbb\db\driver\driver_interface as db_driver;
20
21
/**
22
 * phpBB Forum Mapper.
23
 */
24
abstract class forum_map
25
{
26
	/** @var string Default Padding Spacer */
27
	const PADDING_SPACER	= '&nbsp; &nbsp; &nbsp;';
28
29
	/** @var string Default Padding Symbol */
30
	const PADDING_SYMBOL	= '&nbsp; &#8627; &nbsp;';
31
32
	/** @var db_driver */
33
	protected $db;
34
35
	/** @var int Latest Right ID*/
36
	private $right;
37
38
	/** @var string Padding */
39
	private $padding;
40
41
	/** @var string Padding Spacer */
42
	private $padding_spacer;
43
44
	/** @var string Padding Symbol */
45
	private $padding_symbol;
46
47
	/** @var array All Forum Data */
48
	private $forums;
49
50
	/** @var array Forum Template Row */
51
	private $forum_tpl_row;
52
53
	/** @var array Store Padding for each Forum */
54
	private $padding_store;
55
56
	/**
57
	 * Constructor.
58
	 *
59
	 * @param db_driver		$db		Database object
60
	 */
61
	public function __construct(db_driver $db)
62
	{
63
		$this->db				= $db;
64
		$this->right			= 0;
65
		$this->padding			= '';
66
		$this->padding_spacer	= '';
67
		$this->padding_symbol	= '';
68
		$this->forums			= [];
69
		$this->forum_tpl_row	= [];
70
		$this->padding_store	= ['0' => ''];
71
	}
72
73
	/**
74
	 * Display the Forum options.
75
	 *
76
	 * @param string	$padding_spacer		Padding Spacer
77
	 * @param string	$padding_symbol		Padding Symbol
78
	 *
79
	 * @return array
80
	 * @access public
81
	 */
82
	public function main($padding_spacer = '', $padding_symbol = '')
83
	{
84
		$this->padding_spacer	= !empty($padding_spacer) ? $padding_spacer : self::PADDING_SPACER;
85
		$this->padding_symbol	= !empty($padding_symbol) ? $padding_symbol : self::PADDING_SYMBOL;
86
87
		$this->get_forums();
88
		$this->parse_forums();
89
90
		return $this->forum_tpl_row;
91
	}
92
93
	/**
94
	 * Get forums.
95
	 *
96
	 * @return void
97
	 * @access private
98
	 */
99
	private function get_forums()
100
	{
101
		$sql_ary = [
102
			'SELECT'	=> 'f.forum_id, f.forum_type, f.forum_name, f.parent_id, f.left_id, f.right_id',
103
			'FROM'		=> [FORUMS_TABLE => 'f'],
104
			'ORDER_BY'	=> 'f.left_id ASC',
105
		];
106
		$result = $this->db->sql_query($this->db->sql_build_query('SELECT', $this->get_forums_cust_sql_ary($sql_ary)));
107
		$forum_rows = $this->db->sql_fetchrowset($result);
108
		$this->db->sql_freeresult($result);
109
		foreach ($forum_rows as $row)
110
		{
111
			$this->forums[] = $row;
112
		}
113
	}
114
115
	/**
116
	 * Parse forums.
117
	 *
118
	 * @return void
119
	 * @access private
120
	 */
121
	private function parse_forums()
122
	{
123
		foreach ($this->forums as $row)
124
		{
125
			$this->get_forum_padding($row['parent_id'], $row['left_id'], $row['right_id']);
126
			$tpl_row = array_merge($this->get_forum_tpl_row($row), $this->get_forum_cust_tpl_row($row));
127
128
			if (!empty($tpl_row))
129
			{
130
				$this->forum_tpl_row[] = $tpl_row;
131
			}
132
		}
133
	}
134
135
	/**
136
	 * Get forum padding.
137
	 *
138
	 * @param int		$parent_id		Forum parent ID
139
	 * @param int		$left_id		Forum left ID
140
	 * @param int		$right_id		Forum right ID
141
	 *
142
	 * @return void
143
	 * @access private
144
	 */
145
	private function get_forum_padding($parent_id, $left_id, $right_id)
146
	{
147
		if ($left_id < $this->right)
148
		{
149
			$this->padding .= $this->padding_spacer;
150
			$this->padding_store[$parent_id] = $this->padding;
151
		}
152
		else if ($left_id > $this->right + 1)
153
		{
154
			$this->padding = (isset($this->padding_store[$parent_id])) ? $this->padding_store[$parent_id] : '';
155
		}
156
		$this->right = $right_id;
157
	}
158
159
	/**
160
	 * Get forum template row.
161
	 *
162
	 * @param array		$row	Forum row
163
	 *
164
	 * @return array
165
	 * @access private
166
	 */
167
	private function get_forum_tpl_row($row)
168
	{
169
		$tpl_row = [];
170
		// Normal forums have configuration setting
171
		if ($row['forum_type'] == FORUM_POST)
172
		{
173
			// The labels for all the inputs are supposed to be constructed based on the forum IDs to make it easy to know which
174
			$tpl_row = [
175
				'S_IS_CAT'		=> false,
176
				'FORUM_PAD'		=> $this->padding . $this->padding_symbol,
177
				'FORUM_NAME'	=> $row['forum_name'],
178
				'FORUM_ID'		=> $row['forum_id'],
179
			];
180
		}
181
		// Category forums are displayed for organizational purposes, but have no configuration setting
182
		else if ($row['forum_type'] == FORUM_CAT)
183
		{
184
			$tpl_row = [
185
				'S_IS_CAT'		=> true,
186
				'FORUM_PAD'		=> $this->padding . $this->padding_symbol,
187
				'FORUM_NAME'	=> $row['forum_name'],
188
			];
189
		}
190
		// Other forum types (Example: links) are ignored
191
		return $tpl_row;
192
	}
193
194
	/**
195
	 * Get forum custom SQL Array.
196
	 *
197
	 * @param array		$sql_ary	Forum SQL Array
198
	 *
199
	 * @return array
200
	 * @access protected
201
	 */
202
	abstract protected function get_forums_cust_sql_ary($sql_ary);
203
	/** @example :
204
	{
205
		// For one forum table column
206
		$sql_ary['SELECT'] .= ', f.vendor_ext_enable';
207
		// OR
208
		// For two or more forum table columns
209
		$sql_ary['SELECT'] .= ', f.vendor_ext_enable, f.vendor_ext_value';
210
211
		return $sql_ary;
212
	}
213
	*/
214
215
	/**
216
	 * Get forum custom template row.
217
	 *
218
	 * @param array		$row	Forum row
219
	 *
220
	 * @return array
221
	 * @access protected
222
	 */
223
	abstract protected function get_forum_cust_tpl_row($row);
224
	/** @example :
225
	{
226
		$tpl_row = [];
227
		if ($row['forum_type'] == FORUM_POST)
228
		{
229
			// Array to be joined with original $tpl_row
230
			$tpl_row = [
231
				'ENABLE'	=> $row['vendor_ext_enable'],
232
				// If more than one
233
				'VALUE'		=> $row['vendor_ext_value'],
234
			];
235
		}
236
		return $tpl_row;
237
	}
238
	*/
239
}
240