base_view::show_topic_blocks()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 4
c 1
b 0
f 0
nc 3
nop 4
dl 0
loc 9
ccs 0
cts 8
cp 0
crap 12
rs 10
1
<?php
2
/**
3
 *
4
 * @package sitemaker
5
 * @copyright (c) 2016 Daniel A. (blitze)
6
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7
 *
8
 */
9
10
namespace blitze\content\services\views\driver;
11
12
abstract class base_view implements views_interface
13
{
14
	/** @var \phpbb\event\dispatcher_interface */
15
	protected $phpbb_dispatcher;
16
17
	/** @var\phpbb\language\language */
18
	protected $language;
19
20
	/** @var \phpbb\pagination */
21
	protected $pagination;
22
23
	/** @var \phpbb\template\template */
24
	protected $template;
25
26
	/* @var \blitze\content\services\fields */
27
	protected $fields;
28
29
	/** @var \blitze\sitemaker\services\forum\data */
0 ignored issues
show
Bug introduced by
The type blitze\sitemaker\services\forum\data was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
30
	protected $forum;
31
32
	/* @var \blitze\content\services\helper */
33
	protected $helper;
34
35
	/* @var \blitze\content\services\quickmod */
36
	protected $quickmod;
37
38
	/** @var \blitze\content\services\topic\blocks_factory */
39
	protected $topic_blocks_factory;
40
41
	/**
42
	 * Constructor
43
	 *
44
	 * @param \phpbb\event\dispatcher_interface					$phpbb_dispatcher		Event dispatcher object
45
	 * @param \phpbb\language\language							$language				Language Object
46
	 * @param \phpbb\pagination									$pagination				Pagination object
47
	 * @param \phpbb\template\template							$template				Template object
48
	 * @param \blitze\content\services\fields					$fields					Content fields object
49
	 * @param \blitze\sitemaker\services\forum\data				$forum					Forum Data object
50
	 * @param \blitze\content\services\helper					$helper					Content helper object
51
	 * @param \blitze\content\services\quickmod					$quickmod				Quick moderator tools
52
	 * @param \blitze\content\services\topic\blocks_factory		$topic_blocks_factory	Topic blocks factory object
53
	 */
54
	public function __construct(\phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\language\language $language, \phpbb\pagination $pagination, \phpbb\template\template $template, \blitze\content\services\fields $fields, \blitze\sitemaker\services\forum\data $forum, \blitze\content\services\helper $helper, \blitze\content\services\quickmod $quickmod, \blitze\content\services\topic\blocks_factory $topic_blocks_factory)
55
	{
56
		$this->phpbb_dispatcher = $phpbb_dispatcher;
57
		$this->language = $language;
58
		$this->pagination = $pagination;
59
		$this->template = $template;
60
		$this->fields = $fields;
61
		$this->forum = $forum;
62
		$this->helper = $helper;
63
		$this->quickmod = $quickmod;
64
		$this->topic_blocks_factory = $topic_blocks_factory;
65
	}
66
67
	/**
68
	 * {@inheritdoc}
69
	 */
70
	public function get_detail_template()
71
	{
72
		return 'views/content_detail.html';
73
	}
74
75
	/**
76
	 * {@inheritdoc}
77
	 */
78
	public function build_index_query(array $filters, \blitze\content\model\entity\type $entity = null)
79
	{
80
		$forum_id = $entity ? $entity->get_forum_id() : 0;
81
		$sql_array = $this->get_filter_sql($filters, $forum_id);
82
83
		$this->forum->query()
84
			->fetch_forum($forum_id)
85
			->fetch_custom($sql_array)
86
			->set_sorting('t.topic_time')
87
			->build(true, false, false);
88
	}
89
90
	/**
91
	 * {@inheritdoc}
92
	 */
93
	public function render_index(\blitze\content\model\entity\type $entity, $page, array $filters, array $topic_data_overwrite = array())
94
	{
95
		$content_type = $entity->get_content_name();
96
		$items_per_page = $entity->get_items_per_page();
97
		$start = ($page - 1) * $items_per_page;
98
99
		$this->build_index_query($filters, $entity);
100
		$this->set_mcp_url($entity->get_forum_id());
101
102
		if ($entity->get_show_pagination())
103
		{
104
			$filter_type = key($filters);
105
			$filter_value = (array) current($filters);
106
107
			$total_topics = $this->forum->get_topics_count();
108
			$this->generate_pagination('summary', $total_topics, $start, $items_per_page, array(
109
				'type'			=> $content_type,
110
				'filter_type'	=> $filter_type,
111
				'filter_value'	=> current($filter_value),
112
			));
113
		}
114
115
		return $this->display_topics($entity, $items_per_page, $start, $topic_data_overwrite);
116
	}
117
118
	/**
119
	 * @param \blitze\content\model\entity\type $entity
120
	 * @param int $items_per_page
121
	 * @param int $start
122
	 * @param array $topic_data_overwrite
123
	 * @return int
124
	 */
125
	protected function display_topics(\blitze\content\model\entity\type $entity, $items_per_page, $start, array $topic_data_overwrite)
126
	{
127
		$content_type = $entity->get_content_name();
128
		$topics_data = $this->forum->get_topic_data($items_per_page, $start);
129
		$posts_data = $this->forum->get_post_data('first');
130
		$topic_tracking_info = $this->forum->get_topic_tracking_info($entity->get_forum_id());
131
		$users_cache = $this->forum->get_posters_info();
132
		$attachments = $this->forum->get_attachments($entity->get_forum_id());
133
134
		$this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_summary_fields(), $entity->get_summary_tpl(), 'summary');
135
136
		$update_count = array();
137
		$max_update_time = 0;
138
139
		foreach ($posts_data as $topic_id => $posts)
140
		{
141
			$post_data	= array_shift($posts);
142
			$topic_data	= $topics_data[$topic_id];
143
			$topic_data = $this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info, $topic_data_overwrite);
144
145
			$this->template->assign_block_vars('topicrow', $topic_data);
146
			$max_update_time = max($max_update_time, (int) $topic_data['UPDATED']);
147
		}
