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
|
|||
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
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 For 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
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 For 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
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 For 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
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 For 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
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 For 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
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 For 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 |
In PHP, under loose comparison (like
==
, or!=
, orswitch
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: