Completed
Push — master ( 799b0c...788440 )
by Daniel
08:11
created

forum_topics::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 14
ccs 12
cts 12
cp 1
rs 9.4286
cc 1
eloc 11
nc 1
nop 9
crap 1

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/**
3
 *
4
 * @package sitemaker
5
 * @copyright (c) 2013 Daniel A. (blitze)
6
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7
 *
8
 */
9
10
namespace blitze\sitemaker\blocks;
11
12
use Nickvergessen\TrimMessage\TrimMessage;
13
14
/**
15
 * Forum Topics Block
16
 */
17
class forum_topics extends \blitze\sitemaker\services\blocks\driver\block
18
{
19
	/** @var \phpbb\auth\auth */
20
	protected $auth;
21
22
	/** @var \phpbb\cache\driver\driver_interface */
23
	protected $cache;
24
25
	/** @var \phpbb\config\config */
26
	protected $config;
27
28
	/** @var \phpbb\content_visibility */
29
	protected $content_visibility;
30
31
	/** @var \phpbb\user */
32
	protected $user;
33
34
	/** @var \blitze\sitemaker\services\date_range */
35
	protected $date_range;
36
37
	/** @var \blitze\sitemaker\services\forum\data */
38
	protected $forum;
39
40
	/** @var \Urodoz\Truncate\TruncateService */
41
	protected $truncate;
42
43
	/** @var string */
44
	protected $phpbb_root_path;
45
46
	/** @var string */
47
	protected $php_ext;
48
49
	/** @var array */
50
	private $fields = array();
51
52
	/** @var array */
53
	private $settings = array();
54
55
	/** @var array */
56
	private $topic_tracking_info = array();
57
58
	/**
59
	 * Constructor
60
	 *
61
	 * @param \phpbb\auth\auth						$auth				Permission object
62
	 * @param \phpbb\cache\driver\driver_interface	$cache				Cache driver interface
63
	 * @param \phpbb\config\config					$config				Config object
64
	 * @param \phpbb\content_visibility				content_visibility	Content visibility object
65
	 * @param \phpbb\user							$user				User object
66
	 * @param \blitze\sitemaker\services\date_range	$date_range			Date Range Object
67
	 * @param \blitze\sitemaker\services\forum\data	$forum				Forum Data object
68
	 * @param string								$phpbb_root_path	Path to the phpbb includes directory.
69
	 * @param string								$php_ext			php file extension
70
	 */
71 5
	public function __construct(\phpbb\auth\auth $auth, \phpbb\cache\driver\driver_interface $cache, \phpbb\config\config $config, \phpbb\content_visibility $content_visibility, \phpbb\user $user, \blitze\sitemaker\services\date_range $date_range, \blitze\sitemaker\services\forum\data $forum, $phpbb_root_path, $php_ext)
72
	{
73 5
		$this->auth = $auth;
74 5
		$this->cache = $cache;
75 5
		$this->config = $config;
76 5
		$this->content_visibility = $content_visibility;
77 5
		$this->user = $user;
78 5
		$this->date_range = $date_range;
79 5
		$this->forum = $forum;
80 5
		$this->phpbb_root_path = $phpbb_root_path;
81 5
		$this->php_ext = $php_ext;
82
83 5
		$this->user->lang += array('DATE_FORMAT' => $config['default_dateformat']);
84 5
	}
85
86
	/**
87
	 * {@inheritdoc}
88
	 */
89 1
	public function get_config(array $settings)
90
	{
91 1
		$forum_options = $this->_get_forum_options();
92 1
		$topic_type_options = $this->_get_topic_type_options();
93 1
		$preview_options = $this->_get_preview_options();
94 1
		$range_options = $this->_get_range_options();
95 1
		$sort_options = $this->_get_sorting_options();
96 1
		$template_options = $this->_get_view_options();
97
98
		return array(
99 1
			'legend1'		=> $this->user->lang('SETTINGS'),
100 1
			'forum_ids'			=> array('lang' => 'SELECT_FORUMS', 'validate' => 'string', 'type' => 'multi_select', 'options' => $forum_options, 'default' => array(), 'explain' => false),
101 1
			'topic_type'		=> array('lang' => 'TOPIC_TYPE', 'validate' => 'string', 'type' => 'checkbox', 'options' => $topic_type_options, 'default' => array(), 'explain' => false),
102 1
			'max_topics'		=> array('lang' => 'MAX_TOPICS', 'validate' => 'int:0:20', 'type' => 'number:0:20', 'maxlength' => 2, 'explain' => false, 'default' => 5),
103 1
			'date_range'		=> array('lang' => 'LIMIT_POST_TIME', 'validate' => 'string', 'type' => 'select', 'options' => $range_options, 'default' => '', 'explain' => false),
104 1
			'order_by'			=> array('lang' => 'ORDER_BY', 'validate' => 'string', 'type' => 'select', 'options' => $sort_options, 'default' => FORUMS_ORDER_LAST_POST, 'explain' => false),
105
106 1
			'legend2'		=> $this->user->lang('DISPLAY'),
107 1
			'enable_tracking'	=> array('lang' => 'ENABLE_TOPIC_TRACKING', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false, 'default' => false),
108 1
			'topic_title_limit'	=> array('lang' => 'TOPIC_TITLE_LIMIT', 'validate' => 'int:0:255', 'type' => 'number:0:255', 'maxlength' => 3, 'explain' => false, 'default' => 25),
109 1
			'template'			=> array('lang' => 'TEMPLATE', 'validate' => 'string', 'type' => 'select', 'options' => $template_options, 'default' => 'titles', 'explain' => false),
110 1
			'display_preview'	=> array('lang' => 'DISPLAY_PREVIEW', 'validate' => 'string', 'type' => 'select', 'options' => $preview_options, 'default' => '', 'explain' => false),
111 1
			'preview_max_chars'	=> array('lang' => 'PREVIEW_MAX_CHARS', 'validate' => 'int:0:255', 'type' => 'number:0:255', 'maxlength' => 3, 'explain' => false, 'default' => 125),
112 1
		);
113
	}
114
115
	/**
116
	 * {@inheritdoc}
117
	 */
118 4
	public function display(array $bdata, $edit_mode = false)
119
	{
120 4
		$this->settings = $bdata['settings'];
121
122 4
		$topic_data = $this->_get_topic_data();
123
124 4
		$content = '';
125 4
		if (sizeof($topic_data))
126 4
		{
127 4
			$content = $this->_get_block_content($topic_data);
128 4
		}
129
130
		return array(
131 4
			'title'		=> $this->get_block_title(),
132 4
			'content'	=> $content,
133 4
		);
134
	}
135
136
	/**
137
	 * @param array $topic_data
138
	 * @return string
139
	 */
140 4
	protected function _get_block_content(array $topic_data)
141
	{
142 4
		$this->_set_display_fields();
143
144 4
		$view = 'S_' . strtoupper($this->settings['template']);
145 4
		$post_data = $this->_get_post_data($topic_data);
146 4
		$topic_data = array_values($topic_data);
147
148 4
		$this->_show_topics($topic_data, $post_data);
149 4
		unset($topic_data, $post_data);
150
151 4
		$this->ptemplate->assign_vars(array(
152 4
			$view				=> true,
153 4
			'S_IS_BOT'			=> $this->user->data['is_bot'],
154 4
			'LAST_POST_IMG'		=> $this->user->img('icon_topic_latest'),
155 4
			'NEWEST_POST_IMG'	=> $this->user->img('icon_topic_newest'),
156 4
		));
157
158 4
		return $this->ptemplate->render_view('blitze/sitemaker', 'blocks/forum_topics.html', 'forum_topics_block');
159
	}
160
161
	/**
162
	 * @param array $topic_data
163
	 * @param array $post_data
164
	 */
165 4
	protected function _show_topics(array &$topic_data, array &$post_data)
166
	{
167 4
		for ($i = 0, $size = sizeof($topic_data); $i < $size; $i++)
168
		{
169 4
			$row =& $topic_data[$i];
170 4
			$forum_id = $row['forum_id'];
171 4
			$topic_id = $row['topic_id'];
172
173
			$tpl_ary = array(
174 4
				'FORUM_TITLE'		=> $row['forum_name'],
175 4
				'TOPIC_TITLE'		=> truncate_string(censor_text($row['topic_title']), $this->settings['topic_title_limit'], 255, false, '...'),
176 4
				'TOPIC_AUTHOR'		=> get_username_string('full', $row[$this->fields['user_id']], $row[$this->fields['username']], $row[$this->fields['user_colour']]),
177 4
				'TOPIC_PREVIEW'		=> $this->_get_preview(array_pop($post_data[$topic_id])),
178 4
				'TOPIC_POST_TIME'	=> $this->user->format_date($row[$this->fields['time']]),
179 4
				'ATTACH_ICON_IMG'	=> $this->_get_attachment_icon($forum_id, $row['topic_attachment']),
180 4
				'REPLIES'			=> $this->content_visibility->get_count('topic_posts', $row, $forum_id) - 1,
181 4
				'VIEWS'				=> $row['topic_views'],
182 4
				'S_UNREAD_TOPIC'	=> $this->_is_unread_topic($forum_id, $topic_id, $row['topic_last_post_time']),
183
184 4
				'U_VIEWTOPIC'		=> append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "f=$forum_id&amp;t=$topic_id"),
185 4
				'U_VIEWFORUM'		=> append_sid($this->phpbb_root_path . 'viewforum.' . $this->php_ext, "f=$forum_id"),
186 4
			);
187
188 4
			$this->ptemplate->assign_block_vars('topicrow', $tpl_ary);
189 4
			unset($topic_data[$i], $post_data[$topic_id]);
190 4
		}
191 4
	}