148
		unset($topics_data, $posts_data, $users_cache, $attachments, $topic_tracking_info);
149
150
		return $max_update_time;
151
	}
152
153
	/**
154
	 * {@inheritdoc}
155
	 */
156
	public function render_detail(\blitze\content\model\entity\type $entity, $topic_id, $view, $redirect_url, array &$update_count, array $topic_data_overwrite = array())
157
	{
158
		$this->language->add_lang('viewtopic');
159
		$this->language->add_lang('content', 'blitze/content');
160
		$this->set_mcp_url($entity->get_forum_id(), $topic_id);
161
162
		$this->forum->query()
163
			->fetch_topic($topic_id)
164
			->fetch_watch_status()
165
			->fetch_bookmark_status()
166
			->build(true, true, false);
167
168
		return $this->display_topic($topic_id, $entity, $view, $redirect_url, $update_count, $topic_data_overwrite);
169
	}
170
171
	/**
172
	 * @param int $topic_id
173
	 * @param \blitze\content\model\entity\type $entity
174
	 * @param string $view	detail|print
175
	 * @param string $redirect_url
176
	 * @param array $update_count
177
	 * @param array $topic_data_overwrite
178
	 * @return array
179
	 * @throws \Exception
180
	 */
181
	protected function display_topic($topic_id, \blitze\content\model\entity\type $entity, $view, $redirect_url, array &$update_count, array $topic_data_overwrite)
182
	{
183
		$forum_id = $entity->get_forum_id();
184
		$content_type = $entity->get_content_name();
185
186
		$topics_data = $this->forum->get_topic_data();
187
		$post_data = $this->forum->get_post_data('first');
188
		$topic_tracking_info = $this->forum->get_topic_tracking_info($forum_id);
189
		$users_cache = $this->forum->get_posters_info();
190
		$attachments = $this->forum->get_attachments($forum_id);
191
192
		if (!sizeof($topics_data))
193
		{
194
			throw new \phpbb\exception\http_exception(404, 'NO_TOPIC');
195
		}
196
197
		$this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_detail_fields(), $entity->get_detail_tpl(), 'detail');
