Completed
Push — master ( b9932d...5e979e )
by Erwan
10s
created

main_module::_copy_permission()   B

Complexity

Conditions 6
Paths 18

Size

Total Lines 46
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 46
rs 8.4751
c 0
b 0
f 0
cc 6
eloc 25
nc 18
nop 3
1
<?php
2
/**
3
 *
4
 * @package Quick Title Edition Extension
5
 * @copyright (c) 2015 ABDev
6
 * @copyright (c) 2015 PastisD
7
 * @copyright (c) 2015 Geolim4 <http://geolim4.com>
8
 * @copyright (c) 2015 Zoddo <[email protected]>
9
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
10
 *
11
 */
12
13
namespace ernadoo\qte\acp;
14
15
class main_module
16
{
17
	/** @var string */
18
	public $u_action;
19
20
	/** @var \ernadoo\qte\qte */
21
	protected $qte;
22
23
	/** @var \phpbb\db\migration\tool\permission */
24
	protected $migrator_tool_permission;
25
26
	public function main($id, $mode)
27
	{
28
		global $phpbb_container, $db, $user, $phpbb_log, $template, $cache, $request, $table_prefix;
29
30
		$this->qte						= $phpbb_container->get('ernadoo.qte');
31
		$this->migrator_tool_permission	= $phpbb_container->get('migrator.tool.permission');
32
33
		$action			= $request->variable('action', '');
34
		$submit			= $request->is_set_post('submit');
35
		$attr_id		= $request->variable('id', 0);
36
		$attr_auth_id	= $request->variable('attr_auth_id', 0);
37
38
		$error = array();
39
		$clear_dest_perms = false;
40
41
		$this->tpl_name		= 'acp_attributes';
0 ignored issues
show
Bug introduced by
The property tpl_name does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
42
		$this->page_title	= 'QTE_MANAGE_TITLE';
0 ignored issues
show
Bug introduced by
The property page_title does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
43
44
		$user->add_lang_ext('ernadoo/qte', array('attributes', 'attributes_acp'));
45
46
		// Display a warning when a development version is installed or if the database is outdated
47
		$this->display_version_warning();
48
49
		add_form_key('acp_attributes');
50
51
		switch ($action)
52
		{
53
			case 'edit':
54
			case 'add':
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
55
56
				$attr_type = $request->variable('attr_type', 0);
57
				$attr_name = $request->variable('attr_name', '', true);
58
				$attr_img = $request->variable('attr_img', '');
59
				$attr_desc = $request->variable('attr_desc', '', true);
60
				$attr_date = $request->variable('attr_date', '');
61
				$attr_colour = $request->variable('attr_colour', '');
62
				$attr_user_colour = $request->variable('attr_user_colour', 0);
63
64
				if ($submit)
65
				{
66
					if (!check_form_key('acp_attributes'))
67
					{
68
						$error[] = $user->lang['FORM_INVALID'];
69
					}
70
71
					if (empty($attr_name))
72
					{
73
						$error[] = $user->lang['QTE_NAME_ERROR'];
74
					}
75
76
					if (isset($attr_desc[60]))
77
					{
78
						$error[] = $user->lang['QTE_DESC_ERROR'];
79
					}
80
81
					// fully xhtml compatibility : no capital letters
82
					if (!empty($attr_colour))
83
					{
84
						$attr_colour = strtolower($attr_colour);
85
						if (!preg_match('#^([a-f0-9]){6}#i', $attr_colour))
86
						{
87
							$error[] = $user->lang['QTE_COLOUR_ERROR'];
88
						}
89
					}
90
91
					// we don't need user colour when an image is used as attribute
92
					if ($attr_type && $attr_user_colour)
93
					{
94
						$attr_user_colour = false;
95
					}
96
97
					$attr_name_tmp = $user->lang($attr_name);
98
					if ($attr_user_colour)
99
					{
100
						if (strpos($attr_name_tmp, '%mod%') === false)
101
						{
102
							$error[] = $user->lang['QTE_USER_COLOUR_ERROR'];
103
						}
104
					}
105
106
					if (!empty($attr_date))
107
					{
108
						if (strpos($attr_name_tmp, '%date%') === false)
109
						{
110
							$error[] = $user->lang['QTE_DATE_ARGUMENT_ERROR'];
111
						}
112
					}
113
					else
114
					{
115
						if (strpos($attr_name_tmp, '%date%') !== false)
116
						{
117
							$error[] = $user->lang['QTE_DATE_FORMAT_ERROR'];
118
						}
119
					}
120
					unset($attr_name_tmp);
121
122
					if (!sizeof($error))
123
					{
124
						$sql_ary = array(
125
							'attr_type' => $attr_type,
126
							'attr_name' => $attr_name,
127
							'attr_img' => $attr_img,
128
							'attr_desc' => $attr_desc,
129
							'attr_date' => $attr_date,
130
							'attr_colour' => $attr_colour,
131
							'attr_user_colour' => $attr_user_colour,
132
						);
133
134
						if ($attr_id)
135
						{
136
							$sql = 'UPDATE ' . $table_prefix . 'topics_attr
137
								SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
138
								WHERE attr_id = ' . (int) $attr_id;
139
							$db->sql_query($sql);
140
141
							$clear_dest_perms = true;
142
							$message = 'UPDATED';
143
						}
144
						else
145
						{
146
							$sql = 'SELECT MAX(right_id) AS right_id
147
								FROM ' . $table_prefix . 'topics_attr';
148
							$result = $db->sql_query($sql);
149
							$right_id = (int) $db->sql_fetchfield('right_id');
150
							$db->sql_freeresult($result);
151
152
							$sql_ary['left_id'] = ($right_id + 1);
153
							$sql_ary['right_id'] = ($right_id + 2);
154
155
							$sql = 'INSERT INTO ' . $table_prefix . 'topics_attr ' . $db->sql_build_array('INSERT', $sql_ary);
156
							$db->sql_query($sql);
157
							$attr_id = $db->sql_nextid();
158
159
							$this->migrator_tool_permission->add('f_qte_attr_'.$attr_id, false);
160
161
							$message = 'ADDED';
162
						}
163
164
						if ($attr_auth_id)
165
						{
166
							$this->_copy_permission('f_qte_attr_'.$attr_id, 'f_qte_attr_'.$attr_auth_id, $clear_dest_perms);
167
						}
168
169
						$cache->destroy('_attr');
170
171
						$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTRIBUTE_' . $message, time(), array($attr_name));
172
173
						trigger_error($user->lang['QTE_' . $message] . adm_back_link($this->u_action));
174
					}
175
				}
176
				else if ($attr_id)
177
				{
178
					$attr = $this->_get_attr_info($attr_id);
179
				}
180
181
				if ($action == 'edit')
182
				{
183
					$template->assign_vars(array(
184
						'L_QTE_ADD_EDIT' => $user->lang['QTE_EDIT'],
185
						'L_QTE_ADD_EDIT_EXPLAIN' => $user->lang['QTE_EDIT_EXPLAIN'],
186
					));
187
				}
188
				else
189
				{
190
					$template->assign_vars(array(
191
						'L_QTE_ADD_EDIT' => $user->lang['QTE_ADD'],
192
						'L_QTE_ADD_EDIT_EXPLAIN' => $user->lang['QTE_ADD_EXPLAIN'],
193
					));
194
				}
195
196
				$this->qte_attr_select($attr_id);
197
198
				if (sizeof($error))
199
				{
200
					$template->assign_vars(array(
201
						'S_ERROR' => true,
202
						'ERROR_MSG' => implode('<br />', $error),
203
					));
204
				}
205
206
				$attr_type_state = ((isset($attr['attr_type']) && $attr['attr_type']) || (isset($attr_type) && $attr_type));
0 ignored issues
show
Bug introduced by
The variable $attr does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
207
				$attr_user_colour_state = ((isset($attr['attr_user_colour']) && $attr['attr_user_colour']) || (isset($attr_user_colour) && $attr_user_colour));
208
209
				$template->assign_vars(array(
210
					'S_EDIT' => true,
211
212
					'U_ACTION' => $this->u_action . '&amp;action=' . (($action == 'add') ? 'add' : 'edit&amp;id=' . (int) $attr_id),
213
					'U_BACK' => $this->u_action,
214
					'U_AJAX' => str_replace('&amp;', '&', $this->u_action),
215
216
					'L_QTE_NAME_EXPLAIN' => $user->lang('QTE_NAME_EXPLAIN', $user->data['username']),
217
218
					'ATTR_ID' => isset($attr['attr_id']) ? $attr['attr_id'] : $attr_id,
219
					'ATTR_NAME' => isset($attr['attr_name']) ? $attr['attr_name'] : $attr_name,
220
					'ATTR_IMG' => isset($attr['attr_img']) ? $attr['attr_img'] : $attr_img,
221
					'ATTR_DESC' => isset($attr['attr_desc']) ? $attr['attr_desc'] : $attr_desc,
222
					'ATTR_DATE' => isset($attr['attr_date']) ? $attr['attr_date'] : $attr_date,
223
					'ATTR_COLOUR' => isset($attr['attr_colour']) ? $attr['attr_colour'] : $attr_colour,
224
225
					'S_TEXT' => $attr_type_state ? true : false,
226
					'S_USER_COLOUR' => $attr_user_colour_state ? true : false,
227
228
				));
229
230
				return;
231
232
			break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
233
234
			case 'delete':
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
235
236 View Code Duplication
				if (!$attr_id)
237
				{
238
					trigger_error($user->lang['QTE_MUST_SELECT'] . adm_back_link($this->u_action), E_USER_WARNING);
239
				}
240
241
				if (confirm_box(true))
242
				{
243
					$sql = 'SELECT topic_id, topic_attr_id
244
						FROM ' . TOPICS_TABLE . '
245
						WHERE topic_attr_id = ' . (int) $attr_id;
246
					$result = $db->sql_query($sql);
247
248
					$topic_id_ary = array();
249
					while ($row = $db->sql_fetchrow($result))
250
					{
251
						$topic_id_ary[] = (int) $row['topic_id'];
252
					}
253
					$db->sql_freeresult($result);
254
255
					if (sizeof($topic_id_ary))
256
					{
257
						$fields = array('topic_attr_id' => 0, 'topic_attr_user' => 0, 'topic_attr_time' => 0);
258
259
						$sql = 'UPDATE ' . TOPICS_TABLE . '
260
							SET ' . $db->sql_build_array('UPDATE', $fields) . '
261
							WHERE ' . $db->sql_in_set('topic_id', array_map('intval', $topic_id_ary));
262
						$db->sql_query($sql);
263
					}
264
265
					$sql = 'SELECT attr_name
266
						FROM ' . $table_prefix . 'topics_attr
267
						WHERE attr_id = ' . (int) $attr_id;
268
					$result = $db->sql_query($sql);
269
					$attr_name = (string) $db->sql_fetchfield('attr_name');
270
					$db->sql_freeresult($result);
271
272
					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTRIBUTE_REMOVED', time(), array($attr_name));
273
274
					$this->migrator_tool_permission->remove('f_qte_attr_'.$attr_id, false);
275
276
					$sql = 'DELETE FROM ' . $table_prefix . 'topics_attr
277
						WHERE attr_id = ' . (int) $attr_id;
278
					$db->sql_query($sql);
279
280
					$cache->destroy('_attr');
281
282
					if ($request->is_ajax())
283
					{
284
						$json_response = new \phpbb\json_response;
285
						$json_response->send(array(
286
							'success' => 'true',
287
							'MESSAGE_TITLE' => $user->lang['INFORMATION'],
288
							'MESSAGE_TEXT' => $user->lang['QTE_REMOVED'],
289
							'REFRESH_DATA' => array(
290
								'time'	=> 3,
291
							)
292
						));
293
					}
294
					else
295
					{
296
						trigger_error($user->lang['QTE_REMOVED'] . adm_back_link($this->u_action));
297
					}
298
				}
299
				else
300
				{
301
					confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
302
						'i' => $id,
303
						'mode' => $mode,
304
						'attr_id' => $attr_id,
305
						'action' => 'delete',
306
					)));
307
				}
