Passed
Push — develop ( 49e842...20d485 )
by Daniel
03:55
created

base_view::__construct()   A

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 0
Metric Value
cc 1
eloc 9
nc 1
nop 9
dl 0
loc 11
ccs 0
cts 11
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0

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(), $cp_mode = '')
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, $cp_mode);
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
	 * @param string $cp_mode	ucp/mcp
124
	 * @return int
125
	 */
126
	protected function display_topics(\blitze\content\model\entity\type $entity, $items_per_page, $start, array $topic_data_overwrite, $cp_mode)
127
	{
128
		$content_type = $entity->get_content_name();
129
		$topics_data = $this->forum->get_topic_data($items_per_page, $start);
130
		$posts_data = $this->forum->get_post_data('first');
131
		$topic_tracking_info = $this->forum->get_topic_tracking_info($entity->get_forum_id());
132
		$users_cache = $this->forum->get_posters_info();
133
		$attachments = $this->forum->get_attachments($entity->get_forum_id());
134
135
		$this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_summary_fields(), $entity->get_summary_tpl(), 'summary');
136
137
		$update_count = array();
138
		$max_update_time = 0;
139
140
		foreach ($posts_data as $topic_id => $posts)
141
		{
142
			$post_data	= array_shift($posts);
143
			$topic_data	= $topics_data[$topic_id];
144
			$topic_data = $this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info, $topic_data_overwrite, $cp_mode);
145
146
			$this->template->assign_block_vars('topicrow', $topic_data);
147
			$max_update_time = max($max_update_time, $topic_data['UPDATED']);
148
		}
149
		unset($topics_data, $posts_data, $users_cache, $attachments, $topic_tracking_info);
150
151
		return $max_update_time;
152
	}
153
154
	/**
155
	 * {@inheritdoc}
156
	 */
157
	public function render_detail(\blitze\content\model\entity\type $entity, $topic_id, array &$update_count, array $topic_data_overwrite = array(), $cp_mode = '')
158
	{
159
		$this->language->add_lang('viewtopic');
160
		$this->language->add_lang('content', 'blitze/content');
161
		$this->set_mcp_url($entity->get_forum_id(), $topic_id);
162
163
		$this->forum->query()
164
			->fetch_topic($topic_id)
165
			->fetch_watch_status()
166
			->fetch_bookmark_status()
167
			->build(true, true, false);
168
169
		return $this->display_topic($topic_id, $entity, $update_count, $topic_data_overwrite, $cp_mode);
170
	}
171
172
	/**
173
	 * @param int $topic_id
174
	 * @param \blitze\content\model\entity\type $entity
175
	 * @param array $update_count
176
	 * @param array $topic_data_overwrite
177
	 * @param string $cp_mode	ucp/mcp
178
	 * @return array
179
	 * @throws \Exception
180
	 */
181
	protected function display_topic($topic_id, \blitze\content\model\entity\type $entity, array &$update_count, array $topic_data_overwrite, $cp_mode)
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($post_data))
193
		{
194
			throw new \Exception($this->language->lang('CONTENT_NO_EXIST'));
195
		}
196
197
		$this->fields->prepare_to_show($entity, array_keys($topics_data), $entity->get_detail_fields(), $entity->get_detail_tpl(), 'detail');
198
199
		$topic_data = array_shift($topics_data);
200
		$post_data = array_shift($post_data[$topic_id]);
201
		$tpl_data = array_merge($topic_data,
202
			$this->fields->show($content_type, $topic_data, $post_data, $users_cache, $attachments, $update_count, $topic_tracking_info, $topic_data_overwrite, $cp_mode),
203
			$this->fields->get_topic_tools_data($topic_data)
204
		);
205
206
		$this->template->assign_vars(array_change_key_case($tpl_data, CASE_UPPER));
207
		$this->fields->show_attachments($attachments, $post_data['post_id']);
208
		$this->show_topic_blocks($entity, $topic_data, $post_data, array_shift($users_cache));
209
		$this->quickmod->show_tools($topic_data);
210
		$this->set_meta_tags($entity->get_detail_fields(), $tpl_data);
211
212
		return array_merge($topic_data, array(
213
			'topic_title'		=> $tpl_data['TOPIC_TITLE'],
214
			'total_comments'	=> $tpl_data['TOPIC_COMMENTS'],
215
			'topic_url'			=> $tpl_data['TOPIC_URL'],
216
		));
217
	}
218
219
	/**
220
	 * @param array $attachments
221
	 * @param int $post_id
222
	 * @return void
223
	 */
224
	protected function show_attachments(array $attachments, $post_id)
225
	{
226
		if (!empty($attachments[$post_id]))
227
		{
228
			foreach ($attachments[$post_id] as $attachment)
229
			{
230
				$this->template->assign_block_vars('attachment', array(
231
						'DISPLAY_ATTACHMENT'	=> $attachment)
232
				);
233
			}
234
		}
235
	}
236
237
	/**
238
	 * @param string $view_mode
239
	 * @param int $total_topics
240
	 * @param int $start
241
	 * @param int $items_per_page
242
	 * @param array $params
243
	 */
244
	protected function generate_pagination($view_mode, $total_topics, &$start, $items_per_page, array $params)