198
		$this->fields->set_view_mode($view);
199
200
		$topic_data = array_shift($topics_data);
201
		$post_data = array_shift($post_data[$topic_id]);
202
		$tpl_data = array_merge($topic_data,
203
			$this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info, $topic_data_overwrite, $redirect_url),
204
			$this->fields->get_topic_tools_data($topic_data)
205
		);
206
207
		$this->template->assign_vars(array_change_key_case($tpl_data, CASE_UPPER));
208
		$this->fields->show_attachments($attachments, $post_data['post_id']);
209
		$this->show_topic_blocks($entity, $topic_data, $post_data, array_shift($users_cache));
210
		$this->quickmod->show_tools($topic_data);
211
		$this->set_meta_tags($entity->get_detail_fields(), $tpl_data);
212
213
		return array_merge($topic_data, array(
214
			'topic_title'		=> $tpl_data['TOPIC_TITLE'],
215
			'total_comments'	=> $tpl_data['TOPIC_COMMENTS'],
216
			'topic_url'			=> $tpl_data['TOPIC_URL'],
217
		));
218
	}
219
220
	/**
221
	 * @param array $attachments
222
	 * @param int $post_id
223
	 * @return void
224
	 */
225
	protected function show_attachments(array $attachments, $post_id)
226
	{
227
		if (!empty($attachments[$post_id]))
228
		{
229
			foreach ($attachments[$post_id] as $attachment)
230
			{
231
				$this->template->assign_block_vars('attachment', array(
232
					'DISPLAY_ATTACHMENT'	=> $attachment)
233
				);
234
			}
235
		}
236
	}
237
238
	/**
239
	 * @param string $view_mode
240
	 * @param int $total_topics
241
	 * @param int $start
242
	 * @param int $items_per_page
243
	 * @param array $params
244
	 */
245
	protected function generate_pagination($view_mode, $total_topics, &$start, $items_per_page, array $params)
246
	{
247
		$params = array_filter($params);
248
		$route_type = $this->get_route_type($view_mode, $params);
249
		$start = $this->pagination->validate_start($start, $items_per_page, $total_topics);
250
		$this->pagination->generate_template_pagination(
251
			array(
252
				'routes' => array(
253
					'blitze_content_' . $route_type,
254
					'blitze_content_' . $route_type . '_page',
255
				),
256
				'params' => $params,
257
			),
258
			'pagination', 'page', $total_topics, $items_per_page, $start
259
		);
260
	}
261
262
	/**
263
	 * @param string $view_mode
264
	 * @param array $params
265
	 * @return string
266
	 */
267
	protected function get_route_type($view_mode, array $params)
268
	{
269
		$types = array(
270
			'show'		=> 'show',
271
			'summary'	=> join('_', array_filter(array(
272
				(!empty($params['type'])) ? 'type' : '',
273
				(!empty($params['filters'])) ? 'multi' : '',
274
				(!empty($params['filter_type'])) ? 'filter' : '',
275
			))),
276
		);
277
278
		return $types[$view_mode];
279
	}
280
281
	/**
282
	 * {@inheritdoc}
283
	 */
284
	protected function get_filter_sql(array $filters, $forum_id)
285
	{
286
		$sql_array = array();
287
288
		/**
289
		 * Event to filter topics by field value e.g category/food
290
		 *
291
		 * @event blitze.content.view.filter
292
		 * @var mixed								forum_id		Forum id, if available
293
		 * @var array								filters			Filters
294
		 * @var array								sql_array		Array to modify sql query to get topics
295
		 */
296
		$vars = array('forum_id', 'filters', 'sql_array');
297
		extract($this->phpbb_dispatcher->trigger_event('blitze.content.view.filter', compact($vars)));
298
299
		return $sql_array;
300
	}
