import-model.php
См. документацию.
1 <?php
2 
3 /**
4  * @file
5  * @brief обработчик импорта модели
6  */
7 
8 isset($user) or require $_SERVER['DOCUMENT_ROOT'] . '/page/404.php';
9 
10 if (empty($_FILES) || !preg_match('#\.zip$#', $_FILES['file']['name'])) {
11  exit(json_encode(['error' => 'Ошибка, zip архив не найден']));
12 }
13 
14 $zip = new ZipArchive;
15 $res = $zip->open($_FILES['file']['tmp_name']);
16 if (!$res) {
17  exit(json_encode(['error' => 'Ошибка открытия архива']));
18 }
19 
20 isset($zipname) && unlink($zipname);
21 
22 $table = $zip->getFromName('name.txt');
23 
24 if (in_array(!$table, ['actions', 'modals', 'selects', 'templates', 'pages', 'crontabs'])) {
25  exit(json_encode(['error' => 'Ошибка, таблица не существует']));
26 }
27 
28 $model = json_decode($zip->getFromName('model.json'));
29 
30 if (!$model) {
31  exit(json_encode(['error' => 'Ошибка парсинга модели']));
32 }
33 
34 $fields = $dbh->query("SHOW COLUMNS FROM $table")->fetchAll(PDO::FETCH_COLUMN);
35 $model_fields = array_keys(get_object_vars($model));
36 
37 if ($fields != $model_fields) {
38  exit(json_encode(['error' => 'Ошибка парсинга модели, ключи объектов не совпадают!']));
39 }
40 
41 if (empty($model->owner_group) || (!in_array($model->owner_group, $user->subordinate_groups) && $model->owner_group != $user->main_group_id)) {
42  exit(json_encode(['error' => 'Недостаточно прав для импорта модели с данной группой владельцем']));
43 }
44 
45 if ($model->owner_group == 1) {
46  $model->owner_group = 2;
47 }
48 
49 if (($models_limit = Wrong\Database\Controller::find($model->owner_group, 'id', 'groups')->models_limit) && $models_limit <= Wrong\Rights\Group::count_all_owner_models($model->owner_group)) {
50  exit(json_encode(['error' => 'Лимит моделей для данной группы исчерпан']));
51 }
52 
53 if ($model->request) {
54  do {
55  $model->request .= '-copy';
56  } while (Wrong\Database\Controller::count($model->request, 'request', $table));
57 }
58 
59 if ($model->file) {
60  $file_data = $zip->getFromName(basename($model->file));
61  if (!$file_data) {
62  exit(json_encode(['error' => 'Ошибка парсинга php файла']));
63  }
64 
65  do {
66  $model->file = dirname($model->file) . '/' . basename($model->file, '.php') . '-copy.php';
67  } while (Wrong\Database\Controller::count($model->file, 'file', $table));
68 
69  $dir = $_SERVER['DOCUMENT_ROOT'] . dirname($model->file);
70  if (!file_exists($dir) && !mkdir($dir, 0755, true)) {
71  exit(json_encode(['error' => 'Ошибка при создании каталога ' . $dir]));
72  }
73 }
74 
75 $zip->close();
76 
77 if ($model->name) {
78  do {
79  $model->name .= ' - копия';
80  } while (Wrong\Database\Controller::count($model->name, 'name', $table));
81 }
82 
83 unset($model->id);
84 
85 if ($model->act && $table != 'templates') {
86  $model->act = 0;
87 }
88 
89 $sql = "INSERT INTO $table (" . implode(', ', array_keys(get_object_vars($model))) . ") VALUES (" . implode(', ', array_map(function ($item) {
90  return ':' . $item;
91 }, array_keys(get_object_vars($model)))) . ")";
92 
93 $sth = $dbh->prepare($sql);
94 foreach ($model as $key => $value) {
95  $sth->bindValue(":$key", $value);
96 }
97 $sth->execute();
98 if ($id = $dbh->lastInsertId()) {
99  if ($model->file && !file_put_contents($_SERVER['DOCUMENT_ROOT'] . $model->file, $file_data)) {
100  $dbh->query("DELETE FROM $table WHERE `id` = $id");
101  exit(json_encode(['error' => 'Ошибка импорта']));
102  }
103  exit(json_encode(['result' => 'ok', 'message' => 'Импорт успешно завершен!', 'location' => '/' . $table]));
104 }
105 
106 exit(json_encode(['error' => 'Ошибка импорта']));
if($model->act && $table !='templates') $sql
$res
if(empty($_FILES)||!preg_match('#\.zip$#', $_FILES['file']['name'])) $zip
$model_fields
if(! $model) $fields
if(in_array(! $table, ['actions', 'modals', 'selects', 'templates', 'pages', 'crontabs'])) $model
$table
$sth
if(!($row=Wrong\Database\Controller::find($_REQUEST['id'], 'id', $_REQUEST['table']))) if(! $user->access() ->write($row, true)) if(!isset($_POST['copy'])) $zipname
$user
Definition: from-user.php:38
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']
Definition: from-user.php:36
if(($dbh=Connect::getInstance(true) ->dbh) && $dbh->query("SHOW TABLES") ->fetchAll() && $dbh->query("SELECT COUNT(*) FROM `users`") ->fetchColumn()) if(!empty($_POST)) exit
Definition: install.php:198
$dbh
Definition: session.php:19