Completed
Push — master ( 24ebcc...799b0c )
by Daniel
10:31
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
		$method = 'forum_topics_' . $this->settings['template'];
0 ignored issues
show
Unused Code introduced by
$method is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
146 4
		$post_data = $this->_get_post_data($topic_data);
147 4
		$topic_data = array_values($topic_data);
148
149 4
		$this->_show_topics($topic_data, $post_data);
150 4
		unset($topic_data, $post_data);
151
152 4
		$this->ptemplate->assign_vars(array(
153 4
			$view				=> true,
154 4
			'S_IS_BOT'			=> $this->user->data['is_bot'],
155 4
			'LAST_POST_IMG'		=> $this->user->img('icon_topic_latest'),
156 4
			'NEWEST_POST_IMG'	=> $this->user->img('icon_topic_newest'),
157 4
		));
158
159 4
		return $this->ptemplate->render_view('blitze/sitemaker', 'blocks/forum_topics.html', 'forum_topics_block');
160
	}
161
162
	/**
163
	 * @param array $topic_data
164
	 * @param array $post_data
165
	 */
166 4
	protected function _show_topics(array &$topic_data, array &$post_data)
167
	{
168 4
		for ($i = 0, $size = sizeof($topic_data); $i < $size; $i++)
169
		{
170 4
			$row =& $topic_data[$i];
171 4
			$forum_id = $row['forum_id'];
172 4
			$topic_id = $row['topic_id'];
173
174
			$tpl_ary = array(
175 4
				'FORUM_TITLE'		=> $row['forum_name'],
176 4
				'TOPIC_TITLE'		=> truncate_string(censor_text($row['topic_title']), $this->settings['topic_title_limit'], 255, false, '...'),
177 4
				'TOPIC_AUTHOR'		=> get_username_string('full', $row[$this->fields['user_id']], $row[$this->fields['username']], $row[$this->fields['user_colour']]),
178 4
				'TOPIC_PREVIEW'		=> $this->_get_preview(array_pop($post_data[$topic_id])),
179 4
				'TOPIC_POST_TIME'	=> $this->user->format_date($row[$this->fields['time']]),
180 4
				'ATTACH_ICON_IMG'	=> $this->_get_attachment_icon($forum_id, $row['topic_attachment']),
181 4
				'REPLIES'			=> $this->content_visibility->get_count('topic_posts', $row, $forum_id) - 1,
182 4
				'VIEWS'				=> $row['topic_views'],
183 4
				'S_UNREAD_TOPIC'	=> $this->_is_unread_topic($forum_id, $topic_id, $row['topic_last_post_time']),
184
185 4
				'U_VIEWTOPIC'		=> append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "f=$forum_id&amp;t=$topic_id"),
186 4
				'U_VIEWFORUM'		=> append_sid($this->phpbb_root_path . 'viewforum.' . $this->php_ext, "f=$forum_id"),
187 4
			);
188
189 4
			$this->ptemplate->assign_block_vars('topicrow', $tpl_ary);
190 4
			unset($topic_data[$i], $post_data[$topic_id]);
191 4
		}
192 4
	}
193
194
	/**
195
	 * @return string
196
	 */
197 4
	protected function get_block_title()
198
	{
199
		$types = array(
200 4
			POST_GLOBAL		=> 'FORUM_GLOBAL_ANNOUNCEMENTS',
201 4
			POST_ANNOUNCE	=> 'FORUM_ANNOUNCEMENTS',
202 4
			POST_STICKY		=> 'FORUM_STICKY_POSTS',
203 4
			POST_NORMAL		=> 'FORUM_RECENT_TOPICS',
204 4
		);
205
206
		// if more than one topic type is selected, we default to RECENT_TOPICS
207 4
		$topic_type = join(',', $this->settings['topic_type']);
208
209 4
		$lang_var = ($this->settings['order_by'] != FORUMS_ORDER_LAST_READ) ? (isset($types[$topic_type]) ? $types[$topic_type] : 'FORUM_RECENT_TOPICS') : 'TOPICS_LAST_READ';
210
211 4
		return $this->user->lang($lang_var);
212
	}
213
214
	/**
215
	 * @param array $row
216
	 * @return string
217
	 */
218 4
	protected function _get_preview(array $row)
219
	{
220 4
		$preview = '';
221 4
		if ($this->settings['display_preview'])
222 4
		{
223 3
			$trim = new TrimMessage($row['post_text'], $row['bbcode_uid'], $this->settings['preview_max_chars']);
224 3
			$row['post_text'] = $trim->message();
225 3
			unset($trim);
226
227 3
			$parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
228 3
			$preview = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, true);
229 3
		}
230
231 4
		return $preview;
232
	}
233
234
	/**
235
	 * @return array
236
	 */
237 4
	private function _get_topic_data()
238
	{
239
		$sort_order = array(
240 4
			FORUMS_ORDER_FIRST_POST		=> 't.topic_time',
241 4
			FORUMS_ORDER_LAST_POST		=> 't.topic_last_post_time',
242 4
			FORUMS_ORDER_LAST_READ		=> 't.topic_last_view_time'
243 4
		);
244
245 4
		$range_info = $this->date_range->get($this->settings['date_range']);
246
247 4
		$this->forum->query()
248 4
			->fetch_forum($this->settings['forum_ids'])
249 4
			->fetch_topic_type($this->settings['topic_type'])
250 4
			->fetch_tracking_info($this->settings['enable_tracking'])
251 4
			->fetch_date_range($range_info['start'], $range_info['stop'])
252 4
			->set_sorting($sort_order[$this->settings['order_by']])
253 4
			->build();
254
255 4
		$topic_data = $this->forum->get_topic_data($this->settings['max_topics']);
256 4
		$this->topic_tracking_info = $this->forum->get_topic_tracking_info();
257
258 4
		return $topic_data;
259
	}