301
302
	/**
303
	 * @param \blitze\content\model\entity\type $entity
304
	 * @param array $topic_data
305
	 * @param array $post_data
306
	 * @param array $user_cache
307
	 * @return void
308
	 */
309
	protected function show_topic_blocks(\blitze\content\model\entity\type $entity, array $topic_data, array $post_data, array $user_cache)
310
	{
311
		$topic_blocks = $entity->get_topic_blocks();
312
		foreach ($topic_blocks as $service_name)
313
		{
314
			/** @var \blitze\content\services\topic\driver\block_interface $block */
315
			if ($block = $this->topic_blocks_factory->get($service_name))
316
			{
317
				$block->show_block($entity, $topic_data, $post_data, $user_cache);
318
			}
319
		}
320
	}
321
322
	/**
323
	 * @param int $forum_id
324
	 * @param int $topic_id
325
	 * @return void
326
	 */
327
	protected function set_mcp_url($forum_id, $topic_id = 0)
328
	{
329
		$this->template->assign_var('U_MCP', $this->helper->get_mcp_url($forum_id, $topic_id));
330
	}
331
332
	/**
333
	 * @param array $field_types
334
	 * @param array $topic_data
335
	 * @return void
336
	 */
337
	protected function set_meta_tags(array $field_types, array $topic_data)
338
	{
339
		if (isset($topic_data['FIELDS']))
340
		{
341
			$image_url = $this->get_topic_image_url($field_types, (array) $topic_data['FIELDS']['all']);
342
			$description = $this->get_topic_description($field_types, (array) $topic_data['FIELDS']['all']);
343
344
			$meta = "<meta name=\"description\" content=\"$description\" />\n";
345
			$meta .= "<meta name=\"twitter:card\" value=\"summary\">\n";
346
			$meta .= "<meta property=\"og:title\" content=\"{$topic_data['TOPIC_TITLE']}\" />\n";
347
			$meta .= "<meta property=\"og:type\" content=\"article\" />\n";
348
			$meta .= "<meta property=\"og:url\" content=\"{$topic_data['PERMA_LINK']}\" />\n";
349
			$meta .= "<meta property=\"og:image\" content=\"$image_url\" />\n";
350
			$meta .= "<meta property=\"og:description\" content=\"$description\" />";
351
352
			$this->template->assign_var('META', $meta);
353
		}
354
	}
355
356
	/**
357
	 * @param array $field_types
358
	 * @param array $fields_data
359
	 * @return string
360
	 */
361
	protected function get_topic_image_url(array $field_types, array $fields_data)
362
	{
363
		$image_url = '';
364
365
		$figure = $this->get_field_value_by_type($fields_data, $field_types, 'image');
366
		if ($figure && preg_match('/src="(.*?)"/i', $figure, $matches))
367
		{
368
			$image_url = $matches[1];
369
		}
370
371
		return $image_url;
372
	}
373
374
	/**
375
	 * @param array $field_types
376
	 * @param array $fields_data
377
	 * @return string
378
	 */
379
	protected function get_topic_description(array $field_types, array $fields_data)
380
	{
381
		if (null !== ($description = $this->get_field_value_by_type($fields_data, $field_types, 'textarea')))
382
		{
383
			$description = implode(' ', array_slice(explode(' ', strip_tags($description)), 1, 20));
384
		}
385
386
		return $description;
387
	}
388
389
	/**
390
	 * @param array $fields_data
391
	 * @param array $field_types
392
	 * @param string $search_field
393
	 * @return string|null
394
	 */
395
	protected function get_field_value_by_type(array $fields_data, array $field_types, $search_field)
396
	{
397
		$results = array_keys($field_types, $search_field);
398
		$field = array_shift($results);
399
400
		return isset($fields_data[$field]) ? $fields_data[$field] : null;
401
	}
402
}
403