Example #1
0
    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;
    }
Example #2
0
 /**
  * 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;
     }
 }