protected function DataTable_AddEdit($link, $table, $options, $syscolumns = array(), $fields = array()) { if (empty($syscolumns)) { //Собираем данные о полях таблицы $syscolumns = $this->TableColumns($table); } //Отдаем JSON для формы редактирования if (isset($_GET['getFieldsById'])) { $f = $this->db->rows("SELECT * FROM `prefix_{$table}` WHERE `id` = " . (int) $_GET['getFieldsById'], MYSQL_ASSOC); $jsoni = array(); foreach ($f[0] as $k => $v) { if (!empty($fields) && !in_array($k, array_keys($fields)) && (isset($options['nouns']['holder']) && $options['nouns']['holder'] != $k)) { continue; } //Мультиселект if (isset($fields[$k]['multiselect'])) { $v = @unserialize($v); } $jsoni[] = array('name' => $k, 'value' => $v, 'type' => $syscolumns[$k]['Type']); } //Изображение if (isset($options['nouns']['image']) && $options['nouns']['image']) { if (is_file(DIR . '/data/' . $table . '/' . $f[0]['id'] . '/' . $f[0]['id'])) { $jsoni[] = array('name' => 'image', 'value' => '/data/' . $table . '/' . $f[0]['id'] . '/' . $f[0]['id'] . '?rnd=' . rand(1000, 20000), 'type' => 'Image'); } else { $jsoni[] = array('name' => 'image', 'value' => '', 'type' => 'Image'); } } $json = json_encode($jsoni); echo $json; exit; } //Добавление записи if (isset($_POST['id']) && $_POST['id'] == 0) { $sql = "INSERT INTO `prefix_{$table}` "; // VALUES"; $insert_fields = array(); foreach ($_POST as $k => $v) { if ($k == 'id') { continue; } //Перевод и создание URI if (isset($fields[$k]['if_empty_make_uri']) && empty($v)) { if (isset($_POST[$fields[$k]['if_empty_make_uri']])) { $v = makeURI($_POST[$fields[$k]['if_empty_make_uri']]); } } //Мультиселект if (isset($fields[$k]['multiselect'])) { $v = serialize($v); } $insert_fields[] = "`{$k}`"; $insert_values[] = "'" . q($v) . "'"; } //Дата создания, подставляем автоматически, если такое поле есть if (in_array($options['nouns']['created'], array_keys($syscolumns))) { $insert_fields[] = "`{$options['nouns']['created']}`"; $insert_values[] = "NOW()"; } $sql .= '(' . implode(',', $insert_fields) . ') VALUES (' . implode(',', $insert_values) . ')'; $this->db->query($sql); //echo $sql; $id = $this->db->last_insert_id(); if (isset($_FILES['image']['name'])) { $ext = strtolower(substr($_FILES['image']['name'], -3)); if ($ext == 'jpg' || $ext == 'jpeg' || $ext == 'gif' || $ext == 'png') { if (!is_dir(DIR . '/data')) { mkdir(DIR . '/data'); } if (!is_dir(DIR . '/data/' . $table)) { mkdir(DIR . '/data/' . $table); } if (!is_dir(DIR . '/data/' . $table . '/' . $id)) { mkdir(DIR . '/data/' . $table . '/' . $id); } copy($_FILES['image']['tmp_name'], DIR . '/data/' . $table . '/' . $id . '/' . $id); } } //Событие if (method_exists($this, 'OnDataTableAdd')) { $this->OnDataTableAdd($_POST); } header("Location: " . $link); } //Редактирование записи if (isset($_POST['id']) && $_POST['id'] != 0) { $sql = "UPDATE `prefix_{$table}` SET "; // VALUES"; $insert_fields = array(); foreach ($_POST as $k => $v) { if ($k == 'id') { continue; } //Перевод и создание URI if (isset($fields[$k]['if_empty_make_uri']) && empty($v)) { if (isset($_POST[$fields[$k]['if_empty_make_uri']])) { $v = makeURI($_POST[$fields[$k]['if_empty_make_uri']]); } } //Мультиселект if (isset($fields[$k]['multiselect'])) { $v = serialize($v); } $update_values[] = "`{$k}` = '" . q($v) . "'"; } //Дата создания, подставляем автоматически, если такое поле есть if (in_array($options['nouns']['modified'], array_keys($syscolumns))) { $update_values[] = "`{$options['nouns']['modified']}` = NOW()"; } $sql .= implode(',', $update_values) . ' WHERE `id` = ' . (int) $_POST['id']; $this->db->query($sql); //print_r($_FILES); if (isset($_FILES['image']['name'])) { $ext = strtolower(substr($_FILES['image']['name'], -3)); if ($ext == 'jpg' || $ext == 'jpeg' || $ext == 'gif' || $ext == 'png') { if (!is_dir(DIR . '/data')) { mkdir(DIR . '/data'); } if (!is_dir(DIR . '/data/' . $table)) { mkdir(DIR . '/data/' . $table); } if (!is_dir(DIR . '/data/' . $table . '/' . $_POST['id'])) { mkdir(DIR . '/data/' . $table . '/' . $_POST['id']); } copy($_FILES['image']['tmp_name'], DIR . '/data/' . $table . '/' . $_POST['id'] . '/' . $_POST['id']); //Удаляем старые отресайзеные файлы if (is_dir(DIR . '/data/thumbs/data/' . $table . '/' . $_POST['id'])) { $thumbs = scandir(DIR . '/data/thumbs/data/' . $table . '/' . $_POST['id']); foreach ($thumbs as $thumb) { if (is_file(DIR . '/data/thumbs/data/' . $table . '/' . $_POST['id'] . '/' . $thumb)) { unlink(DIR . '/data/thumbs/data/' . $table . '/' . $_POST['id'] . '/' . $thumb); } } } } } //Событие if (method_exists($this, 'OnDataTableEdit')) { $this->OnDataTableEdit($_POST); } header("Location: " . $link); } //Готовим поля для формы $we_have_files_fields = false; $addjs = array(); foreach ($syscolumns as $k => $column) { if (!empty($fields) && !in_array($k, array_keys($fields)) && (!isset($options['nouns']['holder']) || $options['nouns']['holder'] != $k)) { continue; } if ($column['Key'] == 'PRI') { continue; } if (isset($fields[$k]['default'])) { $default = $fields[$k]['default']; } elseif (!empty($column['Default'])) { $default = $column['Default']; } else { $default = ''; } //КАСТОМНЫЕ ПОЛЯ //Автокомплит (jQ Autocomplete) if (isset($fields[$k]['autocomplete'])) { //Если генерим автокомплит из этого же поля //т.е. с данными, которые уже были $vjsi = array(); if ($fields[$k]['autocomplete'] == 'this') { $this->db->query("SELECT DISTINCT `{$k}` FROM `prefix_{$table}` WHERE `{$k}` != ''"); while ($i = $this->db->fetch()) { $vjsi[] = '"' . $i[$k] . '"'; } } elseif (is_array($fields[$k]['autocomplete'])) { foreach ($fields[$k]['autocomplete'] as $i) { $vjsi[] = '"' . $i . '"'; } } $html[] = ' <div class="floating_fields"> <label for="se_' . $table . '_' . $k . '">' . $fields[$k]['name'] . '</label> <input name="' . $k . '" id="se_' . $table . '_' . $k . '" def="' . $default . '" class="text ui-widget-content ui-corner-all autocomplete" /> </div>'; $minLength = 0; if (count($vjsi) > 100) { $minLength = 1; } $vjs = ' $("#se_' . $table . '_' . $k . '").autocomplete({ minLength: ' . $minLength . ', source: [' . implode(',', $vjsi) . '] }).click(function(){ $("#se_' . $table . '_' . $k . '").autocomplete("search", ""); }); '; $addjs[] = $vjs; continue; } //Селект (select) if (isset($fields[$k]['multiselect'])) { $fields[$k]['select'] = $fields[$k]['multiselect']; } if (isset($fields[$k]['select']) && isset($fields[$k]['select']['table']) && isset($fields[$k]['select']['name'])) { if (isset($fields[$k]['select']['id'])) { $id_field = ', `' . $fields[$k]['select']['id'] . '`'; } else { $id_field = ''; } if (isset($fields[$k]['select']['order'])) { $order_field = 'ORDER BY `' . $fields[$k]['select']['order'] . '`'; } else { $order_field = ''; } if (isset($fields[$k]['select']['deleted'])) { $is_deleted = "AND `{$fields[$k]['select']['deleted']}` = 'N'"; } else { $is_deleted = ''; } if (isset($fields[$k]['select']['where'])) { $where_field = $fields[$k]['select']['where']; } else { $where_field = ''; } //Если данные нужно построить деревом if (isset($fields[$k]['select']['top'])) { if (isset($fields[$k]['select']['allow_null']) && $fields[$k]['select']['allow_null']) { $opts = '<option value=""></option>'; } else { $opts = ''; } //Рекурсивно собираем категории $make_select_tree = function ($tid, $field, $default, $c = 0, $order_field, $is_deleted, $where_field, $make_select_tree) { $db = db(); $db->query("\n\t\t\t\t\t\t\tSELECT `{$field['select']['name']}`, `{$field['select']['id']}`\n\t\t\t\t\t\t\tFROM `prefix_{$field['select']['table']}`\n\t\t\t\t\t\t\tWHERE `{$field['select']['top']}` = {$tid}\n\t\t\t\t\t\t\t{$where_field}\n\t\t\t\t\t\t\t{$is_deleted}\n\t\t\t\t\t\t\t{$order_field}"); $opts = ''; while ($i = $db->fetch()) { $value = $i[$field['select']['id']]; if ($default == $value) { $selected = 'selected="selected"'; } else { $selected = ''; } if ($c > 0) { $prefix = str_repeat('-', $c) . ' '; } else { $prefix = ''; } $opts .= '<option value="' . $value . '" ' . $selected . '>' . $prefix . htmlspecialchars($i[$field['select']['name']]) . '</option>'; $opts .= $make_select_tree($i[$field['select']['id']], $field, $default, $c + 1, $order_field, $is_deleted, $where_field, $make_select_tree); } return $opts; }; $opts = $make_select_tree(0, $fields[$k], $default, 0, $order_field, $is_deleted, $where_field, $make_select_tree); } else { $this->db->query("SELECT `{$fields[$k]['select']['name']}` {$id_field} FROM `prefix_{$fields[$k]['select']['table']}` WHERE 1 {$where_field} {$is_deleted} {$order_field}"); if (isset($fields[$k]['select']['allow_null']) && $fields[$k]['select']['allow_null']) { $opts = '<option value=""></option>'; } else { $opts = ''; } while ($i = $this->db->fetch()) { if (isset($fields[$k]['select']['id'])) { $value = $i[$fields[$k]['select']['id']]; } else { $value = $i[$fields[$k]['select']['name']]; } if ($default == $value) { $selected = 'selected="selected"'; } else { $selected = ''; } $opts .= '<option value="' . $value . '" ' . $selected . '>' . htmlspecialchars($i[$fields[$k]['select']['name']]) . '</option>'; } } //Если у нас мультиселект if (isset($fields[$k]['multiselect'])) { if (isset($fields[$k]['select']['size'])) { $multi_size_val = $fields[$k]['select']['size']; } else { $multi_size_val = 4; } $multi = 'multiple="multiple"'; $multi_array = '[]'; $multi_size = 'size="' . $multi_size_val . '"'; } else { $multi = ''; $multi_array = ''; $multi_size = ''; } $html[] = ' <div class="floating_fields"> <label for="se_' . $table . '_' . $k . '">' . $fields[$k]['name'] . '</label> <select name="' . $k . $multi_array . '" id="se_' . $table . '_' . $k . '" class="text ui-widget-content ui-corner-all" ' . $multi_size . ' ' . $multi . '> ' . $opts . ' </select> </div>'; continue; } //АВТООПРЕДЕЛЕНИЕ ПОЛЕЙ switch ($column['Type']) { //Текст (textarea) case 'text': $html[] = ' <div class="fullwidth_fields"> <label for="se_' . $table . '_' . $k . '">' . $fields[$k]['name'] . '</label> <textarea name="' . $k . '" id="se_' . $table . '_' . $k . '" class="text ui-widget-content ui-corner-all tinymce" def="' . $default . '"></textarea> </div>'; $vjs = ''; if (isset($fields[$k]['length']) && !empty($fields[$k]['length'])) { $vjs .= 'bValid = bValid && checkLength($("#se_' . $table . '_' . $k . '"),"' . $fields[$k]['name'] . '",' . str_replace('-', ',', $fields[$k]['length']) . ');'; } if (isset($fields[$k]['regex']) && !empty($fields[$k]['regex'])) { $vjs .= 'bValid = bValid && checkRegexp($("#se_' . $table . '_' . $k . '"),' . $fields[$k]['regex'] . ',"' . $fields[$k]['regex_error'] . '");'; } $js[] = $vjs; break; //Да — нет //Да — нет case "enum('Y','N')": $html[] = ' <div class="fullwidth_fields"> <label>' . $fields[$k]['name'] . '</label> <input type="radio" name="' . $k . '" value="Y" id="se_' . $table . '_' . $k . '_y" class="radio" ' . ($column['Default'] == 'Y' ? 'checked="checked" def="1"' : '') . ' /> <label for="se_' . $table . '_' . $k . '_y" style="display:inline">Да</label> <input type="radio" name="' . $k . '" value="N" id="se_' . $table . '_' . $k . '_n" class="radio" ' . ($column['Default'] == 'N' ? 'checked="checked" def="1"' : '') . ' /> <label for="se_' . $table . '_' . $k . '_n" style="display:inline">Нет</label> </div>'; $vjs = ''; $js[] = $vjs; break; //Календарик с датами //Календарик с датами case 'datetime': case 'date': $html[] = ' <div class="floating_fields"> <label for="se_' . $table . '_' . $k . '">' . $fields[$k]['name'] . '</label> <input name="' . $k . '" id="se_' . $table . '_' . $k . '" class="text ui-widget-content ui-corner-all datefield" def="' . $default . '" /> </div>'; $vjs = ''; $vjs .= 'bValid = bValid && checkRegexp($("#se_' . $table . '_' . $k . '"),/(19|20)[0-9]{2}[\\- \\/.](0[1-9]|1[012])[\\- \\/.](0[1-9]|[12][0-9]|3[01])/im,"Не верно заполнено поле с датой");'; $js[] = $vjs; break; default: //Страница контента (Принадлежит) (SELECT) if (isset($options['nouns']['holder']) && $column['Field'] == $options['nouns']['holder']) { if (isset($options['nouns']['holder_module'])) { $module_name = $options['nouns']['holder_module']; } else { $array_debug = debug_backtrace(); $module_name = $array_debug[0]['class']; } $this->db->query("SELECT * FROM `prefix_content` WHERE `module` = '{$module_name}'"); $holder_select = ' <div class="fullwidth_fields"> <label for="se_' . $table . '_' . $k . '">Запись принадлежит разделу</label> <select name="' . $k . '" id="se_' . $table . '_' . $k . '" style="margin-bottom:12px"> <option value="0">не ограничено разделом</option>'; while ($i = $this->db->fetch()) { $holder_select .= '<option value="' . $i['id'] . '">' . $i['name'] . '</option>'; } $holder_select .= '</select> </div>'; $html[] = $holder_select; $vjs = ''; $js[] = $vjs; } else { if (strpos($column['Type'], 'enum(') === 0) { $radio = explode("','", substr($column['Type'], 6, -2)); $enum_radio = '<label>' . $fields[$k]['name'] . '</label><div id="se_' . $table . '_' . $k . '">'; foreach ($radio as $i) { $radio_name = $i == '' ? 'Не указано' : $i; $enum_radio .= '<input type="radio" name="' . $k . '" value="' . $i . '" id="se_' . $table . '_' . $k . '_' . $i . '" class="radio" ' . ($default == $i ? 'checked="checked" def="1"' : '') . ' /> <label for="se_' . $table . '_' . $k . '_' . $i . '" style="display:inline">' . $radio_name . '</label>'; } $html[] = ' <div class="fullwidth_fields"> ' . $enum_radio . ' </div>'; $vjs = ''; $js[] = $vjs; } else { $html[] = ' <div class="floating_fields"> <label for="se_' . $table . '_' . $k . '">' . $fields[$k]['name'] . '</label> <input name="' . $k . '" id="se_' . $table . '_' . $k . '" class="text ui-widget-content ui-corner-all" def="' . $default . '" /> </div>'; $vjs = ''; if (isset($fields[$k]['length']) && !empty($fields[$k]['length'])) { $vjs .= 'bValid = bValid && checkLength($("#se_' . $table . '_' . $k . '"),"' . $fields[$k]['name'] . '",' . str_replace('-', ',', $fields[$k]['length']) . ');'; } if (isset($fields[$k]['regex']) && !empty($fields[$k]['regex'])) { $vjs .= 'bValid = bValid && checkRegexp($("#se_' . $table . '_' . $k . '"),' . $fields[$k]['regex'] . ',"' . $fields[$k]['regex_error'] . '");'; } $js[] = $vjs; } } break; } } //Картинка if (isset($options['nouns']['image']) && $options['nouns']['image']) { //if(is_file(DIR.'/data/'.$table.'/'.$_POST['id'].'/'.$_POST['id'].'.jpg')) $html[] = ' <div class="fullwidth_fields"> <label for="se_' . $table . '_image">Изображение (Максимальный размер ' . get_max_filesize() . ')</label> <input type="file" name="image" id="se_' . $table . '_image" class="text ui-widget-content ui-corner-all" /> <div id="se_' . $table . '_image_prev"></div> </div> '; $we_have_files_fields = true; } //Табы $tabs = array(); if (isset($options['tabs'])) { foreach ($options['tabs'] as $k => $v) { if (!method_exists($this, $k)) { continue; } $tabs[$k] = array('method' => $k, 'name' => $v); } } $form = tpl('widgets/simple_edit', array('plink' => $link, 'table' => $table, 'js' => implode("\r\n", $js), 'html' => $html, 'we_have_files_fields' => $we_have_files_fields, 'tabs' => $tabs, 'addjs' => $addjs)); return $form; }
/** * Get a formatted maximum upload filesize * * @param string $format * @return string */ function max_filesize($format = 'b') { $size = min(get_max_filesize(), filter_var(ini_get('post_max_size'), FILTER_SANITIZE_NUMBER_INT) * 1024 * 1024); switch ($format) { case 'gb': return $size / 1024 / 1024 / 1024; case 'mb': return $size / 1024 / 1024; case 'kb': return $size / 1024; default: return $size; } }