308
309
			break;
310
311
			case 'move_up':
312
			case 'move_down':
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
313
314 View Code Duplication
				if (!$attr_id)
315
				{
316
					trigger_error($user->lang['QTE_MUST_SELECT'] . adm_back_link($this->u_action), E_USER_WARNING);
317
				}
318
319
				$sql = 'SELECT *
320
					FROM ' . $table_prefix . 'topics_attr
321
					WHERE attr_id = ' . (int) $attr_id;
322
				$result = $db->sql_query($sql);
323
				$row = $db->sql_fetchrow($result);
324
				$db->sql_freeresult($result);
325
326 View Code Duplication
				if (!$row)
327
				{
328
					trigger_error($user->lang['QTE_MUST_SELECT'] . adm_back_link($this->u_action), E_USER_WARNING);
329
				}
330
331
				$move_attr_name = $this->qte_move($row, $action, 1);
332
				if ($move_attr_name !== false)
333
				{
334
					$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_ATTRIBUTE_' . strtoupper($action), time(), array($move_attr_name));
335
				}
336
337
				if ($request->is_ajax())
338
				{
339
					$json_response = new \phpbb\json_response;
340
					$json_response->send(array('success' => true));
341
				}
342
343
			break;
344
		}
345
346
		$template->assign_vars(array('U_ACTION' => $this->u_action));
347
348
		$sql = 'SELECT topic_attr_id, COUNT(topic_id) AS total_topics
349
			FROM ' . TOPICS_TABLE . '
350
			GROUP BY topic_attr_id';
351
		$result = $db->sql_query($sql);
352
		$stats = array();
353
		$total_topics = 0;
354
		while ($row = $db->sql_fetchrow($result))
355
		{
356
			$stats[$row['topic_attr_id']] = $row['total_topics'];
357
			$total_topics += $row['total_topics'];
358
		}
359
		$db->sql_freeresult($result);
360
361
		$sql = 'SELECT * FROM ' . $table_prefix . 'topics_attr ORDER BY left_id';
362
		$result = $db->sql_query($sql);
363
364
		while ($row = $db->sql_fetchrow($result))
365
		{
366
			$attribute_name = str_replace(array('%mod%', '%date%'), array($user->lang['QTE_KEY_USERNAME'], $user->lang['QTE_KEY_DATE']), $user->lang($row['attr_name']));
367
			$attribute_count = isset($stats[$row['attr_id']]) ? $stats[$row['attr_id']] : 0;
368
369
			$template->assign_block_vars('row', array(
370
				'S_IMAGE' => $row['attr_type'] ? true : false,
371
				'S_COLOUR' => $row['attr_colour'] ? true : false,
372
				'S_DESC' => $row['attr_desc'] ? true : false,
373
				'S_DATE' => $row['attr_date'] ? true : false,
374
				'S_USER_COLOUR' => $row['attr_user_colour'] ? true : false,
375
				'S_CSS' => (!$row['attr_type'] && isset($user->lang[$row['attr_name']]) && empty($row['attr_colour'])) ? true : false,
376
377
				'QTE_TXT' => $attribute_name,
378
				'QTE_DESC' => $user->lang($row['attr_desc']),
379
				'QTE_IMG' => $this->qte->attr_img_key($row['attr_img'], $attribute_name),
380
				'QTE_COLOUR' => $row['attr_colour'],
381
				'QTE_DATE' => $row['attr_date'],
382
				'QTE_COUNT' => (int) $attribute_count,
383
				'QTE_PER_CENT' => empty($total_topics) ? 0 : round(intval($attribute_count) * 100 / $total_topics),
384
385
				'U_EDIT' => $this->u_action . '&amp;action=edit&amp;id=' . $row['attr_id'],
386
				'U_MOVE_UP' => $this->u_action . '&amp;action=move_up&amp;id=' . $row['attr_id'],
387
				'U_MOVE_DOWN' => $this->u_action . '&amp;action=move_down&amp;id=' . $row['attr_id'],
388
				'U_DELETE' => $this->u_action . '&amp;action=delete&amp;id=' . $row['attr_id'],
389
			));
390
		}
391
		$db->sql_freeresult($result);
392
	}
393
394
	protected function _get_attr_info($attr_id)
395
	{
396
		global $db, $table_prefix;
397
398
		$sql = 'SELECT * FROM ' . $table_prefix . 'topics_attr WHERE attr_id = ' . (int) $attr_id;
399
		$result = $db->sql_query($sql);
400
		$attr = $db->sql_fetchrow($result);
401
		$db->sql_freeresult($result);
402
403
		return $attr;
404
	}
405
406
	protected function qte_move($attr_row, $action = 'move_up', $steps = 1)
407
	{
408
		global $db, $table_prefix;
409
410
		$sql = 'SELECT attr_id, attr_name, left_id, right_id
411
			FROM ' . $table_prefix . "topics_attr
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal topics_attr\n WHERE does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
412
			WHERE " . (($action == 'move_up') ? "right_id < {$attr_row['right_id']} ORDER BY right_id DESC" : "left_id > {$attr_row['left_id']} ORDER BY left_id ASC");
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $attr_row instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
413
		$result = $db->sql_query_limit($sql, $steps);
414
415
		$target = array();
416
		while ($row = $db->sql_fetchrow($result))
417
		{
418
			$target = $row;
419
		}
420
		$db->sql_freeresult($result);
421
422
		if (!sizeof($target))
423
		{
424
			return false;
425
		}
426
427
		if ($action == 'move_up')
428
		{
429
			$left_id = $target['left_id'];
430
			$right_id = $attr_row['right_id'];
431
432
			$diff_up = $attr_row['left_id'] - $target['left_id'];
433
			$diff_down = $attr_row['right_id'] + 1 - $attr_row['left_id'];
434
435
			$move_up_left = $attr_row['left_id'];
436
			$move_up_right = $attr_row['right_id'];
437
		}
438
		else
439
		{
440
			$left_id = $attr_row['left_id'];
441
			$right_id = $target['right_id'];
442
443
			$diff_up = $attr_row['right_id'] + 1 - $attr_row['left_id'];
444
			$diff_down = $target['right_id'] - $attr_row['right_id'];
445
446
			$move_up_left = $attr_row['right_id'] + 1;
447
			$move_up_right = $target['right_id'];
448
		}
449
450
		$sql = 'UPDATE ' . $table_prefix . "topics_attr
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $move_up_left instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $move_up_right instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $diff_up instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $diff_down instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $left_id instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $right_id instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
451
			SET left_id = left_id + CASE
452
				WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
453
				ELSE {$diff_down}
454
			END,
455
			right_id = right_id + CASE
456
				WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
457
				ELSE {$diff_down}
458
			END
459
			WHERE left_id BETWEEN {$left_id} AND {$right_id}
460
				AND right_id BETWEEN {$left_id} AND {$right_id}";
461
		$db->sql_query($sql);
462
463
		return $target['attr_name'];
464
	}