260
261
	/**
262
	 * @param array $topic_data
263
	 * @return array
264
	 */
265 4
	private function _get_post_data(array $topic_data)
266
	{
267 4
		if ($this->settings['display_preview'])
268 4
		{
269 3
			$post_data = $this->forum->get_post_data($this->settings['display_preview']);
270 3
		}
271
		else
272
		{
273 1
			$post_data = array_fill_keys(array_keys($topic_data), array(array('post_text' => '', 'bbcode_uid' => '', 'bbcode_bitfield' => '')));
274
		}
275
276 4
		return $post_data;
277
	}
278
279
	/**
280
	 *
281
	 */
282 4
	private function _set_display_fields()
283
	{
284 4
		if ($this->settings['display_preview'] == 'last')
285 4
		{
286 1
			$this->fields['time'] = 'topic_last_post_time';
287 1
			$this->fields['user_id'] = 'topic_last_poster_id';
288 1
			$this->fields['username'] = 'topic_last_poster_name';
289 1
			$this->fields['user_colour'] = 'topic_last_poster_colour';
290
291 1
			$this->ptemplate->assign_var('L_POST_BY_AUTHOR', $this->user->lang('LAST_POST_BY_AUTHOR'));
292 1
		}
293
		else
294
		{
295 3
			$this->fields['time'] = 'topic_time';
296 3
			$this->fields['user_id'] = 'topic_poster';
297 3
			$this->fields['username'] = 'topic_first_poster_name';
298 3
			$this->fields['user_colour'] = 'topic_first_poster_colour';
299
		}
300 4
	}
301
302
	/**
303
	 * @param int $forum_id
304
	 * @param int $topic_attachment
305
	 * @return string
306
	 */
307 4
	private function _get_attachment_icon($forum_id, $topic_attachment)
308
	{
309 4
		return ($this->_user_can_view_attachments($forum_id) && $topic_attachment) ? $this->user->img('icon_topic_attach', $this->user->lang['TOTAL_ATTACHMENTS']) : '';
310
	}
311
312
	/**
313
	 * @param int $forum_id
314
	 * @return bool
315
	 */
316 4
	private function _user_can_view_attachments($forum_id)
317
	{
318 4
		return ($this->auth->acl_get('u_download') && $this->auth->acl_get('f_download', $forum_id)) ? true : false;
319
	}
320
321
	/**
322
	 * @param int $forum_id
323
	 * @param int $topic_id
324
	 * @param int $topic_last_post_time
325
	 * @return bool
326
	 */
327 4
	private function _is_unread_topic($forum_id, $topic_id, $topic_last_post_time)
328
	{
329 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;
330
	}
331
332
	/**
333
	 * @return array
334
	 */
335 1
	private function _get_forum_options()
336
	{
337 1
		if (!function_exists('make_forum_select'))
338 1
		{
339
			include($this->phpbb_root_path . 'includes/functions_admin.' . $this->php_ext);
340
		}
341
342 1
		$forumlist = make_forum_select(false, false, true, false, false, false, true);
343
344 1
		$forum_options = array('' => 'ALL');
345 1
		foreach ($forumlist as $row)
346
		{
347
			$forum_options[$row['forum_id']] = $row['padding'] . $row['forum_name'];
348 1
		}
349
350 1
		return $forum_options;
351
	}
352
353
	/**
354
	 * @return array
355
	 */
356 1
	private function _get_topic_type_options()
357
	{
358
		return array(
359 1
			POST_NORMAL     => 'POST_NORMAL',
360 1
			POST_STICKY     => 'POST_STICKY',
361 1
			POST_ANNOUNCE   => 'POST_ANNOUNCEMENT',
362 1
			POST_GLOBAL     => 'POST_GLOBAL',
363 1
		);
364
	}
365
366
	/**
367
	 * @return array
368
	 */
369 1
	private function _get_preview_options()
370
	{
371
		return array(
372 1
			''      => 'NO',
373 1
			'first' => 'SHOW_FIRST_POST',
374 1
			'last'  => 'SHOW_LAST_POST',
375 1
		);
376
	}
377
378
	/**
379
	 * @return array
380
	 */
381 1
	private function _get_range_options()
382
	{
383
		return array(
384 1
			''      => 'ALL_TIME',
385 1
			'today' => 'TODAY',
386 1
			'week'  => 'THIS_WEEK',
387 1
			'month' => 'THIS_MONTH',
388 1
			'year'  => 'THIS_YEAR',
389 1
		);
390
	}
391
392
	/**
393
	 * @return array
394
	 */
395 1
	private function _get_sorting_options()
396
	{
397
		return array(
398 1
			FORUMS_ORDER_FIRST_POST => 'FIRST_POST_TIME',
399 1
			FORUMS_ORDER_LAST_POST  => 'LAST_POST_TIME',
400 1
			FORUMS_ORDER_LAST_READ  => 'LAST_READ_TIME',
401 1
		);
402
	}
403
404
	/**
405
	 * @return array
406
	 */
407 1
	private function _get_view_options()
408
	{
409
		return array(
410 1
			'titles'    => 'TITLES',
411 1
			'mini'      => 'MINI',
412 1
			'context'   => 'CONTEXT',
413 1
		);
414
	}
415
}
416