Passed
Push — master ( 2cbce6...df1132 )
by Matt
01:34
created

acp_controller::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 10
dl 0
loc 12
rs 9.9332
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
 * Advanced BBCode Box
5
 *
6
 * @copyright (c) 2020, 2023 Matt Friedman
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace vse\abbc3\controller;
12
13
use phpbb\cache\driver\driver_interface as cache;
0 ignored issues
show
Bug introduced by
The type phpbb\cache\driver\driver_interface 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...
14
use phpbb\config\config;
0 ignored issues
show
Bug introduced by
The type phpbb\config\config 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...
15
use phpbb\config\db_text;
0 ignored issues
show
Bug introduced by
The type phpbb\config\db_text 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...
16
use phpbb\db\driver\driver_interface as db;
0 ignored issues
show
Bug introduced by
The type phpbb\db\driver\driver_interface 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...
17
use phpbb\extension\manager as ext_manager;
0 ignored issues
show
Bug introduced by
The type phpbb\extension\manager 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...
18
use phpbb\language\language;
0 ignored issues
show
Bug introduced by
The type phpbb\language\language 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...
19
use phpbb\request\request;
0 ignored issues
show
Bug introduced by
The type phpbb\request\request 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...
20
use phpbb\template\template;
0 ignored issues
show
Bug introduced by
The type phpbb\template\template 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...
21
22
class acp_controller
23
{
24
	/** @var cache */
25
	protected $cache;
26
27
	/** @var config */
28
	protected $config;
29
30
	/** @var db_text */
31
	protected $config_text;
32
33
	/** @var db */
34
	protected $db;
35
36
	/** @var ext_manager */
37
	protected $ext_manager;
38
39
	/** @var language */
40
	protected $language;
41
42
	/** @var request */
43
	protected $request;
44
45
	/** @var template */
46
	protected $template;
47
48
	/** @var string */
49
	protected $parser_key;
50
51
	/** @var string */
52
	protected $renderer_key;
53
54
	/** @var string */
55
	public $u_action;
56
57
	/** @var array */
58
	protected $errors = [];
59
60
	/**
61
	 * Constructor
62
	 *
63
	 * @param cache $cache
64
	 * @param config $config
65
	 * @param db_text $db_text
66
	 * @param db $db
67
	 * @param ext_manager $ext_manager
68
	 * @param language $language
69
	 * @param request $request
70
	 * @param template $template
71
	 * @param $parser_key
72
	 * @param $renderer_key
73
	 */
74
	public function __construct(cache $cache, config $config, db_text $db_text, db $db, ext_manager $ext_manager, language $language, request $request, template $template, $parser_key, $renderer_key)
75
	{
76
		$this->cache = $cache;
77
		$this->config = $config;
78
		$this->config_text = $db_text;
79
		$this->db = $db;
80
		$this->ext_manager = $ext_manager;
81
		$this->language = $language;
82
		$this->request = $request;
83
		$this->template = $template;
84
		$this->parser_key = $parser_key;
85
		$this->renderer_key = $renderer_key;
86
	}
87
88
	/**
89
	 * Main handler for this controller
90
	 *
91
	 * @throws \RuntimeException
92
	 */
93
	public function handle()
94
	{
95
		$this->language->add_lang('acp_abbc3', 'vse/abbc3');
96
97
		$form_key = 'vse/abbc3';
98
		add_form_key($form_key);
0 ignored issues
show
Bug introduced by
The function add_form_key was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

98
		/** @scrutinizer ignore-call */ 
99
  add_form_key($form_key);
Loading history...
99
100
		if ($this->request->is_set_post('submit'))
101
		{
102
			if (!check_form_key($form_key))
0 ignored issues
show
Bug introduced by
The function check_form_key was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

102
			if (!/** @scrutinizer ignore-call */ check_form_key($form_key))
Loading history...
103
			{
104
				throw new \RuntimeException($this->language->lang('FORM_INVALID'), E_USER_WARNING);
105
			}
106
107
			$this->save_settings();
108
		}
109
110
		$this->display_settings();
111
	}
112
113
	/**
114
	 * Add settings template vars to the form
115
	 */
116
	protected function display_settings()
117
	{
118
		$this->template->assign_vars([
119
			'S_ABBC3_PIPES'			=> $this->config['abbc3_pipes'],
120
			'S_ABBC3_BBCODE_BAR'	=> $this->config['abbc3_bbcode_bar'],
121
			'S_ABBC3_QR_BBCODES'	=> $this->config['abbc3_qr_bbcodes'],
122
			'S_ABBC3_AUTO_VIDEO'	=> $this->config['abbc3_auto_video'],
123
			'S_ABBC3_ICONS_TYPE'	=> build_select(['png' => 'PNG', 'svg' => 'SVG'], $this->config['abbc3_icons_type']),
0 ignored issues
show
Bug introduced by
The function build_select was not found. Maybe you did not declare it correctly or list all dependencies? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

123
			'S_ABBC3_ICONS_TYPE'	=> /** @scrutinizer ignore-call */ build_select(['png' => 'PNG', 'svg' => 'SVG'], $this->config['abbc3_icons_type']),
Loading history...
124
			'S_ABBC3_GOOGLE_FONTS'	=> $this->get_google_fonts(),
125
			'S_ABBC3_MEDIA_EMBED'	=> $this->ext_manager->is_enabled('phpbb/mediaembed'),
126
			'U_ACTION'				=> $this->u_action,
127
		]);
128
	}
129
130
	/**
131
	 * Save settings data to the database
132
	 *
133
	 * @throws \RuntimeException
134
	 */
135
	protected function save_settings()
136
	{
137
		$this->config->set('abbc3_bbcode_bar', $this->request->variable('abbc3_bbcode_bar', 0));
138
		$this->config->set('abbc3_qr_bbcodes', $this->request->variable('abbc3_qr_bbcodes', 0));
139
		$this->config->set('abbc3_auto_video', $this->request->variable('abbc3_auto_video', 0));
140
		$this->config->set('abbc3_icons_type', $this->request->variable('abbc3_icons_type', 'png'));
141
		$this->save_pipes();
142
		$this->save_google_fonts();
143
144
		$this->cache->destroy($this->parser_key);
145
		$this->cache->destroy($this->renderer_key);
146
147
		if (!empty($this->errors))
148
		{
149
			throw new \RuntimeException(implode('<br>', $this->errors), E_USER_WARNING);
150
		}
151
152
		throw new \RuntimeException($this->language->lang('CONFIG_UPDATED'), E_USER_NOTICE);
153
	}
154
155
	/**
156
	 * Save the Pipes Table setting.
157
	 * - Set the config
158
	 * - Show or hide the Pipes BBCode button
159
	 * - Purge BBCode caches.
160
	 */
161
	protected function save_pipes()
162
	{
163
		$enable_pipes = $this->request->variable('abbc3_pipes', 0);
164
165
		$this->config->set('abbc3_pipes', $enable_pipes);
166
167
		$sql = 'UPDATE ' . BBCODES_TABLE . '
0 ignored issues
show
Bug introduced by
The constant vse\abbc3\controller\BBCODES_TABLE was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
168
			SET display_on_posting = ' . (int) $enable_pipes . "
169
			WHERE bbcode_tag = 'pipes'";
170
		$this->db->sql_query($sql);
171
	}
172
173
	/**
174
	 * Get the Google font setting data and format it for the form.
175
	 *
176
	 * @return string
177
	 */
178
	protected function get_google_fonts()
179
	{
180
		$fonts = json_decode($this->config_text->get('abbc3_google_fonts'), true);
181
		return $fonts ? implode("\n", $fonts) : '';
182
	}
183
184
	/**
185
	 * Save the Google fonts setting.
186
	 * - If field has data, explode it to an array and save as JSON data.
187
	 * - If field is empty, store just an empty string.
188
	 */
189
	protected function save_google_fonts()
190
	{
191
		$fonts = $this->request->variable('abbc3_google_fonts', '');
192
		$fonts = explode("\n", $fonts);
193
		$this->validate_google_fonts($fonts);
194
		$this->config_text->set('abbc3_google_fonts', json_encode($fonts));
195
	}
196
197
	/**
198
	 * Validate Google Font names provided link to a CSS file
199
	 *
200
	 * @param array $fonts
201
	 */
202
	protected function validate_google_fonts(&$fonts)
203
	{
204
		foreach ($fonts as $key => $font)
205
		{
206
			if (empty($font) || $this->valid_url('https://fonts.googleapis.com/css?family=' . urlencode($font)))
207
			{
208
				continue;
209
			}
210
211
			$this->errors[] = $this->language->lang('ABBC3_INVALID_FONT', $font);
212
			unset($fonts[$key]);
213
		}
214
	}
215
216
	/**
217
	 * Check for valid URL headers if possible
218
	 *
219
	 * @param string $url
220
	 * @return bool Return false only if URL could be checked and wasn't found, otherwise true.
221
	 */
222
	protected function valid_url($url)
223
	{
224
		if (!function_exists('get_headers'))
225
		{
226
			return true;
227
		}
228
229
		$headers = @get_headers($url);
230
		return !$headers || stripos($headers[0], '200 OK') !== false;
231
	}
232
233
	/**
234
	 * Set the u_action variable
235
	 *
236
	 * @param string $u_action
237
	 * @return acp_controller
238
	 */
239
	public function set_u_action($u_action)
240
	{
241
		$this->u_action = $u_action;
242
		return $this;
243
	}
244
}
245