Completed
Push — master ( da58d4...61a0f7 )
by Henry
06:34
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 12
	 * @return string|null
82
	 */
83 12
84 12
	public function render(string $table = null, int $id = null, string $alias = null, int $status = null) : ?string
85 12
	{
86 12
		$output = Module\Hook::trigger('adminControlStart');
87
		$outputItem = null;
88
		$parameterRoute = $this->_registry->get('parameterRoute');
89
		$token = $this->_registry->get('token');
90 12
91
		/* html element */
92 12
93 12
		$element = new Html\Element();
94
		$listElement = $element
95 12
			->copy()
96
			->init('ul',
97
			[
98 12
				'class' => $this->_optionArray['className']['list']
99 12
			]);
100
		$itemElement = $element
101 12
			->copy()
102
			->init('li',
103
			[
104 12
				'class' => $this->_optionArray['className']['item']['control']
105 12
			]);
106
		$linkElement = $element
107 12
			->copy()
108 12
			->init('a');
109
		$textElement = $element
110
			->copy()
111
			->init('span');
112 12
113
		/* collect enable */
114 2
115
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'enable', $id))
116 2
		{
117 2
			$enableAction = $status ? 'disable' : 'enable';
118 2
			$outputItem .= $itemElement
119
				->copy()
120 2
				->addClass($enableAction === 'disable' ? $this->_optionArray['className']['item']['disable'] : $this->_optionArray['className']['item']['enable'])
121 2
				->html(
122 2
					$linkElement
123
						->copy()
124
						->attr('href', $parameterRoute . 'admin/' . $enableAction . '/' . $table . '/' . $id . '/' . $token)
125
						->text($enableAction === 'disable' ? $this->_language->get('disable') : $this->_language->get('enable'))
126
				);
127
		}
128 12
129
		/* collect publish */
130 3
131
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'publish', $id))
132
		{
133 1
			if ($status === 2)
134 1
			{
135 1
				$outputItem .= $itemElement
136
					->copy()
137 1
					->addClass($this->_optionArray['className']['item']['future-posting'])
138 1
					->html(
139
						$textElement
140
							->copy()
141
							->text($this->_language->get('future_posting'))
142
					);
143 2
			}
144
			else
145 2
			{
146 2
				$publishAction = $status ? 'unpublish' : 'publish';
147 2
				$outputItem .= $itemElement
148
					->copy()
149 2
					->addClass($publishAction === 'unpublish' ? $this->_optionArray['className']['item']['unpublish'] : $this->_optionArray['className']['item']['publish'])
150 2
					->html(
151 2
						$linkElement
152
							->copy()
153
							->attr('href', $parameterRoute . 'admin/' . $publishAction . '/' . $table . '/' . $id . '/' . $token)
154
							->text($publishAction === 'unpublish' ? $this->_language->get('unpublish') : $this->_language->get('publish'))
155
					);
156
			}
157
		}
158 12
159
		/* collect install */
160
161 1
		if ($this->_hasPermission($table, 'install') && $this->_showAction($table, 'install', $id))
162 1
		{
163 1
			$outputItem .= $itemElement
164
				->copy()
165 1
				->addClass($this->_optionArray['className']['item']['install'])
166 1
				->html(
167 1
					$linkElement
168
						->copy()
169
						->attr('href', $parameterRoute . 'admin/install/' . $table . '/' . $alias . '/' . $token)
170
						->text($this->_language->get('install'))
171
				);
172
		}
173 12
174
		/* collect edit */
175
176 6
		if ($this->_hasPermission($table, 'edit') && $this->_showAction($table, 'edit', $id))
177 6
		{
178 6
			$outputItem .= $itemElement
179
				->copy()
180 6
				->addClass($this->_optionArray['className']['item']['edit'])
181 6
				->html(
182 6
					$linkElement
183
						->copy()
184
						->attr('href', $parameterRoute . 'admin/edit/' . $table . '/' . $id)
185
						->text($this->_language->get('edit'))
186
				);
187
		}
188 12
189
		/* collect delete */
190
191 3
		if ($this->_hasPermission($table, 'delete') && $this->_showAction($table, 'delete', $id))
192 3
		{
193 3
			$outputItem .= $itemElement
194
				->copy()
195 3
				->addClass($this->_optionArray['className']['item']['delete'])
196 3
				->html(
197 3
					$linkElement
198 3
						->copy()
199
						->addClass($this->_optionArray['className']['link']['delete'])
200
						->attr('href', $parameterRoute . 'admin/delete/' . $table . '/' . $id . '/' . $token)
201
						->text($this->_language->get('delete'))
202
				);
203
		}
204 12
205
		/* collect uninstall */
206
207 1
		if ($this->_hasPermission($table, 'uninstall') && $this->_showAction($table, 'uninstall', $id))
208 1
		{
209 1
			$outputItem .= $itemElement
210
				->copy()
211 1
				->addClass($this->_optionArray['className']['item']['uninstall'])
212 1
				->html(
213 1
					$linkElement
214 1
						->copy()
215
						->addClass($this->_optionArray['className']['link']['uninstall'])
216
						->attr('href', $parameterRoute . 'admin/uninstall/' . $table . '/' . $alias . '/' . $token)
217
						->text($this->_language->get('uninstall'))
218
				);
219
		}
220 12
221
		/* collect output */
222 9
223
		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 12
		{
225 12
			$output .= $listElement->html($outputItem);
226
		}
227
		$output .= Module\Hook::trigger('adminControlEnd');
228
		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 12
	 * @return bool
240
	 */
241 12
242
	protected function _hasPermission(string $table = null, string $type = null) : bool
243
	{
244
		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 9
	 * @return bool
257
	 */
258
259
	protected function _showAction(string $table = null, string $type = null, int $id = null) : bool
260 9
	{
261
		$enableArray =
262
		[
263
			'groups',
264
			'users',
265
			'modules'
266 9
		];
267
		$publishArray =
268
		[
269
			'categories',
270
			'articles',
271
			'extras',
272
			'comments'
273 9
		];
274
		$deleteArray =
275
		[
276
			'categories',
277
			'articles',
278
			'extras',
279
			'comments',
280 9
			'groups',
281
			'users'
282 1
		];
283
		if ($id === 1 && ($type === 'enable' || $type === 'delete') && ($table === 'users' || $table === 'groups'))
284 9
		{
285 9
			return false;
286 9
		}
287 8
		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 7
			$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
			$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
			$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
			$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