Completed
Push — master ( 73b87b...be40cf )
by Daniel
10:47
created

forum_topics::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 13
ccs 0
cts 12
cp 0
rs 9.4285
cc 1
eloc 10
nc 1
nop 9
crap 2

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