1 | <?php |
||
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 | 6 | 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 | 6 | $this->auth = $auth; |
|
73 | 6 | $this->content_visibility = $content_visibility; |
|
74 | 6 | $this->user = $user; |
|
75 | 6 | $this->date_range = $date_range; |
|
76 | 6 | $this->forum_data = $forum_data; |
|
77 | 6 | $this->forum_options = $forum_options; |
|
78 | 6 | $this->phpbb_root_path = $phpbb_root_path; |
|
79 | 6 | $this->php_ext = $php_ext; |
|
80 | |||
81 | 6 | $this->user->lang += array('DATE_FORMAT' => $config['default_dateformat']); |
|
82 | 6 | } |
|
83 | |||
84 | /** |
||
85 | * {@inheritdoc} |
||
86 | */ |
||
87 | 1 | public function get_config(array $settings) |
|
88 | { |
||
89 | 1 | $forum_options = $this->forum_options->get_all(); |
|
90 | 1 | $topic_type_options = $this->get_topic_type_options(); |
|
91 | 1 | $preview_options = $this->get_preview_options(); |
|
92 | 1 | $range_options = $this->get_range_options(); |
|
93 | 1 | $sort_options = $this->get_sorting_options(); |
|
94 | 1 | $template_options = $this->get_view_options(); |
|
95 | |||
96 | return array( |
||
97 | 1 | 'legend1' => 'SETTINGS', |
|
98 | 1 | 'forum_ids' => array('lang' => 'SELECT_FORUMS', 'validate' => 'string', 'type' => 'multi_select', 'options' => $forum_options, 'default' => array(), 'explain' => false), |
|
99 | 1 | 'topic_type' => array('lang' => 'TOPIC_TYPE', 'validate' => 'string', 'type' => 'checkbox', 'options' => $topic_type_options, 'default' => array(), 'explain' => false), |
|
100 | 1 | 'max_topics' => array('lang' => 'MAX_TOPICS', 'validate' => 'int:0:20', 'type' => 'number:0:20', 'maxlength' => 2, 'explain' => false, 'default' => 5), |
|
101 | 1 | 'date_range' => array('lang' => 'LIMIT_POST_TIME', 'validate' => 'string', 'type' => 'select', 'options' => $range_options, 'default' => '', 'explain' => false), |
|
102 | 1 | 'order_by' => array('lang' => 'ORDER_BY', 'validate' => 'string', 'type' => 'select', 'options' => $sort_options, 'default' => self::FORUMS_ORDER_LAST_POST, 'explain' => false), |
|
103 | |||
104 | 1 | 'legend2' => 'DISPLAY', |
|
105 | 1 | 'enable_tracking' => array('lang' => 'ENABLE_TOPIC_TRACKING', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false, 'default' => false), |
|
106 | 1 | 'topic_title_limit' => array('lang' => 'TOPIC_TITLE_LIMIT', 'validate' => 'int:0:255', 'type' => 'number:0:255', 'maxlength' => 3, 'explain' => false, 'default' => 25), |
|
107 | 1 | 'template' => array('lang' => 'TEMPLATE', 'validate' => 'string', 'type' => 'select', 'options' => $template_options, 'default' => 'titles', 'explain' => false), |
|
108 | 1 | 'display_preview' => array('lang' => 'DISPLAY_PREVIEW', 'validate' => 'string', 'type' => 'select', 'options' => $preview_options, 'default' => '', 'explain' => false), |
|
109 | 1 | 'preview_max_chars' => array('lang' => 'PREVIEW_MAX_CHARS', 'validate' => 'int:0:255', 'type' => 'number:0:255', 'maxlength' => 3, 'explain' => false, 'default' => 125), |
|
110 | 1 | ); |
|
111 | } |
||
112 | |||
113 | /** |
||
114 | * {@inheritdoc} |
||
115 | */ |
||
116 | 5 | public function display(array $bdata, $edit_mode = false) |
|
117 | { |
||
118 | 5 | $this->settings = $bdata['settings']; |
|
119 | |||
120 | 5 | $topic_data = $this->get_topic_data(); |
|
121 | |||
122 | 5 | $content = ''; |
|
123 | 5 | if (sizeof($topic_data)) |
|
124 | 5 | { |
|
125 | 5 | $content = $this->get_block_content($topic_data); |
|
126 | 5 | } |
|
127 | |||
128 | return array( |
||
129 | 5 | 'title' => $this->get_block_title(), |
|
130 | 5 | 'content' => $content, |
|
131 | 5 | ); |
|
132 | } |
||
133 | |||
134 | /** |
||
135 | * @param array $topic_data |
||
136 | * @return string |
||
137 | */ |
||
138 | 5 | protected function get_block_content(array $topic_data) |
|
139 | { |
||
140 | 5 | $this->set_display_fields(); |
|
141 | |||
142 | 5 | $view = 'S_' . strtoupper($this->settings['template']); |
|
143 | 5 | $post_data = $this->get_post_data($topic_data); |
|
144 | 5 | $topic_data = array_values($topic_data); |
|
145 | |||
146 | 5 | $this->show_topics($topic_data, $post_data); |
|
147 | 5 | unset($topic_data, $post_data); |
|
148 | |||
149 | 5 | $this->ptemplate->assign_vars(array( |
|
150 | 5 | $view => true, |
|
151 | 5 | 'S_IS_BOT' => $this->user->data['is_bot'], |
|
152 | 5 | 'LAST_POST_IMG' => $this->user->img('icon_topic_latest'), |
|
153 | 5 | 'NEWEST_POST_IMG' => $this->user->img('icon_topic_newest'), |
|
154 | 5 | )); |
|
155 | |||
156 | 5 | 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 | 5 | protected function show_topics(array &$topic_data, array &$post_data) |
|
164 | { |
||
165 | 5 | for ($i = 0, $size = sizeof($topic_data); $i < $size; $i++) |
|
166 | { |
||
167 | 5 | $row =& $topic_data[$i]; |
|
168 | 5 | $forum_id = $row['forum_id']; |
|
169 | 5 | $topic_id = $row['topic_id']; |
|
170 | |||
171 | $tpl_ary = array( |
||
172 | 5 | 'FORUM_TITLE' => $row['forum_name'], |
|
173 | 5 | 'TOPIC_TITLE' => truncate_string(censor_text($row['topic_title']), $this->settings['topic_title_limit'], 255, false, '...'), |
|
174 | 5 | 'TOPIC_AUTHOR' => get_username_string('full', $row[$this->fields['user_id']], $row[$this->fields['username']], $row[$this->fields['user_colour']]), |
|
175 | 5 | 'TOPIC_PREVIEW' => $this->get_post_preview(array_pop($post_data[$topic_id])), |
|
176 | 5 | 'TOPIC_POST_TIME' => $this->user->format_date($row[$this->fields['time']]), |
|
177 | 5 | 'ATTACH_ICON_IMG' => $this->get_attachment_icon($forum_id, $row['topic_attachment']), |
|
178 | 5 | 'REPLIES' => $this->content_visibility->get_count('topic_posts', $row, $forum_id) - 1, |
|
179 | 5 | 'VIEWS' => $row['topic_views'], |
|
180 | 5 | 'S_UNREAD_TOPIC' => $this->is_unread_topic($forum_id, $topic_id, $row['topic_last_post_time']), |
|
181 | |||
182 | 5 | 'U_VIEWTOPIC' => append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "f=$forum_id&t=$topic_id"), |
|
183 | 5 | 'U_VIEWFORUM' => append_sid($this->phpbb_root_path . 'viewforum.' . $this->php_ext, "f=$forum_id"), |
|
184 | 5 | ); |
|
185 | |||
186 | 5 | $this->ptemplate->assign_block_vars('topicrow', $tpl_ary); |
|
187 | 5 | unset($topic_data[$i], $post_data[$topic_id]); |
|
188 | 5 | } |
|
189 | 5 | } |
|
190 | |||
191 | /** |
||
192 | * @return string |
||
193 | */ |
||
194 | 5 | protected function get_block_title() |
|
208 | |||
209 | /** |
||
210 | * @param array $row |
||
211 | * @return string |
||
212 | */ |
||
213 | 5 | protected function get_post_preview(array $row) |
|
224 | |||
225 | /** |
||
226 | * @param array $row |
||
227 | */ |
||
228 | 1 | protected function get_trimmed_text(array $row) |
|
237 | |||
238 | /** |
||
239 | * @param array $row |
||
240 | */ |
||
241 | 2 | protected function get_tooltip_text(array $row) |
|
248 | |||
249 | /** |
||
250 | * @return array |
||
251 | */ |
||
252 | 5 | private function get_topic_data() |
|
253 | { |
||
254 | $sort_order = array( |
||
255 | 5 | self::FORUMS_ORDER_FIRST_POST => 't.topic_time', |
|
256 | 5 | self::FORUMS_ORDER_LAST_POST => 't.topic_last_post_time', |
|
257 | 5 | self::FORUMS_ORDER_LAST_READ => 't.topic_last_view_time' |
|
258 | 5 | ); |
|
259 | |||
260 | 5 | $range_info = $this->date_range->get($this->settings['date_range']); |
|
261 | |||
262 | 5 | $this->forum_data->query($this->settings['enable_tracking']) |
|
263 | 5 | ->fetch_forum($this->settings['forum_ids']) |
|
264 | 5 | ->fetch_topic_type($this->settings['topic_type']) |
|
265 | 5 | ->fetch_date_range($range_info['start'], $range_info['stop']) |
|
266 | 5 | ->set_sorting($sort_order[$this->settings['order_by']]) |
|
267 | 5 | ->build(); |
|
268 | |||
269 | 5 | $topic_data = $this->forum_data->get_topic_data($this->settings['max_topics']); |
|
270 | 5 | $this->topic_tracking_info = $this->forum_data->get_topic_tracking_info(); |
|
271 | |||
272 | 5 | return $topic_data; |
|
273 | } |
||
274 | |||
275 | /** |
||
276 | * @param array $topic_data |
||
277 | * @return array |
||
278 | */ |
||
279 | 5 | private function get_post_data(array $topic_data) |
|
280 | { |
||
281 | 5 | if ($this->settings['display_preview'] && $this->settings['preview_max_chars']) |
|
282 | 5 | { |
|
283 | 3 | $post_data = $this->forum_data->get_post_data($this->settings['display_preview']); |
|
284 | 3 | } |
|
285 | else |
||
286 | { |
||
287 | 2 | $post_data = array_fill_keys(array_keys($topic_data), array(array('post_text' => '', 'bbcode_uid' => '', 'bbcode_bitfield' => ''))); |
|
288 | } |
||
289 | |||
290 | 5 | return $post_data; |
|
291 | } |
||
292 | |||
293 | /** |
||
294 | * |
||
295 | */ |
||
296 | 5 | private function set_display_fields() |
|
297 | { |
||
298 | 5 | if ($this->settings['display_preview'] == 'last') |
|
299 | 5 | { |
|
300 | 1 | $this->fields['time'] = 'topic_last_post_time'; |
|
301 | 1 | $this->fields['user_id'] = 'topic_last_poster_id'; |
|
302 | 1 | $this->fields['username'] = 'topic_last_poster_name'; |
|
303 | 1 | $this->fields['user_colour'] = 'topic_last_poster_colour'; |
|
304 | |||
305 | 1 | $this->ptemplate->assign_var('L_POST_BY_AUTHOR', $this->user->lang('LAST_POST_BY_AUTHOR')); |
|
306 | 1 | } |
|
307 | else |
||
308 | { |
||
309 | 4 | $this->fields['time'] = 'topic_time'; |
|
310 | 4 | $this->fields['user_id'] = 'topic_poster'; |
|
311 | 4 | $this->fields['username'] = 'topic_first_poster_name'; |
|
312 | 4 | $this->fields['user_colour'] = 'topic_first_poster_colour'; |
|
313 | } |
||
314 | 5 | } |
|
315 | |||
316 | /** |
||
317 | * @param int $forum_id |
||
318 | * @param int $topic_attachment |
||
319 | * @return string |
||
320 | */ |
||
321 | 5 | private function get_attachment_icon($forum_id, $topic_attachment) |
|
325 | |||
326 | /** |
||
327 | * @param int $forum_id |
||
328 | * @return bool |
||
329 | */ |
||
330 | 5 | private function user_can_view_attachments($forum_id) |
|
334 | |||
335 | /** |
||
336 | * @param int $forum_id |
||
337 | * @param int $topic_id |
||
338 | * @param int $topic_last_post_time |
||
339 | * @return bool |
||
340 | */ |
||
341 | 5 | private function is_unread_topic($forum_id, $topic_id, $topic_last_post_time) |
|
345 | |||
346 | /** |
||
347 | * @return array |
||
348 | */ |
||
349 | 1 | private function get_topic_type_options() |
|
358 | |||
359 | /** |
||
360 | * @return array |
||
361 | */ |
||
362 | 1 | private function get_preview_options() |
|
370 | |||
371 | /** |
||
372 | * @return array |
||
373 | */ |
||
374 | 1 | private function get_range_options() |
|
384 | |||
385 | /** |
||
386 | * @return array |
||
387 | */ |
||
388 | 1 | private function get_sorting_options() |
|
396 | |||
397 | /** |
||
398 | * @return array |
||
399 | */ |
||
400 | 1 | private function get_view_options() |
|
408 | } |
||
409 |