1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
/** |
6
|
|
|
* Saito - The Threaded Web Forum |
7
|
|
|
* |
8
|
|
|
* @copyright Copyright (c) the Saito Project Developers |
9
|
|
|
* @link https://github.com/Schlaefer/Saito |
10
|
|
|
* @license http://opensource.org/licenses/MIT |
11
|
|
|
*/ |
12
|
|
|
|
13
|
|
|
namespace Admin\View\Helper; |
14
|
|
|
|
15
|
|
|
use Admin\Lib\CakeLogEntry; |
16
|
|
|
use App\View\Helper\AppHelper; |
17
|
|
|
use App\View\Helper\TimeHHelper; |
18
|
|
|
use Cake\Cache\Cache; |
19
|
|
|
use Cake\View\Helper\BreadcrumbsHelper; |
20
|
|
|
use Cake\View\Helper\HtmlHelper; |
21
|
|
|
use SaitoHelp\View\Helper\SaitoHelpHelper; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* @property BreadcrumbsHelper $Breadcrumbs |
25
|
|
|
* @property HtmlHelper $Html |
26
|
|
|
* @property SaitoHelpHelper $SaitoHelp |
27
|
|
|
* @property TimeHHelper $TimeH |
28
|
|
|
*/ |
29
|
|
|
class AdminHelper extends AppHelper |
30
|
|
|
{ |
31
|
|
|
public $helpers = [ |
32
|
|
|
'Breadcrumbs', |
33
|
|
|
'SaitoHelp', |
34
|
|
|
'Html', |
35
|
|
|
'TimeH' |
36
|
|
|
]; |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* help |
40
|
|
|
* |
41
|
|
|
* @param string $id id |
42
|
|
|
* @return mixed |
43
|
|
|
*/ |
44
|
|
|
public function help($id) |
45
|
|
|
{ |
46
|
|
|
return $this->SaitoHelp->icon($id, ['style' => 'float: right;']); |
47
|
|
|
} |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* Get badge type for an engine |
51
|
|
|
* |
52
|
|
|
* @param string $engine engine-Id |
53
|
|
|
* @return string |
54
|
|
|
*/ |
55
|
|
|
public function badgeForCache(string $engine): string |
56
|
|
|
{ |
57
|
|
|
$class = get_class(Cache::engine($engine)); |
|
|
|
|
58
|
|
|
$class = explode('\\', $class); |
59
|
|
|
$class = str_replace('Engine', '', end($class)); |
60
|
|
|
|
61
|
|
|
switch ($class) { |
62
|
|
|
case 'File': |
63
|
|
|
$type = 'warning'; |
64
|
|
|
break; |
65
|
|
|
case 'Apc': |
66
|
|
|
case 'Apcu': |
67
|
|
|
$type = 'success'; |
68
|
|
|
break; |
69
|
|
|
case 'Debug': |
70
|
|
|
$type = 'important'; |
71
|
|
|
break; |
72
|
|
|
default: |
73
|
|
|
$type = 'info'; |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
return $this->badge($class, $type); |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
/** |
80
|
|
|
* badge |
81
|
|
|
* |
82
|
|
|
* @param string $text text |
83
|
|
|
* @param string $badge type |
84
|
|
|
* @return string |
85
|
|
|
*/ |
86
|
|
|
public function badge(string $text, string $badge = 'info'): string |
87
|
|
|
{ |
88
|
|
|
return $this->Html->tag( |
89
|
|
|
'span', |
90
|
|
|
$text, |
91
|
|
|
['class' => "badge badge-$badge"] |
92
|
|
|
); |
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
/** |
96
|
|
|
* format cake log |
97
|
|
|
* |
98
|
|
|
* @bogus the ability to see logs isn't in Saito 5 anymore |
99
|
|
|
* |
100
|
|
|
* @param string $log log |
101
|
|
|
* @return string |
102
|
|
|
*/ |
103
|
|
|
public function formatCakeLog($log) |
104
|
|
|
{ |
105
|
|
|
$_nErrorsToShow = 20; |
106
|
|
|
$errors = preg_split( |
107
|
|
|
'/(?=^\d{4}-\d{2}-\d{2})/m', |
108
|
|
|
$log, |
109
|
|
|
-1, |
110
|
|
|
PREG_SPLIT_NO_EMPTY |
111
|
|
|
); |
112
|
|
|
if (empty($errors)) { |
113
|
|
|
return '<p>' . __('No log file found.') . '</p>'; |
114
|
|
|
} |
115
|
|
|
|
116
|
|
|
$out = ''; |
117
|
|
|
$k = 0; |
118
|
|
|
$errors = array_reverse($errors); |
119
|
|
|
foreach ($errors as $error) { |
120
|
|
|
$e = new CakeLogEntry($error); |
121
|
|
|
$_i = self::tagId(); |
122
|
|
|
$_details = $e->details(); |
123
|
|
|
if (!empty($_details)) { |
124
|
|
|
$out .= '<button class="btn btn-mini" style="float:right;" onclick="$(\'#' . $_i . '\').toggle(); return false;">' . __( |
125
|
|
|
'Details' |
126
|
|
|
) . '</button>' . "\n"; |
127
|
|
|
} |
128
|
|
|
$out .= '<pre style="font-size: 10px;">' . "\n"; |
129
|
|
|
$out .= '<div class="row"><div class="span2" style="text-align: right">'; |
130
|
|
|
$out .= $this->TimeH->formatTime($e->time(), 'eng'); |
|
|
|
|
131
|
|
|
|
132
|
|
|
$out .= '</div>'; |
133
|
|
|
$out .= '<div class="span7">'; |
134
|
|
|
$out .= $e->message(); |
135
|
|
|
if (!empty($_details)) { |
136
|
|
|
$out .= '<span id="' . $_i . '" style="display: none;">' . "\n"; |
137
|
|
|
$out .= $_details; |
138
|
|
|
$out .= '</span>'; |
139
|
|
|
} |
140
|
|
|
$out .= '</div></div>'; |
141
|
|
|
$out .= '</pre>' . "\n"; |
142
|
|
|
if ($k++ > $_nErrorsToShow) { |
143
|
|
|
break; |
144
|
|
|
} |
145
|
|
|
} |
146
|
|
|
|
147
|
|
|
return $out; |
148
|
|
|
} |
149
|
|
|
|
150
|
|
|
/** |
151
|
|
|
* jquery table |
152
|
|
|
* |
153
|
|
|
* @param string $selector selector |
154
|
|
|
* @param string $sort sort |
155
|
|
|
* |
156
|
|
|
* @return void |
157
|
|
|
*/ |
158
|
|
|
public function jqueryTable($selector, $sort) |
|
|
|
|
159
|
|
|
{ |
160
|
|
|
$this->Html->css( |
161
|
|
|
'../js/node_modules/datatables.net-bs4/css/dataTables.bootstrap4.css', |
162
|
|
|
['block' => 'script'] |
163
|
|
|
); |
164
|
|
|
$this->Html->script( |
165
|
|
|
[ |
166
|
|
|
'../js/node_modules/datatables.net/js/jquery.dataTables.js', |
167
|
|
|
'../js/node_modules/datatables.net-bs4/js/dataTables.bootstrap4.js' |
168
|
|
|
], |
169
|
|
|
['block' => 'script'] |
170
|
|
|
); |
171
|
|
|
|
172
|
|
|
$script = <<<EOF |
173
|
|
|
$(function() { |
174
|
|
|
var userTable = $('{$selector}').DataTable(); |
175
|
|
|
}); |
176
|
|
|
EOF; |
177
|
|
|
|
178
|
|
|
$this->Html->scriptBlock($script, ['block' => 'script']); |
179
|
|
|
} |
180
|
|
|
} |
181
|
|
|
|
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.