17 use Cron\CronExpression;
40 $arr[
'file'] = strtr(
$arr[
'file'], $replace_path);
41 $arr[
'request'] = strtr(
$arr[
'request'], $replace_path);
46 $sth =
$dbh->prepare(
"INSERT INTO `selects` (`request`, `file`, `groups`, `owner_group`) VALUES (:request, :file, :groups, :owner_group)");
47 $arr[
'groups'] = json_encode(
$arr[
'groups']);
48 $sth->bindValue(
':request',
$arr[
'request']);
49 $sth->bindValue(
':file',
$arr[
'file']);
50 $sth->bindValue(
':groups',
$arr[
'groups']);
51 $sth->bindValue(
':owner_group',
$arr[
'owner_group']);
53 return $dbh->lastInsertId();
74 if (($key_column = array_search(
'owner_group',
$columns)) &&
Env::$e->SUBORDINATE_MODELS) {
75 foreach (
$arr as $key => $row) {
83 if (
Env::$e->HIDE_NON_ACTIVE_GROUP_MODELS) {
84 foreach (
$arr as $key => $row) {
92 if (in_array(
$table, [
'actions',
'modals',
'selects',
'templates',
'pages'])) {
93 $key_file = array_search(
'file',
$columns);
94 foreach (
$arr as $key => $row) {
95 $arr[$key][] =
'<a title="<div class=\'text-left small\'>Файл: ' .
$arr[$key][$key_file] .
'<br>Последнее изменение: ' . date(
'Y-m-d H:i:s', filemtime(
$_SERVER[
'DOCUMENT_ROOT'] .
$arr[$key][$key_file])) .
'<div>" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-target="#edit-code" data-toggle="modal" class="d-block text-center editable-act px-1" href="#"><i class="fa fa-file-code-o"></i></a>';
99 if (in_array(
$table, [
'actions',
'modals',
'selects',
'templates',
'pages',
'crontabs'])) {
100 if (
$table ==
'crontabs') {
101 foreach (
$arr as $key => $row) {
102 $arr[$key][] =
'<a title="Выполнить задачу сейчас" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-copy="true" data-precallback="precallbackShedule" data-callback="callbackAction" data-action="' .
Actions::name(46) .
'" data-confirm="true" data-header="Выполнить сейчас <b>ID ' . $row[0] .
'</b>?" data-body="Выполнить задачу <b>ID ' . $row[0] .
'</b> сейчас? Задача будет выполнена в одном потоке, вне зависимости от настроек потоков." class="d-block text-center editable-act px-1" href="#"><i class="fa fa-play"></i></a>';
105 foreach (
$arr as $key => $row) {
106 $arr[$key][] =
'<a title="Копировать модель" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-copy="true" data-callback="callbackAction" data-action="' .
Actions::name(37) .
'" data-confirm="true" data-header="Копировать <b>ID ' . $row[0] .
'</b>?" data-body="Копировать модель <b>ID ' . $row[0] .
'</b> и добавить копию?" class="d-block text-center editable-act px-1" href="#"><i class="fa fa-copy"></i></a>';
107 $arr[$key][] =
'<a title="Экспорт модели" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-action="' .
Actions::name(37) .
'" data-confirm="false" data-header="Экспорт <b>ID ' . $row[0] .
'</b>?" data-body="Экспортировать модель <b>ID ' . $row[0] .
'</b>?" data-response="script" class="d-block text-center editable-act px-1" href="#"><i class="fa fa-download"></i></a>';
112 foreach (
$arr as $key => $row) {
113 if ($key_column &&
$arr[$key][$key_column] == 1) {
114 $arr[$key][] =
'<a title="Очистить от моделей" onclick="errorToast(\'Системный функционал удалять нельзя!\');setTimeout(()=>{$(\'.editable\').removeClass(\'editable\');},100);return false;" class="text-danger d-block text-center editable-act px-1" href="#"><i class="fa fa-eraser"></i></a>';
116 $arr[$key][] =
'<a title="Очистить от моделей" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-action="' .
Actions::name(36) .
'" data-confirm="true" data-header="Очистить <b>ID ' . $row[0] .
'</b>?" data-body="Очистить <b>ID ' . $row[0] .
'</b> от всех принадлежащих группе моделей? ' . (
$table ==
'groups' ?
'<b>Внимание!</b> Все модели, файлы, группы, пользователи и функционал принадлежащий данной группе будут удалены!' :
'') .
'" data-callback="afterRemoved" class="text-danger d-block text-center editable-act px-1" href="#"><i class="fa fa-eraser"></i></a>';
121 foreach (
$arr as $key => $row) {
122 if ($key_column &&
$arr[$key][$key_column] == 1) {
123 $arr[$key][] =
'<a title="Удалить" onclick="errorToast(\'Системный функционал удалять нельзя!\');setTimeout(()=>{$(\'.editable\').removeClass(\'editable\');},100);return false;" class="text-danger d-block text-center editable-act px-1" href="#"><i class="fa fa-trash"></i></a>';
125 $arr[$key][] =
'<a title="Удалить" data-id="' . $row[0] .
'" data-table="' .
$table .
'" data-action="' .
Actions::name(9) .
'" data-confirm="true" data-header="Удалить <b>ID ' . $row[0] .
'</b>?" data-body="Удалить <b>ID ' . $row[0] .
'</b> навсегда из системы? ' . (
$table ==
'groups' ?
'<b>Внимание!</b> Все модели, файлы, группы, пользователи и функционал принадлежащий данной группе будут тоже удалены!' :
'') .
'" data-callback="afterRemoved" class="text-danger d-block text-center editable-act px-1" href="#"><i class="fa fa-trash"></i></a>';
130 $owner_column = array_search(
'owner_group',
$columns);
131 $key_column = array_search(
'x_auth_token',
$columns);
132 foreach (
$arr as $key => $item) {
135 $arr[$key][$key_column] =
'<div class="copy-text">' . $item[$key_column] .
'</div>';
137 $arr[$key][$key_column] =
'***';
141 $key_column = array_search(
'email',
$columns);
142 foreach (
$arr as $key => $item) {
145 $arr[$key][$key_column] =
'<div class="copy-text">' . $item[$key_column] .
'</div>';
147 $arr[$key][$key_column] =
'***';
151 $key_column = array_search(
'ip',
$columns);
152 foreach (
$arr as $key => $item) {
155 $arr[$key][$key_column] =
'***';
160 if (($key_column = array_search(
'act',
$columns)) && ($key_owner = array_search(
'owner_group',
$columns))) {
161 foreach (
$arr as $key => $item) {
162 $data_system = $item[$key_owner] == 1 ?
'onclick="$(this).data(\'confirm\', $(this).prev().is(\':checked\'));" data-confirm="false" data-header="Предупреждение" data-body="Владелец Система. Отключение системного функционала может привести к нежелательным последствиям! Отключить всё равно?"' :
'';
163 $arr[$key][$key_column] =
'<input class="tgl tgl-flip" id="tgl-' . $item[0] .
'" type="checkbox" ' . ($item[$key_column] ?
'checked' :
'') .
'>
164 <label title="' . ($item[$key_column] ?
'Выключить' :
'Включить') .
'" data-owner="' . intval(in_array($item[$key_owner],
$user->groups)) .
'" data-action="' .
Actions::name(6) .
'" ' . $data_system .
' data-table="' .
$table .
'" data-id="' . $item[0] .
'" data-callback="toggled" class="tgl-btn mx-auto" data-tg-off="Выкл" data-tg-on="Вкл" for="tgl-' . $item[0] .
'"></label>';
168 if ($key_column = array_search(
'groups',
$columns)) {
169 foreach (
$arr as $key => $item) {
171 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act edit-wrapper-text" data-id="' . $item[0] .
'" data-target="#edit-groups" data-toggle="modal" data-table="' .
$table .
'" title="' .
$arr[$key][$key_column] .
'">' .
$arr[$key][$key_column] .
'<i class="fa fa-edit"></i></div>';
175 if ($key_column = array_search(
'owner_group',
$columns)) {
176 foreach (
$arr as $key => $item) {
178 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-owner" data-toggle="modal" data-table="' .
$table .
'">' .
$arr[$key][$key_column] .
'<i class="fa fa-edit"></i></div>';
182 if ($key_column = array_search(
'file',
$columns)) {
183 foreach (
$arr as $key => $item) {
184 $arr[$key][$key_column] =
'<div title="' . $item[$key_column] .
'" class="edit-wrapper editable-act px-1" data-id="' . $item[0] .
'" data-target="#edit-file" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
188 if (($key_column = array_search(
'request',
$columns)) &&
$table !=
'users') {
189 foreach (
$arr as $key => $item) {
190 $arr[$key][$key_column] =
'<div title="' . $item[$key_column] .
'" class="edit-wrapper edit-wrapper-text editable-act" data-id="' . $item[0] .
'" data-target="#edit-request" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
195 if ($key_column = array_search(
'name',
$columns)) {
196 foreach (
$arr as $key => $item) {
197 $arr[$key][$key_column] =
'<div class="edit-wrapper edit-wrapper-text editable-act" data-id="' . $item[0] .
'" data-target="#edit-name" data-toggle="modal" data-table="' .
$table .
'" title="' .
$arr[$key][$key_column] .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
201 if ($key_column = array_search(
'note',
$columns)) {
202 foreach (
$arr as $key => $item) {
203 $arr[$key][$key_column] =
'<div title="' . nl2br($item[$key_column]) .
'" class="edit-wrapper edit-wrapper-text editable-act" data-id="' . $item[0] .
'" data-target="#edit-note" data-toggle="modal" data-table="' .
$table .
'">' . nl2br($item[$key_column]) .
'<i class="fa fa-edit"></i></div>';
207 if ($key_column = array_search(
'cache_time',
$columns)) {
208 foreach (
$arr as $key => $item) {
209 $arr[$key][$key_column] =
'<div title="Время кеширования: ' . $item[$key_column] .
' сек." class="edit-wrapper edit-wrapper-text editable-act text-nowrap" data-id="' . $item[0] .
'" data-target="#edit-cache-time" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
' сек.<i class="fa fa-edit"></i></div>';
214 if ($key_column = array_search(
'weight',
$columns)) {
215 foreach (
$arr as $key => $item) {
216 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-weight" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
220 if ($key_column = array_search(
'models_limit',
$columns)) {
221 foreach (
$arr as $key => $item) {
222 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-models-limit" data-toggle="modal" data-table="' .
$table .
'">' . ($item[$key_column] ? $item[$key_column] :
'Без лимита') .
'<i class="fa fa-edit"></i></div>';
226 if ($key_column = array_search(
'\'count_active_models\
'',
$columns)) {
227 foreach (
$arr as $key => $item) {
232 if ($key_column = array_search(
'\'count_available_models\
'',
$columns)) {
233 foreach (
$arr as $key => $item) {
240 if ($key_column = array_search(
'template_id',
$columns)) {
241 foreach (
$arr as $key => $item) {
242 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-template" data-toggle="modal" data-table="' .
$table .
'">' .
Templates::find($item[$key_column])->name .
'<i class="fa fa-edit"></i></div>';
246 $key_column = array_search(
'id',
$columns);
247 foreach (
$arr as $key => $item) {
248 $arr[$key][$key_column] =
'<a title="Посмотреть страницу" class="link-wrapper" data-toggle="modal" data-target="#view-page" data-uri="' .
Pages::find($item[$key_column])->request .
'" href="#">' . $item[$key_column] .
'<i class="fa fa-external-link"></i></a>';
252 if (
$table ==
'actions') {
253 $key_column = array_search(
'id',
$columns);
254 foreach (
$arr as $key => $item) {
255 $arr[$key][$key_column] =
'<a title="Конструктор триггера" class="link-wrapper" data-toggle="modal" data-name="' .
Actions::name($item[$key_column]) .
'" data-target="#construct-action" href="#">' . $item[$key_column] .
'<i class="fa fa-cubes"></i></a>';
260 $key_column = array_search(
'id',
$columns);
261 foreach (
$arr as $key => $item) {
262 $arr[$key][$key_column] =
'<a title="Конструктор триггера" class="link-wrapper" data-toggle="modal" data-name="' .
Modals::name($item[$key_column]) .
'" data-target="#construct-modal" href="#">' . $item[$key_column] .
'<i class="fa fa-cubes"></i></a>';
266 if (($key_column = array_search(
'logs',
$columns))) {
267 foreach (
$arr as $key => $item) {
268 $arr[$key][$key_column] =
'<input class="tgl tgl-flip" id="tgl-log-' . $item[0] .
'" type="checkbox" ' . ($item[$key_column] ?
'checked' :
'') .
'>
269 <label title="' . ($item[$key_column] ?
'Выключить' :
'Включить') .
'" data-action="' .
Actions::name(22) .
'" data-id="' . $item[0] .
'" data-callback="toggledLogs" class="tgl-btn mx-auto" data-tg-off="Выкл" data-tg-on="Вкл" for="tgl-log-' . $item[0] .
'"></label>';
274 $key_column = array_search(
'api_act',
$columns);
275 foreach (
$arr as $key => $item) {
276 $arr[$key][$key_column] =
'<input class="tgl tgl-flip" id="tgl-api-' . $item[0] .
'" type="checkbox" ' . ($item[$key_column] ?
'checked' :
'') .
'>
277 <label title="' . ($item[$key_column] ?
'Выключить' :
'Включить') .
'" data-action="' .
Actions::name(28) .
'" data-id="' . $item[0] .
'" data-callback="toggledApi" class="tgl-btn mx-auto" data-tg-off="Выкл" data-tg-on="Вкл" for="tgl-log-' . $item[0] .
'"></label>';
280 $key_column = array_search(
'id',
$columns);
281 foreach (
$arr as $key => $item) {
282 $arr[$key][$key_column] =
'<a title="Вход от имени: ' .
Users::find($item[0])->email .
'" data-action="' .
Actions::name(23) .
'" data-id="' . $item[0] .
'" data-callback="fromUser" class="link-wrapper" href="#">' . $item[$key_column] .
'<i class="fa fa-user"></i></a>';
285 $key_column = array_search(
'email_confirmed',
$columns);
286 foreach (
$arr as $key => $item) {
287 $arr[$key][$key_column] =
'<div class="text-center px-1">' . ($item[$key_column] ?
'<i title="Email подтверждён" class="fa fa-check-circle text-success"></i>' :
'<i title="Email не подтверждён" class="fa fa-times-circle text-secondary"></i>') .
'</div>';
291 if (
$table ==
'crontabs') {
292 $shedule_column = array_search(
'shedule',
$columns);
293 $key_column = array_search(
'run_at',
$columns);
294 foreach (
$arr as $key => $item) {
295 $cron = CronExpression::factory($item[$shedule_column]);
297 for (
$i = 0;
$i < 10;
$i++) {
298 $shedules[] = $cron->getNextRunDate(
null,
$i)->format(
'Y-m-d H:i:s');
301 $arr[$key][$key_column] =
'<div data-placement="left" title="<div class=\'text-left font-weight-bold\'>Расписание:</div><small style=\'line-height:1;\'>' . implode(
"<br>",
$shedules) .
'</small>">' . substr(
$shedules[0], 0, -3) .
'</div>';
304 $key_column = array_search(
'user_id',
$columns);
305 foreach (
$arr as $key => $item) {
306 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-performer" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
309 $key_column = array_search(
'shedule',
$columns);
310 foreach (
$arr as $key => $item) {
311 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-shedule" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
314 $key_column = array_search(
'headers',
$columns);
315 foreach (
$arr as $key => $item) {
316 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-headers" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
319 $key_column = array_search(
'data',
$columns);
320 foreach (
$arr as $key => $item) {
321 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-data" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
324 $key_column = array_search(
'method',
$columns);
325 foreach (
$arr as $key => $item) {
326 $arr[$key][$key_column] =
'<div class="edit-wrapper editable-act" data-id="' . $item[0] .
'" data-target="#edit-method" data-toggle="modal" data-table="' .
$table .
'">' . $item[$key_column] .
'<i class="fa fa-edit"></i></div>';
348 if ($key_column = array_search(
'act',
$columns)) {
353 foreach (
$arr as $key => $item) {
360 if ($key_column = array_search(
'owner_group',
$columns)) {
365 foreach (
$arr as $key => $item) {
372 if ($key_column = array_search(
'groups',
$columns)) {
374 foreach (
$arr as $key => $item) {
375 if (json_decode(
$arr[$key][$key_column],
true)) {
380 foreach (
$arr as $key => $item) {
381 if (!array_intersect(json_decode(
$arr[$key][$key_column],
true),
$_SESSION[
'filter'][
$table][
'groups'])) {
388 if (
$table ==
'templates' && ($key_column = array_search(
'type',
$columns))) {
389 $template_types = [
'page',
'incode',
'modal',
'select',
'action'];
394 foreach (
$arr as $key => $item) {
395 if (!in_array(array_search(
$arr[$key][$key_column], $template_types),
$_SESSION[
'filter'][
$table][
'type'])) {
catch(\Throwable $th) $shedules
if(!($row=Wrong\Models\Crontabs::find($_POST['id']))) if(! $user->access() ->write($row)) $sth
if(!in_array($_POST['table'], Wrong\Database\Controller::$tables)) $table
if(empty($_POST['name'])) if(empty($_POST['type'])||!in_array($_POST['type'], ['page', 'modal', 'incode', 'select', 'action'])) $i
Connect создает подключение к базе данных
static getInstance($ignore_error=false)
Controller контроллер для запросов к БД
static find($value, $column='id', $table='')
Path удаляет и очищает каталоги
Actions контроллер управления моделями действий, расширяет Controller.
Selects контроллер управления моделями выборок, расширяет Controller.
static formatter($arr, $columns, $table)
static create($arr, $replace_path=[])
static filter($arr, $columns, $table)
static all_available($value='', $column='id', $table='')
Groups контроллер управления моделями пользователей, расширяет Controller.
Group класс, содержащий статические методы, используемые для управления группами пользователей.
static count_all_available_models($id)
static groupNamesText($json_groups)
static count_all_owner_models($id, $is_active=false)
Env класс управляющий, добавляющий или записывающий переменные среды
setcookie('FROM_UID', $uid, [ 'expires'=> time()+31536000, 'path'=> '/', 'domain'=> $_SERVER['HTTP_HOST'], 'secure'=> Wrong\Start\Env::$e->IS_SECURE, 'httponly'=> false, 'samesite'=> Wrong\Start\Env::$e->IS_SECURE ? 'None' :'Lax']) or setcookie('FROM_UID' $_SERVER['HTTP_HOST']
ModelsInterface интерфейс управления моделями