245
	{
246
		$params = array_filter($params);
247
		$route_type = $this->get_route_type($view_mode, $params);
248
		$start = $this->pagination->validate_start($start, $items_per_page, $total_topics);
249
		$this->pagination->generate_template_pagination(
250
			array(
251
				'routes' => array(
252
					'blitze_content_' . $route_type,
253
					'blitze_content_' . $route_type . '_page',
254
				),
255
				'params' => $params,
256
			),
257
			'pagination', 'page', $total_topics, $items_per_page, $start
258
		);
259
	}
260
261
	/**
262
	 * @param string $view_mode
263
	 * @param array $params
264
	 * @return string
265
	 */
266
	protected function get_route_type($view_mode, array $params)
267
	{
268
		$types = array(
269
			'show'		=> 'show',
270
			'summary'	=> join('_', array_filter(array(
271
				(!empty($params['type'])) ? 'type' : '',
272
				(!empty($params['filters'])) ? 'multi' : '',
273
				(!empty($params['filter_type'])) ? 'filter' : '',
274
			))),
275
		);
276
277
		return $types[$view_mode];
278
	}
279
280
	/**
281
	 * {@inheritdoc}
282
	 */
283
	protected function get_filter_sql(array $filters, $forum_id)
284
	{
285
		$sql_array = array();
286
287
		/**
288
		 * Event to filter topics by field value e.g category/food
289
		 *
290
		 * @event blitze.content.view.filter
291
		 * @var mixed								forum_id		Forum id, if available
292
		 * @var array								filters			Filters
293
		 * @var array								sql_array		Array to modify sql query to get topics
294
		 */
295
		$vars = array('forum_id', 'filters', 'sql_array');
296
		extract($this->phpbb_dispatcher->trigger_event('blitze.content.view.filter', compact($vars)));
297
298
		return $sql_array;
299
	}
300
301
	/**
302
	 * @param \blitze\content\model\entity\type $entity
303
	 * @param array $topic_data
304
	 * @param array $post_data
305
	 * @param array $user_cache
306
	 * @return void
307
	 */
308
	protected function show_topic_blocks(\blitze\content\model\entity\type $entity, array $topic_data, array $post_data, array $user_cache)
309
	{
310
		$topic_blocks = $entity->get_topic_blocks();
311
		foreach ($topic_blocks as $service_name)
312
		{
313
			/** @var \blitze\content\services\topic\driver\block_interface $block */
314
			if ($block = $this->topic_blocks_factory->get($service_name))
315
			{
316
				$block->show_block($entity, $topic_data, $post_data, $user_cache);
317
			}
318
		}
319
	}
320
321
	/**
322
	 * @param int $forum_id
323
	 * @param int $topic_id
324
	 * @return void
325
	 */
326
	protected function set_mcp_url($forum_id, $topic_id = 0)
327
	{
328
		$this->template->assign_var('U_MCP', $this->helper->get_mcp_url($forum_id, $topic_id));
329
	}
330
331
	/**
332
	 * @param array $field_types
333
	 * @param array $topic_data
334
	 * @return void
335
	 */
336
	protected function set_meta_tags(array $field_types, array $topic_data)
337
	{
338
		if (isset($topic_data['FIELDS']))
339
		{
340
			$image_url = $this->get_topic_image_url($field_types, (array) $topic_data['FIELDS']['all']);
341
			$description = $this->get_topic_description($field_types, (array) $topic_data['FIELDS']['all']);
342
343
			$meta = "<meta name=\"description\" content=\"$description\" />\n";
344
			$meta .= "<meta name=\"twitter:card\" value=\"summary\">\n";
345
			$meta .= "<meta property=\"og:title\" content=\"{$topic_data['TOPIC_TITLE']}\" />\n";
346
			$meta .= "<meta property=\"og:type\" content=\"article\" />\n";
347
			$meta .= "<meta property=\"og:url\" content=\"{$topic_data['PERMA_LINK']}\" />\n";
348
			$meta .= "<meta property=\"og:image\" content=\"$image_url\" />\n";
349
			$meta .= "<meta property=\"og:description\" content=\"$description\" />";
350
351
			$this->template->assign_var('META', $meta);
352
		}
353
	}
354
355
	/**
356
	 * @param array $field_types
357
	 * @param array $fields_data
358
	 * @return string
359
	 */
360
	protected function get_topic_image_url(array $field_types, array $fields_data)
361
	{
362
		$image_url = '';
363
364
		$figure = $this->get_field_value_by_type($fields_data, $field_types, 'image');
365
		if ($figure && preg_match('/src="(.*?)"/i', $figure, $matches))
366
		{
367
			$image_url = $matches[1];
368
		}
369
370
		return $image_url;
371
	}
372
373
	/**
374
	 * @param array $field_types
375
	 * @param array $fields_data
376
	 * @return string
377
	 */
378
	protected function get_topic_description(array $field_types, array $fields_data)
379
	{
380
		if (null !== ($description = $this->get_field_value_by_type($fields_data, $field_types, 'textarea')))
381
		{
382
			$description = implode(' ', array_slice(explode(' ', strip_tags($description)), 1, 20));
383
		}
384
385
		return $description;
386
	}
387
388
	/**
389
	 * @param array $fields_data
390
	 * @param array $field_types
391
	 * @param string $search_field
392
	 * @return string|null
393
	 */
394
	protected function get_field_value_by_type(array $fields_data, array $field_types, $search_field)
395
	{
396
		$results = array_keys($field_types, $search_field);
397
		$field = array_shift($results);
398
		
399
		return isset($fields_data[$field]) ? $fields_data[$field] : null;
400
	}
401
}
402