Completed
Pull Request — master (#32)
by Jakub
09:27
created

admin_controller::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 13
ccs 12
cts 12
cp 1
rs 9.4285
cc 1
eloc 11
nc 1
nop 10
crap 1

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
 * Advertisement management. An extension for the phpBB Forum Software package.
5
 *
6
 * @copyright (c) 2017 phpBB Limited <https://www.phpbb.com>
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace phpbb\ads\controller;
12
13
/**
14
* Admin controller
15
*/
16
class admin_controller
17
{
18
	const MAX_NAME_LENGTH = 255;
19
	const DATE_FORMAT = 'Y-m-d';
20
21
	/** @var \phpbb\template\template */
22
	protected $template;
23
24
	/** @var \phpbb\user */
25
	protected $user;
26
27
	/** @var \phpbb\request\request */
28
	protected $request;
29
30
	/** @var \phpbb\ads\ad\manager */
31
	protected $manager;
32
33
	/** @var \phpbb\ads\location\manager */
34
	protected $location_manager;
35
36
	/** @var \phpbb\log\log */
37
	protected $log;
38
39
	/** @var \phpbb\config\db_text */
40
	protected $config_text;
41
42
	/** @var \phpbb\config\config */
43
	protected $config;
44
45
	/** @var string php_ext */
46
	protected $php_ext;
47
48
	/** @var string ext_path */
49
	protected $ext_path;
50
51
	/** @var string Custom form action */
52
	protected $u_action;
53
54
	/** @var array Form validation errors */
55
	protected $errors = array();
56
57
	/**
58
	* Constructor
59
	*
60
	* @param \phpbb\template\template				$template			Template object
61
	* @param \phpbb\user							$user				User object
62
	* @param \phpbb\request\request					$request			Request object
63
	* @param \phpbb\ads\ad\manager					$manager			Advertisement manager object
64
	* @param \phpbb\ads\location\manager			$location_manager	Template location manager object
65
	* @param \phpbb\log\log							$log				The phpBB log system
66
	* @param \phpbb\config\db_text					$config_text		Config text object
67
	* @param \phpbb\config\config					$config				Config object
68
	* @param string									$php_ext			PHP extension
69
	* @param string									$ext_path			Path to this extension
70
	*/
71 38
	public function __construct(\phpbb\template\template $template, \phpbb\user $user, \phpbb\request\request $request, \phpbb\ads\ad\manager $manager, \phpbb\ads\location\manager $location_manager, \phpbb\log\log $log, \phpbb\config\db_text $config_text, \phpbb\config\config $config, $php_ext, $ext_path)
72
	{
73 38
		$this->template = $template;
74 38
		$this->user = $user;
75 38
		$this->request = $request;
76 38
		$this->manager = $manager;
77 38
		$this->location_manager = $location_manager;
78 38
		$this->log = $log;
79 38
		$this->config_text = $config_text;
80 38
		$this->config = $config;
81 38
		$this->php_ext = $php_ext;
82 38
		$this->ext_path = $ext_path;
83 38
	}
84
85
	/**
86
	* Process user request for manage mode
87
	*
88
	* @return void
89
	*/
90 6
	public function mode_manage()
91
	{
92 6
		$this->setup();
93
94
		// Trigger specific action
95 6
		$action = $this->request->variable('action', '');
96 6
		if (in_array($action, array('add', 'edit', 'enable', 'disable', 'delete')))
97 6
		{
98 5
			$this->{'action_' . $action}();
99 5
		}
100
101
		// Otherwise default to this
102 6
		$this->list_ads();
103 6
	}
104
105
	/**
106
	* Process user request for settings mode
107
	*
108
	* @return void
109
	*/
110 3
	public function mode_settings()
111
	{
112 3
		$this->setup();
113
114 3
		add_form_key('phpbb/ads/settings');
115 3
		if ($this->request->is_set_post('submit'))
116 3
		{
117
			// Validate form key
118 2
			if (!check_form_key('phpbb/ads/settings'))
119 2
			{
120 1
				$this->errors[] = $this->user->lang('FORM_INVALID');
121 1
			}
122
123 2
			if (empty($this->errors))
124 2
			{
125 1
				$this->config->set('phpbb_ads_adblocker_message', $this->request->variable('adblocker_message', 0));
126 1
				$this->config_text->set('phpbb_ads_hide_groups', json_encode($this->request->variable('hide_groups', array(0))));
127
128 1
				$this->success('ACP_AD_SETTINGS_SAVED');
129
			}
130
131 1
			$this->template->assign_vars(array(
132 1
				'S_ERROR'		=> (bool) count($this->errors),
133 1
				'ERROR_MSG'		=> count($this->errors) ? implode('<br />', $this->errors) : '',
134 1
			));
135 1
		}
136
137 2
		$hide_groups = json_decode($this->config_text->get('phpbb_ads_hide_groups'), true);
138 2
		$groups = $this->manager->load_groups();
139 2
		foreach ($groups as $group)
140
		{
141 2
			$group_name = ($group['group_type'] == GROUP_SPECIAL) ? $this->user->lang('G_' . $group['group_name']) : $group['group_name'];
142
143 2
			$this->template->assign_block_vars('groups', array(
144 2
				'ID'			=> $group['group_id'],
145 2
				'NAME'			=> $group_name,
146 2
				'S_SELECTED'	=> in_array($group['group_id'], $hide_groups),
147 2
			));
148 2
		}
149
150 2
		$this->template->assign_vars(array(
151 2
			'U_ACTION'			=> $this->u_action,
152 2
			'ADBLOCKER_MESSAGE'	=> $this->config['phpbb_ads_adblocker_message'],
153 2
		));
154 2
	}
155
156
	/**
157
	* Set page url
158
	*
159
	* @param string $u_action Custom form action
160
	* @return void
161
	*/
162 32
	public function set_page_url($u_action)
163
	{
164 32
		$this->u_action = $u_action;
165 32
	}
166
167
	/**
168
	* Get ACP page title for Ads module
169
	*
170
	* @return string	Language string for Ads ACP module
171
	*/
172 1
	public function get_page_title()
173
	{
174 1
		return $this->user->lang('ACP_PHPBB_ADS_TITLE');
175
	}
176
177
	/**
178
	* Add an advertisement
179
	*
180
	* @return void
181
	*/
182 11
	public function action_add()
183
	{
184 9
		$preview = $this->request->is_set_post('preview');
185 9
		$submit = $this->request->is_set_post('submit');
186
187 9
		add_form_key('phpbb/ads/add');
188 9
		if ($preview || $submit)
189 9
		{
190 8
			$data = $this->get_form_data('phpbb/ads/add');
191
192 View Code Duplication
			if ($preview)
193 8
			{
194 1
				$this->ad_preview($data['ad_code']);
195 1
			}
196 11
			else if (empty($this->errors))
197 7
			{
198 1
				$ad_id = $this->manager->insert_ad($data);
199 1
				$this->manager->insert_ad_locations($ad_id, $data['ad_locations']);
200
201 1
				$this->log('ADD', $data['ad_name']);
202
203 1
				$this->success('ACP_AD_ADD_SUCCESS');
204
			}
205
206 7
			$this->assign_locations($data);
207 7
			$this->assign_form_data($data);
208 7
		}
209
		else
210
		{
211 1
			$this->assign_locations();
212 1
			$this->template->assign_var('AD_PRIORITY', 5);
213
		}
214
215
		// Set output vars for display in the template
216 8
		$this->template->assign_vars(array(
217 8
			'S_ADD_AD'				=> true,
218 8
			'U_BACK'				=> $this->u_action,
219 8
			'U_ACTION'				=> "{$this->u_action}&amp;action=add",
220 8
			'PICKER_DATE_FORMAT'	=> self::DATE_FORMAT,
221 8
		));
222 8
	}
223
224
	/**
225
	* Edit an advertisement
226
	*
227
	* @return void
228
	*/
229 11
	public function action_edit()
230
	{
231 11
		$ad_id = $this->request->variable('id', 0);
232 11
		$preview = $this->request->is_set_post('preview');
233 11
		$submit = $this->request->is_set_post('submit');
234
235 11
		add_form_key('phpbb/ads/edit/' . $ad_id);
236 11
		if ($preview || $submit)
237 11
		{
238 9
			$data = $this->get_form_data('phpbb/ads/edit/' . $ad_id);
239
240
			if ($preview)
241 9
			{
242 1
				$this->ad_preview($data['ad_code']);
243 1
			}
244 View Code Duplication
			else if (empty($this->errors))
245 8
			{
246 2
				$success = $this->manager->update_ad($ad_id, $data);
247
248
				if ($success)
249 2
				{
250
					// Only insert new ad locations to DB when ad exists
251 1
					$this->manager->delete_ad_locations($ad_id);
252 1
					$this->manager->insert_ad_locations($ad_id, $data['ad_locations']);
253
254 1
					$this->log('EDIT', $data['ad_name']);
255
256 1
					$this->success('ACP_AD_EDIT_SUCCESS');
257
				}
258 1
				$this->error('ACP_AD_DOES_NOT_EXIST');
259
			}
260 7
		}
261
		else
262
		{
263
			// Load ad data
264 2
			$data = $this->manager->get_ad($ad_id);
265 2
			if (empty($data))
266 2
			{
267 1
				$this->error('ACP_AD_DOES_NOT_EXIST');
268
			}
269
270
			// Load ad template locations
271 1
			$data['ad_locations'] = $this->manager->get_ad_locations($ad_id);
272
		}
273
274
		// Set output vars for display in the template
275 8
		$this->template->assign_vars(array(
276 8
			'S_EDIT_AD'				=> true,
277 8
			'EDIT_ID'				=> $ad_id,
278 8
			'U_BACK'				=> $this->u_action,
279 8
			'U_ACTION'				=> "{$this->u_action}&amp;action=edit&amp;id=" . $ad_id,
280 8
			'PICKER_DATE_FORMAT'	=> self::DATE_FORMAT,
281 8
		));
282 8
		$this->assign_locations($data);
283 8
		$this->assign_form_data($data);
284 8
	}
285
286
	/**
287
	* Enable an advertisement
288
	*
289
	* @return void
290
	*/
291 3
	public function action_enable()
292
	{
293 3
		$this->ad_enable(true);
294 1
	}
295
296
	/**
297
	* Disable an advertisement
298
	*
299
	* @return void
300
	*/
301 3
	public function action_disable()
302
	{
303 3
		$this->ad_enable(false);
304 1
	}
305
306
	/**
307
	* Delete an advertisement
308
	*
309
	* @return void
310
	*/
311 3
	public function action_delete()
312
	{
313 3
		$ad_id = $this->request->variable('id', 0);
314
		if ($ad_id)
315 3
		{
316 3
			if (confirm_box(true))
317 3
			{
318
				// Get ad data so that we can log ad name
319 2
				$ad_data = $this->manager->get_ad($ad_id);
320
321
				// Delete ad and it's template locations
322 2
				$this->manager->delete_ad_locations($ad_id);
323 2
				$success = $this->manager->delete_ad($ad_id);
324
325
				// Only notify user on error or if not ajax
326 2
				if (!$success)
327 2
				{
328 1
					$this->error('ACP_AD_DELETE_ERRORED');
329
				}
330
				else
331
				{
332 1
					$this->log('DELETE', $ad_data['ad_name']);
333
334 1
					if (!$this->request->is_ajax())
335 1
					{
336 1
						$this->success('ACP_AD_DELETE_SUCCESS');
337
					}
338
				}
339
			}
340
			else
341
			{
342 1
				confirm_box(false, $this->user->lang('CONFIRM_OPERATION'), build_hidden_fields(array(
343 1
					'id'		=> $ad_id,
344 1
					'i'			=> $this->request->variable('i', ''),
345 1
					'mode'		=> $this->request->variable('mode', ''),
346
					'action'	=> 'delete'
347 1
				)));
348
			}
349 1
		}
350 1
	}
351
352
	/**
353
	* Display the ads
354
	*
355
	* @return void
356
	*/
357 1
	public function list_ads()
358
	{
359 1
		foreach ($this->manager->get_all_ads() as $row)
360
		{
361 1
			$ad_enabled = (int) $row['ad_enabled'];
362 1
			$ad_end_date = (int) $row['ad_end_date'];
363 1
			$ad_expired = $ad_end_date > 0 && $ad_end_date < time();
364 1
			if ($ad_expired && $ad_enabled)
365 1
			{
366 1
				$ad_enabled = 0;
367 1
				$this->manager->update_ad($row['ad_id'], array('ad_enabled' => 0));
368 1
			}
369
370 1
			$this->template->assign_block_vars('ads', array(
371 1
				'NAME'					=> $row['ad_name'],
372 1
				'END_DATE'				=> $ad_end_date ? $this->user->format_date($ad_end_date, self::DATE_FORMAT) : '',
373 1
				'S_END_DATE_EXPIRED'	=> $ad_expired,
374 1
				'S_ENABLED'				=> $ad_enabled,
375 1
				'U_ENABLE'				=> $this->u_action . '&amp;action=' . ($ad_enabled ? 'disable' : 'enable') . '&amp;id=' . $row['ad_id'],
376 1
				'U_EDIT'				=> $this->u_action . '&amp;action=edit&amp;id=' . $row['ad_id'],
377 1
				'U_DELETE'				=> $this->u_action . '&amp;action=delete&amp;id=' . $row['ad_id'],
378 1
			));
379 1
		}
380
381
		// Set output vars for display in the template
382 1
		$this->template->assign_var('U_ACTION_ADD', $this->u_action . '&amp;action=add');
383 1
	}
384
385
	/**
386
	* Perform general tasks
387
	*
388
	* @return void
389
	*/
390 9
	protected function setup()
391
	{
392 9
		$this->user->add_lang_ext('phpbb/ads', 'acp');
393
394 9
		$this->template->assign_var('S_PHPBB_ADS', true);
395 9
	}
396
397
	/**
398
	* Enable/disable an advertisement
399
	*
400
	* @param	bool	$enable	Enable or disable the advertisement?
401
	* @return void
402
	*/
403 4
	protected function ad_enable($enable)
404
	{
405 4
		$ad_id = $this->request->variable('id', 0);
406
407 4
		$success = $this->manager->update_ad($ad_id, array(
408 4
			'ad_enabled'	=> (int) $enable,
409 4
		));
410
411
		// If AJAX was used, show user a result message
412 4
		if ($this->request->is_ajax())
413 4
		{
414
			$json_response = new \phpbb\json_response;
415
			$json_response->send(array(
416
				'text'	=> $this->user->lang($enable ? 'ENABLED' : 'DISABLED'),
417
				'title'	=> $this->user->lang('AD_ENABLE_TITLE', (int) $enable),
418
			));
419
		}
420
421
		// Otherwise, show traditional infobox
422
		if ($success)
423 4
		{
424 2
			$this->success($enable ? 'ACP_AD_ENABLE_SUCCESS' : 'ACP_AD_DISABLE_SUCCESS');
425
		}
426
		else
427
		{
428 2
			$this->error($enable ? 'ACP_AD_ENABLE_ERRORED' : 'ACP_AD_DISABLE_ERRORED');
429
		}
430
	}
431
432
	/**
433
	* Get admin form data.
434
	*
435
	* @param	string	$form_name	The form name.
436
	* @return	array	Form data
437
	*/
438 17
	protected function get_form_data($form_name)
439
	{
440
		$data = array(
441 17
			'ad_name'		=> $this->request->variable('ad_name', '', true),
442 17
			'ad_note'		=> $this->request->variable('ad_note', '', true),
443 17
			'ad_code'		=> $this->request->variable('ad_code', '', true),
444 17
			'ad_enabled'	=> $this->request->variable('ad_enabled', 0),
445 17
			'ad_locations'	=> $this->request->variable('ad_locations', array('')),
446 17
			'ad_end_date'	=> $this->request->variable('ad_end_date', ''),
447 17
			'ad_priority'	=> $this->request->variable('ad_priority', 5),
448 17
		);
449
450
		// Validate form key
451 17
		if (!check_form_key($form_name))
452 17
		{
453 2
			$this->errors[] = $this->user->lang('FORM_INVALID');
454 2
		}
455
456
		// Validate ad name
457 17
		if ($data['ad_name'] === '')
458 17
		{
459 2
			$this->errors[] = $this->user->lang('AD_NAME_REQUIRED');
460 2
		}
461 17
		if (truncate_string($data['ad_name'], self::MAX_NAME_LENGTH) !== $data['ad_name'])
462 17
		{
463 2
			$this->errors[] = $this->user->lang('AD_NAME_TOO_LONG', self::MAX_NAME_LENGTH);
464 2
		}
465
466
		// Validate ad end date
467 17
		if (preg_match('#^\d{4}\-\d{2}\-\d{2}$#', $data['ad_end_date']))
468 17
		{
469 4
			$data['ad_end_date'] = (int) $this->user->get_timestamp_from_format(self::DATE_FORMAT, $data['ad_end_date']);
470
471 4
			if ($data['ad_end_date'] < time())
472 4
			{
473 2
				$this->errors[] = $this->user->lang('AD_END_DATE_INVALID');
474 2
			}
475 4
		}
476 13
		else if ($data['ad_end_date'] !== '')
477 13
		{
478
			$this->errors[] = $this->user->lang('AD_END_DATE_INVALID');
479
		}
480
		else
481
		{
482 13
			$data['ad_end_date'] = 0;
483
		}
484
485
		// Validate ad priority
486 17
		if ($data['ad_priority'] < 1 || $data['ad_priority'] > 10)
487 17
		{
488 6
			$this->errors[] = $this->user->lang('AD_PRIORITY_INVALID');
489 6
		}
490
491 17
		return $data;
492
	}
493
494
	/**
495
	* Assign form data to the template.
496
	*
497
	* @param	array	$data	The form data.
498
	* @return void
499
	*/
500 15
	protected function assign_form_data($data)
501
	{
502 15
		$this->template->assign_vars(array(
503 15
			'S_ERROR'		=> (bool) count($this->errors),
504 15
			'ERROR_MSG'		=> count($this->errors) ? implode('<br />', $this->errors) : '',
505
506 15
			'AD_NAME'		=> $data['ad_name'],
507 15
			'AD_NOTE'		=> $data['ad_note'],
508 15
			'AD_CODE'		=> $data['ad_code'],
509 15
			'AD_ENABLED'	=> $data['ad_enabled'],
510 15
			'AD_END_DATE'	=> $this->prepare_end_date($data['ad_end_date']),
511 15
			'AD_PRIORITY'	=> $data['ad_priority'],
512 15
		));
513 15
	}
514
515
	/**
516
	* Prepare end date for display
517
	*
518
	* @param	mixed	$end_date	End date.
519
	* @return	string	End date prepared for display.
520
	*/
521 15
	protected function prepare_end_date($end_date)
522
	{
523 15
		if (empty($end_date))
524 15
		{
525 12
			return '';
526
		}
527
528 3
		if (is_numeric($end_date))
529 3
		{
530 3
			return $this->user->format_date($end_date, self::DATE_FORMAT);
531
		}
532
533
		return (string) $end_date;
534
	}
535
536
	/**
537
	* Assign template locations data to the template.
538
	*
539
	* @param	mixed	$data	The form data or nothing.
540
	* @return	void
541
	*/
542 16
	protected function assign_locations($data = false)
543
	{
544 16
		foreach ($this->location_manager->get_all_locations() as $location_id => $location_data)
545
		{
546 16
			$this->template->assign_block_vars('ad_locations', array(
547 16
				'LOCATION_ID'	=> $location_id,
548 16
				'LOCATION_DESC'	=> $location_data['desc'],
549 16
				'LOCATION_NAME'	=> $location_data['name'],
550 16
				'S_SELECTED'	=> $data ? in_array($location_id, $data['ad_locations']) : false,
551 16
			));
552 16
		}
553 16
	}
554
555
	/**
556
	* Prepare advertisement preview
557
	*
558
	* @param	string	$code	Ad code to preview
559
	* @return	void
560
	*/
561 2
	protected function ad_preview($code)
562
	{
563 2
		$this->template->assign_var('PREVIEW', htmlspecialchars_decode($code));
564 2
	}
565
566
	/**
567
	* Print success message.
568
	*
569
	* It takes arguments in the form of a language key, followed by language substitution values.
570
	*/
571 6
	protected function success()
572
	{
573 6
		trigger_error(call_user_func_array(array($this->user, 'lang'), func_get_args()) . adm_back_link($this->u_action));
574
	}
575
576
	/**
577
	* Print error message.
578
	*
579
	* It takes arguments in the form of a language key, followed by language substitution values.
580
	*/
581 5
	protected function error()
582
	{
583 5
		trigger_error(call_user_func_array(array($this->user, 'lang'), func_get_args()) . adm_back_link($this->u_action), E_USER_WARNING);
584
	}
585
586
	/**
587
	* Log action
588
	*
589
	* @param	string	$action		Performed action in uppercase
590
	* @param	string	$ad_name	Advertisement name
591
	* @return	void
592
	*/
593 3
	protected function log($action, $ad_name)
594
	{
595 3
		$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'ACP_PHPBB_ADS_' . $action . '_LOG', time(), array($ad_name));
596 3
	}
597
}
598