Completed
Push — master ( 4d87e8...6f96cd )
by Henry
06:30
created

includes/Admin/View/Helper/Control.php (7 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace Redaxscript\Admin\View\Helper;
3
4
use Redaxscript\Admin;
5
use Redaxscript\Html;
6
use Redaxscript\Module;
7
use function array_replace_recursive;
8
use function in_array;
9
use function ucfirst;
10
11
/**
12
 * helper class to create the admin control
13
 *
14
 * @since 4.0.0
15
 *
16
 * @package Redaxscript
17
 * @category View
18
 * @author Henry Ruhs
19
 */
20
21
class Control extends Admin\View\ViewAbstract
22
{
23
	/**
24
	 * options of the panel
25
	 *
26
	 * @var array
27
	 */
28
29
	protected $_optionArray =
30
	[
31
		'className' =>
32
		[
33
			'list' => 'rs-admin-list-control',
34
			'item' =>
35
			[
36
				'control' => 'rs-admin-item-control',
37
				'disable' => 'rs-admin-item-disable',
38
				'enable' => 'rs-admin-item-enable',
39
				'future-posting' => 'rs-admin-item-future-posting',
40
				'unpublish' => 'rs-admin-item-unpublish',
41
				'publish' => 'rs-admin-item-publish',
42
				'edit' => 'rs-admin-item-edit',
43
				'delete' => 'rs-admin-item-delete',
44
				'install' => 'rs-admin-item-install',
45
				'uninstall' => 'rs-admin-item-uninstall'
46
			],
47
			'link' =>
48
			[
49
				'delete' => 'rs-admin-js-delete',
50
				'uninstall' => 'rs-admin-js-uninstall'
51
			]
52
		]
53
	];
54
55
	/**
56
	 * init the class
57
	 *
58
	 * @since 4.0.0
59
	 *
60
	 * @param array $optionArray options of the panel
61
	 *
62
	 * @return self
63
	 */
64
65
	public function init(array $optionArray = []) : self
66
	{
67
		$this->_optionArray = array_replace_recursive($this->_optionArray, $optionArray);
68
		return $this;
69
	}
70
71
	/**
72
	 * render the view
73
	 *
74
	 * @since 4.0.0
75
	 *
76
	 * @param string $table name of the table
77
	 * @param int $id identifier of the item
78
	 * @param string $alias alias of the item
79
	 * @param int $status status of the item
80
	 *
81
	 * @return string|null
82
	 */
83
84 12
	public function render(string $table = null, int $id = null, string $alias = null, int $status = null) : ?string
85
	{
86 12
		$output = Module\Hook::trigger('adminControlStart');
87 12
		$outputItem = null;
88 12
		$parameterRoute = $this->_registry->get('parameterRoute');
89 12
		$token = $this->_registry->get('token');
90
91
		/* html element */
92
93 12
		$element = new Html\Element();
94
		$listElement = $element
95 12
			->copy()
96 12
			->init('ul',
97
			[
98 12
				'class' => $this->_optionArray['className']['list']
99
			]);
100
		$itemElement = $element
101 12
			->copy()
102 12
			->init('li',
103
			[
104 12
				'class' => $this->_optionArray['className']['item']['control']
105
			]);
106
		$linkElement = $element
107 12
			->copy()
108 12
			->init('a');
109
		$textElement = $element
110 12
			->copy()
111 12
			->init('span');
112
113
		/* collect enable */
114
115 12
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'enable', $id))
116
		{
117 2
			$enableAction = $status ? 'disable' : 'enable';
118
			$outputItem .= $itemElement
119 2
				->copy()
120 2
				->addClass($enableAction === 'disable' ? $this->_optionArray['className']['item']['disable'] : $this->_optionArray['className']['item']['enable'])
121 2
				->html(
122
					$linkElement
123 2
						->copy()
124 2
						->attr('href', $parameterRoute . 'admin/' . $enableAction . '/' . $table . '/' . $id . '/' . $token)
125 2
						->text($enableAction === 'disable' ? $this->_language->get('disable') : $this->_language->get('enable'))
126
				);
127
		}
128
129
		/* collect publish */
130
131 12
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'publish', $id))
132
		{
133 3
			if ($status === 2)
134
			{
135
				$outputItem .= $itemElement
136 1
					->copy()
137 1
					->addClass($this->_optionArray['className']['item']['future-posting'])
138 1
					->html(
139
						$textElement
140 1
							->copy()
141 1
							->text($this->_language->get('future_posting'))
142
					);
143
			}
144
			else
145
			{
146 2
				$publishAction = $status ? 'unpublish' : 'publish';
147
				$outputItem .= $itemElement
148 2
					->copy()
149 2
					->addClass($publishAction === 'unpublish' ? $this->_optionArray['className']['item']['unpublish'] : $this->_optionArray['className']['item']['publish'])
150 2
					->html(
151
						$linkElement
152 2
							->copy()
153 2
							->attr('href', $parameterRoute . 'admin/' . $publishAction . '/' . $table . '/' . $id . '/' . $token)
154 2
							->text($publishAction === 'unpublish' ? $this->_language->get('unpublish') : $this->_language->get('publish'))
155
					);
156
			}
157
		}
