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

base_view::get_field_name()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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