Completed
Push — master ( c96b51...1deced )
by Daniel
08:48
created

forum_topics::_get_block_content()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 1

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 20
ccs 14
cts 14
cp 1
rs 9.4286
cc 1
eloc 13
nc 1
nop 1
crap 1
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