465
466
	protected function qte_attr_select($attr_id)
467
	{
468
		global $user, $template;
469
470
		$current_time = time();
471
472
		foreach ($this->qte->getAttr() as $attr)
473
		{
474
			if ($attr['attr_id'] != $attr_id)
475
			{
476
				$attribute_name = str_replace(array('%mod%', '%date%'), array($user->data['username'], $user->format_date($current_time, $attr['attr_date'])), $user->lang($attr['attr_name']));
477
478
				$template->assign_block_vars('select_row', array(
479
					'QTE_ID' => $attr['attr_id'],
480
					'QTE_TYPE' => $attr['attr_type'],
481
					'QTE_NAME' => $attribute_name,
482
					'QTE_DESC' => $user->lang($attr['attr_desc']),
483
					'QTE_COLOUR' => $this->qte->attr_colour($attr['attr_name'], $attr['attr_colour']),
484
				));
485
			}
486
		}
487
	}
488
489
	protected function display_version_warning()
490
	{
491
		global $config, $user, $template;
492
493
		$version = \ernadoo\qte\ext::VERSION;
494
495
		// Check if the database is up-to-date (we don't display warning if we are on a -dev version since versions doesn't matches)
496
		if ($config['qte_version'] != $version && stripos($version, '-dev') === false)
497
		{
498
			trigger_error($user->lang('QTE_MIGRATIONS_OUTDATED', $config['qte_version'], $version), E_USER_ERROR);
499
		}
500
501
		// Display a warning for unstable versions
502
		if (stripos($version, '-dev') !== false)
503
		{
504
			$template->assign_vars(array(
505
				'S_VERSION_UNSTABLE' => true,
506
				'S_VERSION_DEV' => true,
507
				'VERSION_WARNING' => $user->lang('QTE_DEV_WARNING', $version) . '<br />' . $user->lang['QTE_DEV_WARNING_DEV'],
508
			));
509
		}
510
		else if (stripos($version, '-a') !== false)
511
		{
512
			$template->assign_vars(array(
513
				'S_VERSION_UNSTABLE' => true,
514
				'S_VERSION_DEV' => true,
515
				'VERSION_WARNING' => $user->lang('QTE_DEV_WARNING', $version),
516
			));
517
		}
518
		else if (stripos($version, '-b') !== false)
519
		{
520
			$template->assign_vars(array(
521
				'S_VERSION_UNSTABLE' => true,
522
				'VERSION_WARNING' => $user->lang('QTE_BETA_WARNING', $version),
523
			));
524
		}
525
	}