192
193
	/**
194
	 * @return string
195
	 */
196 4
	protected function get_block_title()
197
	{
198
		$types = array(
199 4
			POST_GLOBAL		=> 'FORUM_GLOBAL_ANNOUNCEMENTS',
200 4
			POST_ANNOUNCE	=> 'FORUM_ANNOUNCEMENTS',
201 4
			POST_STICKY		=> 'FORUM_STICKY_POSTS',
202 4
			POST_NORMAL		=> 'FORUM_RECENT_TOPICS',
203 4
		);
204
205
		// if more than one topic type is selected, we default to RECENT_TOPICS
206 4
		$topic_type = join(',', $this->settings['topic_type']);
207
208 4
		$lang_var = ($this->settings['order_by'] != FORUMS_ORDER_LAST_READ) ? (isset($types[$topic_type]) ? $types[$topic_type] : 'FORUM_RECENT_TOPICS') : 'TOPICS_LAST_READ';
209
210 4
		return $this->user->lang($lang_var);
211
	}
212
213
	/**
214
	 * @param array $row
215
	 * @return string
216
	 */
217 4
	protected function _get_preview(array $row)
218
	{
219 4
		$preview = '';
220 4
		if ($this->settings['display_preview'])
221 4
		{
222 3
			$trim = new TrimMessage($row['post_text'], $row['bbcode_uid'], $this->settings['preview_max_chars']);
223 3
			$row['post_text'] = $trim->message();
224 3
			unset($trim);
225
226 3
			$parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
227 3
			$preview = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, true);
228 3
		}
