Completed
Push — master ( c96b51...1deced )
by Daniel
08:48
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 11
CRAP Score 1

Importance

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