158
159
		/* collect install */
160
161 12
		if ($this->_hasPermission($table, 'install') && $this->_showAction($table, 'install', $id))
162
		{
163
			$outputItem .= $itemElement
164 1
				->copy()
165 1
				->addClass($this->_optionArray['className']['item']['install'])
166 1
				->html(
167
					$linkElement
168 1
						->copy()
169 1
						->attr('href', $parameterRoute . 'admin/install/' . $table . '/' . $alias . '/' . $token)
170 1
						->text($this->_language->get('install'))
171
				);
172
		}
173
174
		/* collect edit */
175
176 12
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'edit', $id))
177
		{
178
			$outputItem .= $itemElement
179 6
				->copy()
180 6
				->addClass($this->_optionArray['className']['item']['edit'])
181 6
				->html(
182
					$linkElement
183 6
						->copy()
184 6
						->attr('href', $parameterRoute . 'admin/edit/' . $table . '/' . $id)
185 6
						->text($this->_language->get('edit'))
186
				);
187
		}
188
189
		/* collect delete */
190
191 12
		if ($this->_hasPermission($table, 'delete') && $this->_showAction($table, 'delete', $id))
192
		{
193
			$outputItem .= $itemElement
194 3
				->copy()
195 3
				->addClass($this->_optionArray['className']['item']['delete'])
196 3
				->html(
197
					$linkElement
198 3
						->copy()
199 3
						->addClass($this->_optionArray['className']['link']['delete'])
200 3
						->attr('href', $parameterRoute . 'admin/delete/' . $table . '/' . $id . '/' . $token)
201 3
						->text($this->_language->get('delete'))
202
				);
203
		}
204
205
		/* collect uninstall */
206
207 12
		if ($this->_hasPermission($table, 'uninstall') && $this->_showAction($table, 'uninstall', $id))
208
		{
209
			$outputItem .= $itemElement
210 1
				->copy()
211 1
				->addClass($this->_optionArray['className']['item']['uninstall'])
212 1
				->html(
213
					$linkElement
214 1
						->copy()
215 1
						->addClass($this->_optionArray['className']['link']['uninstall'])
216 1
						->attr('href', $parameterRoute . 'admin/uninstall/' . $table . '/' . $alias . '/' . $token)
217 1
						->text($this->_language->get('uninstall'))
218
				);
219
		}
220
221
		/* collect output */
222
223 12
		if ($outputItem)
0 ignored issues
show
Bug Best Practice introduced by
The expression $outputItem of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
224
		{
225 9
			$output .= $listElement->html($outputItem);
226
		}
227 12
		$output .= Module\Hook::trigger('adminControlEnd');
228 12
		return $output;
229
	}
230
231
	/**
232
	 * has the permission
233
	 *
234
	 * @since 4.0.0
235
	 *
236
	 * @param string $table name of the table
237
	 * @param string $type
238
	 *
239
	 * @return bool
240
	 */
241
242 12
	protected function _hasPermission(string $table = null, string $type = null) : bool
243
	{
244 12
		return (bool)$this->_registry->get($table . ucfirst($type));
245
	}
246
247
	/**
248
	 * show the action
249
	 *
250
	 * @since 4.0.0
251
	 *
252
	 * @param string $table name of the table
253
	 * @param string $type
254
	 * @param int $id
255
	 *
256
	 * @return bool
257
	 */
258
259 9
	protected function _showAction(string $table = null, string $type = null, int $id = null) : bool
260
	{
261
		$enableArray =
262
		[
263 9
			'groups',
264
			'users',
265
			'modules'
266
		];
267
		$publishArray =
268
		[
269 9
			'categories',
270
			'articles',
271
			'extras',
272
			'comments'
273
		];
274
		$deleteArray =
275
		[
276 9
			'categories',
277
			'articles',
278
			'extras',
279
			'comments',
280
			'groups',
281
			'users'
282
		];
283 9
		if ($id === 1 && ($type === 'enable' || $type === 'delete') && ($table === 'users' || $table === 'groups'))
284
		{
285 1
			return false;
286
		}
287 9
		return $type === 'enable' && in_array($table, $enableArray) && $id ||
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
288 9
			$type === 'publish' && in_array($table, $publishArray) && $id ||
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
289 9
			$type === 'delete' && in_array($table, $deleteArray) && $id ||
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
290 8
			$type === 'install' && $table === 'modules' && !$id ||
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to false; this is ambiguous if the integer can be zero. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
291 7
			$type === 'uninstall' && $table === 'modules' && $id ||
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
292 9
			$type === 'edit' && $id;
0 ignored issues
show
Bug Best Practice introduced by
The expression $id of type null|integer is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
293
	}
294
}
295