229
230 4
		return $preview;
231
	}
232
233
	/**
234
	 * @return array
235
	 */
236 4
	private function _get_topic_data()
237
	{
238
		$sort_order = array(
239 4
			FORUMS_ORDER_FIRST_POST		=> 't.topic_time',
240 4
			FORUMS_ORDER_LAST_POST		=> 't.topic_last_post_time',
241 4
			FORUMS_ORDER_LAST_READ		=> 't.topic_last_view_time'
242 4
		);
243
244 4
		$range_info = $this->date_range->get($this->settings['date_range']);
245
246 4
		$this->forum->query()
247 4
			->fetch_forum($this->settings['forum_ids'])
248 4
			->fetch_topic_type($this->settings['topic_type'])
249 4
			->fetch_tracking_info($this->settings['enable_tracking'])
250 4
			->fetch_date_range($range_info['start'], $range_info['stop'])
251 4
			->set_sorting($sort_order[$this->settings['order_by']])
252 4
			->build();
253
254 4
		$topic_data = $this->forum->get_topic_data($this->settings['max_topics']);
255 4
		$this->topic_tracking_info = $this->forum->get_topic_tracking_info();
256
257 4
		return $topic_data;
258
	}
259
260
	/**
261
	 * @param array $topic_data
262
	 * @return array
263
	 */
264 4
	private function _get_post_data(array $topic_data)
265
	{
266 4
		if ($this->settings['display_preview'])
267 4
		{
268 3
			$post_data = $this->forum->get_post_data($this->settings['display_preview']);
269 3
		}
270
		else
271
		{
272 1
			$post_data = array_fill_keys(array_keys($topic_data), array(array('post_text' => '', 'bbcode_uid' => '', 'bbcode_bitfield' => '')));
273
		}
274
275 4
		return $post_data;
276
	}
277
278
	/**
279
	 *
280
	 */
281 4
	private function _set_display_fields()