526
527
	/**
528
	* Permission Copy
529
	*
530
	* Copy a permission (auth) option
531
	*
532
	* @param string		$auth_option		The name of the permission (auth) option
533
	* @param int		$copy_from			If set, contains the id of the permission from which to copy the new one.
534
	* @param bool		$clear_dest_perms	True if destination permissions should be deleted
535
	* @return null
536
	*/
537
	private function _copy_permission($auth_option, $copy_from, $clear_dest_perms = true)
538
	{
539
		global $db, $phpbb_root_path, $phpEx;
540
541
		if (!class_exists('auth_admin'))
542
		{
543
			include($phpbb_root_path . 'includes/acp/auth.' . $phpEx);
544
		}
545
		$auth_admin = new \auth_admin();
546
547
		$old_id = $auth_admin->acl_options['id'][$copy_from];
548
		$new_id = $auth_admin->acl_options['id'][$auth_option];
549
550
		$tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE);
551
552
		foreach ($tables as $table)
553
		{
554
			// Clear current permissions of destination attributes
555
			if ($clear_dest_perms)
556
			{
557
				$sql = 'DELETE FROM ' . $table . '
558
					WHERE auth_option_id = ' . $new_id;
559
				$db->sql_query($sql);
560
			}
561
562
			$sql = 'SELECT *
563
					FROM ' . $table . '
564
					WHERE auth_option_id = ' . $old_id;
565
			$result = $db->sql_query($sql);
566
567
			$sql_ary = array();
568
			while ($row = $db->sql_fetchrow($result))
569
			{
570
				$row['auth_option_id'] = $new_id;
571
				$sql_ary[] = $row;
572
			}
573
			$db->sql_freeresult($result);
574
575
			if (!empty($sql_ary))
576
			{
577
				$db->sql_multi_insert($table, $sql_ary);
578
			}
579
		}
580
581
		$auth_admin->acl_clear_prefetch();
582
	}
583
}
584