base_view::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 9
c 1
b 0
f 0
nc 1
nop 9
dl 0
loc 11
ccs 0
cts 11
cp 0
crap 2
rs 9.9666

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) 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