282
	{
283 4
		if ($this->settings['display_preview'] == 'last')
284 4
		{
285 1
			$this->fields['time'] = 'topic_last_post_time';
286 1
			$this->fields['user_id'] = 'topic_last_poster_id';
287 1
			$this->fields['username'] = 'topic_last_poster_name';
288 1
			$this->fields['user_colour'] = 'topic_last_poster_colour';
289
290 1
			$this->ptemplate->assign_var('L_POST_BY_AUTHOR', $this->user->lang('LAST_POST_BY_AUTHOR'));
291 1
		}
292
		else
293
		{
294 3
			$this->fields['time'] = 'topic_time';
295 3
			$this->fields['user_id'] = 'topic_poster';
296 3
			$this->fields['username'] = 'topic_first_poster_name';
297 3
			$this->fields['user_colour'] = 'topic_first_poster_colour';
298
		}
299 4
	}
300
301
	/**
302
	 * @param int $forum_id
303
	 * @param int $topic_attachment
304
	 * @return string
305
	 */
306 4
	private function _get_attachment_icon($forum_id, $topic_attachment)
307
	{
308 4
		return ($this->_user_can_view_attachments($forum_id) && $topic_attachment) ? $this->user->img('icon_topic_attach', $this->user->lang['TOTAL_ATTACHMENTS']) : '';
309
	}
310
311
	/**
312
	 * @param int $forum_id
313
	 * @return bool
314
	 */
315 4
	private function _user_can_view_attachments($forum_id)
316
	{
317 4
		return ($this->auth->acl_get('u_download') && $this->auth->acl_get('f_download', $forum_id)) ? true : false;
318
	}
319
320
	/**
321
	 * @param int $forum_id
322
	 * @param int $topic_id
323
	 * @param int $topic_last_post_time
324
	 * @return bool
325
	 */
326 4
	private function _is_unread_topic($forum_id, $topic_id, $topic_last_post_time)
327
	{
328 4
		return (isset($this->topic_tracking_info[$forum_id][$topic_id]) && $topic_last_post_time > $this->topic_tracking_info[$forum_id][$topic_id]) ? true : false;
329
	}
330
331
	/**
332
	 * @return array
333
	 */
334 1
	private function _get_forum_options()
335
	{
336 1
		if (!function_exists('make_forum_select'))
337 1
		{
338
			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);
339
		}
340
341 1
		$forumlist = make_forum_select(false, false, true, false, false, false, true);
342
343 1
		$forum_options = array('' => 'ALL');
344 1
		foreach ($forumlist as $row)
345
		{
346
			$forum_options[$row['forum_id']] = $row['padding'] . $row['forum_name'];
347 1
		}
348
349 1
		return $forum_options;
350
	}
351
352
	/**
353
	 * @return array
354
	 */
355 1
	private function _get_topic_type_options()
356
	{
357
		return array(
358 1
			POST_NORMAL     => 'POST_NORMAL',
359 1
			POST_STICKY     => 'POST_STICKY',
360 1
			POST_ANNOUNCE   => 'POST_ANNOUNCEMENT',
361 1
			POST_GLOBAL     => 'POST_GLOBAL',
362 1
		);
363
	}
364
365
	/**
366
	 * @return array
367
	 */
368 1
	private function _get_preview_options()
369
	{
370
		return array(
371 1
			''      => 'NO',
372 1
			'first' => 'SHOW_FIRST_POST',
373 1
			'last'  => 'SHOW_LAST_POST',
374 1
		);
375
	}
376
377
	/**
378
	 * @return array
379
	 */
380 1
	private function _get_range_options()
381
	{
382
		return array(
383 1
			''      => 'ALL_TIME',
384 1
			'today' => 'TODAY',
385 1
			'week'  => 'THIS_WEEK',
386 1
			'month' => 'THIS_MONTH',
387 1
			'year'  => 'THIS_YEAR',
388 1
		);
389
	}
390
391
	/**
392
	 * @return array
393
	 */
394 1
	private function _get_sorting_options()
395
	{
396
		return array(
397 1
			FORUMS_ORDER_FIRST_POST => 'FIRST_POST_TIME',
398 1
			FORUMS_ORDER_LAST_POST  => 'LAST_POST_TIME',
399 1
			FORUMS_ORDER_LAST_READ  => 'LAST_READ_TIME',
400 1
		);
401
	}
402
403
	/**
404
	 * @return array
405
	 */
406 1
	private function _get_view_options()
407
	{
408
		return array(
409 1
			'titles'    => 'TITLES',
410 1
			'mini'      => 'MINI',
411 1
			'context'   => 'CONTEXT',
412 1
		);
413
	}
414
}
415