Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086

Динамическая иерархическая таблица из БД

07.11.2017, 18:23. Показов 2129. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такая проблема, нужно создать иерархическую таблицу html(Прикрепленное изображение(Итоговая) 1), формируя ее из данных в Базе, для этого была создана таблица-шаблон(Прикрепленное изображение 2(Структура) верхняя) и таблица-данные(Прикрепленное изображение 2(Структура) нижняя). В таблице-шаблоне описывается как должна выглядеть таблица, ее иерархию и порядок следования столбцов, а в таблице-данные данные для "вписывания" в итоговую таблицу, коротко говоря первая таблица формулирует лишь "сложную шапку", т.е иерархию, а данные приписываются под ними. В общем в этом и заключается проблема, я пробовал с помощью PHP, но как-то коряво там получается и без вложенных тэгов table не получилось... Возможно ли как-то реализовать такое на JS(jQuery)?

Если да, то подскажите, пожалуйста, куда копать и какие методы использовать, подозреваю нужно использовать селекторы, что-то типа:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$('#myCell').attr('rowspan', '2');
$(this).parent().siblings().eq(0).attr("rowspan");
 
.parent()
.prevAll()
element-selector
has-selector
has-attribute-selector
first-selector
.find()
.attr()
.end()
.remove()
...
еще раз, все это формируется автоматически, если есть наследники и их скажем 3, то увеличиваем rowspan до 3 и т.д так же с наследниками по иерархии, а в последние (конечные) столбцы уже и нужно вписывать данные. Если я все правильно понял

Не спрашивайте зачем это, я сам не знаю Сказали сделать "такое".

Буду благодарен за любые идеи, особенно тем, что облегчит мои муки, кажись задача не простая
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2017, 18:23
Ответы с готовыми решениями:

Иерархическая таблица с товарами
Доброго дня! каким элементом и как реализовать иерархический справочник на C# для списка товаров я ползую DataGridView ...

Иерархическая таблица в РБД
Мне в руки "попалось" ТЗ. В одном из пунктов описывается таблица в БД. Сказано, что она должна быть иерархической, но как это я не понимаю....

Иерархическая таблица и запрос к ней
Здравствуйте. Имеется таблица с иерархией с полями ID Категории, Название категории, ID Родительской категории, Номер уровня. Как нужно...

18
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
07.11.2017, 23:36
какая база-то? mysql? можешь скинуть тестовые таблицы? так тебе надо просто посчитать уровень на котором находится элемент (строку в первой, второй или третьей, а именно сколько у него родителей на уровнях выше 0 1 или 2) и посчитать количество всех его потомков (до самаго низа иерархии) у которых нет потомков (конечные точки дерева) это и будет число роуспан
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
07.11.2017, 23:44
можно и на пхп перечесать массив рекурсией и перестроить в готовый с указанием в какой строке и какой ширины элемент
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
07.11.2017, 23:44
мож завтра напишу реализацию, если ты сам раньше не напишешь, а пока спать иду
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
08.11.2017, 09:49  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
какая база-то? mysql? можешь скинуть тестовые таблицы?
Да, конечно, база MySQL, вот дамп:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
--
-- Структура таблицы `description_table`
--
 
CREATE TABLE IF NOT EXISTS `description_table` (
  `id` INT(11) NOT NULL COMMENT 'Идентификатор',
  `internal_key` INT(12) NOT NULL DEFAULT '0' COMMENT 'Внутренний ключ к полям таблицы',
  `sort_order` INT(12) NOT NULL COMMENT 'Сортировка полей',
  `status` INT(1) NOT NULL DEFAULT '1' COMMENT 'Стаус: 1 - активный(создавать), 0 - не создавать(для отчета) ',
  `field_name` VARCHAR(255) NOT NULL COMMENT 'Название поля',
  `name` VARCHAR(255) NOT NULL,
  `field_type` VARCHAR(50) NOT NULL COMMENT 'Тип поля',
  `lenght` INT(3) NOT NULL COMMENT 'Длина поля'
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
 
--
-- Дамп данных таблицы `description_table`
--
 
INSERT INTO `description_table` (`id`, `internal_key`, `sort_order`, `status`, `field_name`, `name`, `field_type`, `lenght`) VALUES
(1, 0, 1, 1, 'name', 'Название', 'varchar', 255),
(2, 0, 2, 1, 'type', 'Тип', 'varchar', 255),
(3, 0, 4, 1, 'author', 'Автор', 'varchar', 100),
(4, 0, 3, 1, 'locate', 'Место', 'varchar', 255),
(5, 1, 2, 1, 'un_name', 'Под Название', 'varchar', 100),
(6, 1, 1, 1, 'un_name_two', 'Под Название', 'varchar', 100),
(7, 2, 1, 1, 'un_type', 'Под Тип', 'varchar', 100),
(8, 9, 1, 1, 'un_un_type', 'Под Под Тип', 'varchar', 10),
(9, 2, 2, 1, 'un_type_2', 'Под Тип 2', 'varchar', 100),
(10, 2, 3, 1, 'un_type_3', 'Под Тип 3', 'int', 10),
(11, 5, 2, 1, 'un_un_name_1_1', 'Под под название ', 'int', 10),
(12, 5, 1, 1, 'un_un_name_2_1', 'Под под название ', 'varchar', 100);
 
--
-- Индексы сохранённых таблиц
--
 
--
-- Индексы таблицы `description_table`
--
ALTER TABLE `description_table`
  ADD PRIMARY KEY (`id`);
 
--
-- AUTO_INCREMENT для сохранённых таблиц
--
 
--
-- AUTO_INCREMENT для таблицы `description_table`
--
ALTER TABLE `description_table`
  MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',AUTO_INCREMENT=13;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


Цитата Сообщение от Уф Посмотреть сообщение
ак тебе надо просто посчитать уровень на котором находится элемент (строку в первой, второй или третьей, а именно сколько у него родителей на уровнях выше 0 1 или 2) и посчитать количество всех его потомков
Практически да, это и входило в планы при реализации, вся суть в том, что в базе находятся записи, но ним уже и формируется динамично сложная шапка

Цитата Сообщение от Уф Посмотреть сообщение
(до самаго низа иерархии) у которых нет потомков (конечные точки дерева)
А вот к конечным точкам как раз таки уже и нужно "приклеивать" данные

Цитата Сообщение от Уф Посмотреть сообщение
это и будет число роуспан
Тоже так же и хотел сделать, но знаний пока маловато

Цитата Сообщение от Уф Посмотреть сообщение
можно и на пхп перечесать массив рекурсией и перестроить в готовый с указанием в какой строке и какой ширины элемент
Миниатюры
Как уже говорил, я пробовал, но получилось коряво, вот как это было:
Класс создания таблицы:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
<?php
/**
 * Created by PhpStorm.
 * User: 123
 * Date: 11.06.2017
 * Time: 20:10
 */
 
require_once('config.php');
 
/*
 * Класс для генерации динамичной, сложносочиненной таблицы
 */
class Table {
 
    /*
     * Публичное свойство для подключения к БД
     */
    public $mysqli;
 
    /*
     * Конструктор класса, создает только подключение к Базе Данных
     * Для этого в свойство public $mysqli; заносится экземпляр mysqli, теперь нам станут доступны все методы и свойства mysqli
     * через $this->mysqli
     */
    public function __construct($host = 'localhost', $user = 'gavrik', $pass = 'gavrik', $db = 'jemlet'){
 
        $this->mysqli = new mysqli(DBSERVER, DBUSER, DBPASSWORD, DBNAME);
 
        if ($this->mysqli->connect_error) {
            die('Ошибка подключения (' . $this->mysqli->connect_errno . ') '. $this->mysqli->connect_error);
        }
 
    }
 
    /*
     * Функция сравнения для сортировки
     */
    public function sortMassive($a, $b, $sort_field = 'sort_order'){
        if ($a[$sort_field] == $b[$sort_field]) {
            return 0;
        }
        return ($a[$sort_field] < $b[$sort_field]) ? -1 : 1;
    }
 
    /*
     * Получаем массив нашей таблицы из БД
     */
    public function getFields(){
        $sql = 'SELECT * FROM `description_table`';
        $res = $this->mysqli->query($sql);
 
        if($res->num_rows > 0) {
            //Создаем масив где ключ массива является ID поля
            $cat = [];
            while ($row = $res->fetch_assoc()) {
                $cat[$row['id']] = $row;
            }
            return $cat;
        }
        return null;
    }
 
    /*
     * Метод построения сортированного дерева из массива
     */
    public function getDataTree($dataset) {
        $tree = array();
        if($dataset) {
            uasort($dataset, ['Table', 'sortMassive']); // сортировка!!!
            foreach ($dataset as $id => &$node) {
                //Если нет вложений
                if (!$node['internal_key']) {
                    $tree[$id] = &$node;
                } else {
                    //Если есть потомки то перебераем массив
                    $dataset[$node['internal_key']]['childs'][$id] = &$node;
                }
            }
            return $tree;
        }
        return null;
    }
 
 
    /*
     * Возвращаем количество унаследованных полей текущего родителя
     * @param int $id
     */
    public function childs($id){
        $childs = $this->mysqli->query('SELECT * FROM description_table WHERE internal_key = ' . $id . '');
        return ($childs->num_rows > 0) ? $childs->num_rows : 0;
    }
 
    /*
     * Возвращаем родителя текущего поля
     * @param int $internal
     */
    public function parent($internal){
        $parents = $this->mysqli->query('SELECT * FROM description_table WHERE id = ' . $internal . '');
        if($parents){
            $parent = $parents->fetch_assoc();
            return ($parents->num_rows == 1) ? $parent['id'] : 0;
        }
        return 0;
    }
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    /*
     * Рекурсивно считываем наш шаблон
     */
    public function fieldsToTable($data, $method = 'renderTable'){
        $string = '';
        if($data){
            foreach($data as $item){
                $string .= $this->$method($item);
            }
        }
        return $string;
 
    }
 
    /*
     * Шаблон для вывода полей в виде сложносочиненной шапки таблицы.
     * Метод не идеальный т.к сочетает в себе элементы логики и отображения, что не есть хорошо
     */
    public function renderTable($category){
        $table = '<td style="border: 1px solid;">';
        if(isset($category['childs'])){
            $table .= '<td style="border: 1px solid;" colspan="'.$this->childs($category['id']).'">';
            $table .= ' [ <strong>Идентификатор - </strong> '.$category['id'].', <strong>Поле - </strong><i>' . $category['name'] . '</i> ] ';
            $table .= '<br>';
            $table .= '<table class="">';
 
            $table .= ' [ <strong>Родитель - </strong> '.(($this->parent($category['internal_key']) != 0) ? $this->parent($category['internal_key']) : 'Нету') .' ] ';
            $table .= '<br>';
            $table .= ' [ <strong>Порядок сортировки в семействе - </strong> '.$category['sort_order'].' ] ';
 
            $table .=  $this->fieldsToTable($category['childs']);
            $table .= '</table></td>';
        } else {
            $table .= ' [ <strong>Идентификатор - </strong> '.$category['id'].', <strong>Поле - </strong><i>' . $category['name'] . '</i> ] ';
            $table .= '<br>';
            $table .= ' [ <strong>Родитель - </strong> '.(($this->parent($category['internal_key']) != 0) ? $this->parent($category['internal_key']) : 'Нету') .' ] ';
            $table .= '<br>';
            $table .= ' [ <strong>Порядок сортировки в семействе - </strong> '.$category['sort_order'].' ] ';
        }
        $table .= '</td>';
        return $table;
    }
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    public function renderTableVertical($category){
        $menu = '<tr><td>'.$category['name'];
 
        if(isset($category['childs'])){
            $menu .= '<td colspan="'.$this->childs($category['id']).'"><table>'. $this->fieldsToTable($category['childs'], 'renderTableVertical') .'</table></td>';
        }
        $menu .= '</td></tr>';
 
        return $menu;
    }
 
    /*
     * Выводим полную информацию о таблице
     */
    public function showTableInfo($tablename, $db = 'jemlet', $extra = true){
        $table = '';
        $c= 0;
        if(isset($tablename)) {
            if(!empty($db)){
                $this->mysqli->select_db($db);
            }
            $res = $this->mysqli->query('SHOW TABLES');
            if (!$res) {
                echo $this->mysqli->error;
            }
            if ($res->num_rows) {
                $ins = $this->getDescriptionTable($tablename, $db);
                if ($ins->num_rows > 0) {
                    $table .= "<h3>Таблица: <i>" . $tablename . "</i> База данных <i>" . $db . "</i></h3><br>\n";
                    $table .= "<table>\n";
                    while ($once = $ins->fetch_assoc()) {
                        $c++;
                        $table .= "<tr>\n";
                        foreach ($once as $k => $v) {
                            if ($c == 1) {
                                $table .= "<td style=\"border: 1px solid;\" width=100>";
                                $table .= htmlspecialchars($k) . '<br><br />' . htmlspecialchars($v);
                                $table .= "</td>\n";
                                //echo htmlspecialchars($k).'="'.htmlspecialchars($v).'"';
                            } else {
                                $table .= "<td style=\"border: 1px solid;\">";
                                $table .= htmlspecialchars($v);
                                $table .= "</td>\n";
                            }
                        }
                        $table .= "</tr>\n";
                    }
                    $table .= "</table>";
                    echo $table;
                    if($extra){
                        $extraquery = $this->mysqli->query('SELECT * FROM information_schema.tables WHERE table_name = \''.$tablename.'\'');
                        $m = $extraquery->fetch_assoc();
                        echo '<h3>Дополнительная информация о таблице</h3>';
                        $this->p($m);
                    }
                } else {
                    echo 'Таблицы: ' . $tablename . ' в Базе Данных: ' . $db . ' не существует!';
                }
            } else {
                echo 'Таблиц нету(((';
            }
        }
    }
 
    public function showTable($tablename, $db = 'jemlet'){
        if(!empty($db)){
            $this->mysqli->select_db($db);
        }
        $data = $this->mysqli->query('SELECT * FROM '.$this->e($tablename).'');
        return ($data->num_rows > 0) ? $data: false;
    }
 
    public function getDescriptionTable($tablename, $db = 'jemlet'){
        $data =  $this->mysqli->query('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = \'' . $this->e($db) . '\' AND TABLE_NAME =\'' . $this->e($tablename) . '\'; ');
        return ($data->num_rows > 0) ? $data: false;
    }
 
    public function e($escaperstring){
        return $this->mysqli->escape_string($escaperstring);
    }
 
    /*
     * @inheritdoc
     */
    public function getDescription($id, $internal){
        /*
         * ToDo ...
         */
    }
 
    public function p($massive){
        echo '<pre>';
        print_r($massive);
        echo '</pre>';
    }
 
}
Вот как выводим:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$table = new Table();
$dataset  = $table->getFields();
$tree = $table->getDataTree($dataset);
$table1 = $table->fieldsToTable($tree);
$table2 = $table->fieldsToTable($tree, 'renderTableVertical');
?>
 
<h4 align="center">Горизонтальный тип</h4>
    <?= '<table class="">'. $table1 .'</table>';?>
    <br><br>    <h4 align="center">Вертикальный тип</h4><br>
    <hr><br>
    <?= '<table class="">'. $table2 .'</table>';?>
    <br>
Знаю, все выглядит ужасно Но писалось на скоростях, а рефракторить не вижу смысла не на продакшн)

тут не влезли массивы, сообщением ниже посмотреть

В итоге выходит нечто ужасное (См. Прикрепленное изображение), там в table вложены table
Прикрепляю так же все приложение в архиве, на комментарии не обращайте внимание, делал для друга, который ничего не смыслит ни PHP ни в программировании, хотя по качеству кода видимо и я((

В архиве с приложением в config.php нужно вписать параметры для подключения к БД
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
08.11.2017, 09:55  [ТС]
Идея в том, что я получаю из набора данных:

Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
Array
(
    [1] => Array
        (
            [id] => 1
            [internal_key] => 0
            [sort_order] => 1
            [status] => 1
            [field_name] => name
            [name] => Название
            [field_type] => varchar
            [lenght] => 255
        )
 
    [2] => Array
        (
            [id] => 2
            [internal_key] => 0
            [sort_order] => 2
            [status] => 1
            [field_name] => type
            [name] => Тип
            [field_type] => varchar
            [lenght] => 255
        )
 
    [3] => Array
        (
            [id] => 3
            [internal_key] => 0
            [sort_order] => 4
            [status] => 1
            [field_name] => author
            [name] => Автор
            [field_type] => varchar
            [lenght] => 100
        )
 
    [4] => Array
        (
            [id] => 4
            [internal_key] => 0
            [sort_order] => 3
            [status] => 1
            [field_name] => locate
            [name] => Место
            [field_type] => varchar
            [lenght] => 255
        )
 
    [5] => Array
        (
            [id] => 5
            [internal_key] => 1
            [sort_order] => 2
            [status] => 1
            [field_name] => un_name
            [name] => Под Название
            [field_type] => varchar
            [lenght] => 100
        )
 
    [6] => Array
        (
            [id] => 6
            [internal_key] => 1
            [sort_order] => 1
            [status] => 1
            [field_name] => un_name_two
            [name] => Под Название
            [field_type] => varchar
            [lenght] => 100
        )
 
    [7] => Array
        (
            [id] => 7
            [internal_key] => 2
            [sort_order] => 1
            [status] => 1
            [field_name] => un_type
            [name] => Под Тип
            [field_type] => varchar
            [lenght] => 100
        )
 
    [8] => Array
        (
            [id] => 8
            [internal_key] => 9
            [sort_order] => 1
            [status] => 1
            [field_name] => un_un_type
            [name] => Под Под Тип
            [field_type] => varchar
            [lenght] => 10
        )
 
    [9] => Array
        (
            [id] => 9
            [internal_key] => 2
            [sort_order] => 2
            [status] => 1
            [field_name] => un_type_2
            [name] => Под Тип 2
            [field_type] => varchar
            [lenght] => 100
        )
 
    [10] => Array
        (
            [id] => 10
            [internal_key] => 2
            [sort_order] => 3
            [status] => 1
            [field_name] => un_type_3
            [name] => Под Тип 3
            [field_type] => int
            [lenght] => 10
        )
 
    [11] => Array
        (
            [id] => 11
            [internal_key] => 5
            [sort_order] => 2
            [status] => 1
            [field_name] => un_un_name_1_1
            [name] => Под под название 
            [field_type] => int
            [lenght] => 10
        )
 
    [12] => Array
        (
            [id] => 12
            [internal_key] => 5
            [sort_order] => 1
            [status] => 1
            [field_name] => un_un_name_2_1
            [name] => Под под название 
            [field_type] => varchar
            [lenght] => 100
        )
 
    [13] => Array
        (
            [id] => 13
            [internal_key] => 9
            [sort_order] => 2
            [status] => 1
            [field_name] => un_un_type 2
            [name] => Под Под тип
            [field_type] => varchar
            [lenght] => 255
        )
 
)


сортированный вложенный массив с child-parent:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
Array
(
    [1] => Array
        (
            [id] => 1
            [internal_key] => 0
            [sort_order] => 1
            [status] => 1
            [field_name] => name
            [name] => Название
            [field_type] => varchar
            [lenght] => 255
            [childs] => Array
                (
                    [6] => Array
                        (
                            [id] => 6
                            [internal_key] => 1
                            [sort_order] => 1
                            [status] => 1
                            [field_name] => un_name_two
                            [name] => Под Название
                            [field_type] => varchar
                            [lenght] => 100
                        )
 
                    [5] => Array
                        (
                            [id] => 5
                            [internal_key] => 1
                            [sort_order] => 2
                            [status] => 1
                            [field_name] => un_name
                            [name] => Под Название
                            [field_type] => varchar
                            [lenght] => 100
                            [childs] => Array
                                (
                                    [12] => Array
                                        (
                                            [id] => 12
                                            [internal_key] => 5
                                            [sort_order] => 1
                                            [status] => 1
                                            [field_name] => un_un_name_2_1
                                            [name] => Под под название 
                                            [field_type] => varchar
                                            [lenght] => 100
                                        )
 
                                    [11] => Array
                                        (
                                            [id] => 11
                                            [internal_key] => 5
                                            [sort_order] => 2
                                            [status] => 1
                                            [field_name] => un_un_name_1_1
                                            [name] => Под под название 
                                            [field_type] => int
                                            [lenght] => 10
                                        )
 
                                )
 
                        )
 
                )
 
        )
 
    [2] => Array
        (
            [id] => 2
            [internal_key] => 0
            [sort_order] => 2
            [status] => 1
            [field_name] => type
            [name] => Тип
            [field_type] => varchar
            [lenght] => 255
            [childs] => Array
                (
                    [7] => Array
                        (
                            [id] => 7
                            [internal_key] => 2
                            [sort_order] => 1
                            [status] => 1
                            [field_name] => un_type
                            [name] => Под Тип
                            [field_type] => varchar
                            [lenght] => 100
                        )
 
                    [9] => Array
                        (
                            [id] => 9
                            [internal_key] => 2
                            [sort_order] => 2
                            [status] => 1
                            [field_name] => un_type_2
                            [name] => Под Тип 2
                            [field_type] => varchar
                            [lenght] => 100
                            [childs] => Array
                                (
                                    [8] => Array
                                        (
                                            [id] => 8
                                            [internal_key] => 9
                                            [sort_order] => 1
                                            [status] => 1
                                            [field_name] => un_un_type
                                            [name] => Под Под Тип
                                            [field_type] => varchar
                                            [lenght] => 10
                                        )
 
                                    [13] => Array
                                        (
                                            [id] => 13
                                            [internal_key] => 9
                                            [sort_order] => 2
                                            [status] => 1
                                            [field_name] => un_un_type 2
                                            [name] => Под Под тип
                                            [field_type] => varchar
                                            [lenght] => 255
                                        )
 
                                )
 
                        )
 
                    [10] => Array
                        (
                            [id] => 10
                            [internal_key] => 2
                            [sort_order] => 3
                            [status] => 1
                            [field_name] => un_type_3
                            [name] => Под Тип 3
                            [field_type] => int
                            [lenght] => 10
                        )
 
                )
 
        )
 
    [4] => Array
        (
            [id] => 4
            [internal_key] => 0
            [sort_order] => 3
            [status] => 1
            [field_name] => locate
            [name] => Место
            [field_type] => varchar
            [lenght] => 255
        )
 
    [3] => Array
        (
            [id] => 3
            [internal_key] => 0
            [sort_order] => 4
            [status] => 1
            [field_name] => author
            [name] => Автор
            [field_type] => varchar
            [lenght] => 100
        )
 
)


Добавлено через 6 минут
А вторая таблица с данным value_table пока лишь мои догадки как связать данные и шапку... Мб есть идеи получше
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 11:22
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//id,pId,name
$data = [
[0,-1,'F1'],
[1,-1,'F2'],
[2,-1,'F3'],
[3, 0,'F4'],
[4, 1,'F5'],
[5, 0,'F6'],
[6, 9,'F7'],
[7, 1,'F8'],
[8, 9,'F9'],
[9, 2,'F10'],
[10,2,'F11'],
[11,8,'F12'],
[12,8,'F13']
];
 
function pars($k){ //поиск родителя
    global $data;
    $res = false;
    foreach($data as $ind => $d) { if($d[0]==$k){ $res = $ind; break; } }
    return $res;
}
 
function chld($k){ //подсчет потомков
    global $data;
    $res = 0;
    foreach($data as $d) { if($d[1]==$k){ $kek = chld($d[0]); $res += $kek==0?1:$kek; } }
    return $res;
}
 
foreach($data as &$d) {
    if($d[1]==-1)
        $d[3] = 0;
    else {
        $p = $d[1]; $i = 0; 
        while(pars($p)!==false) { $p = $data[pars($p)][1]; $i++; }
        $d[3] = $i;
    }
    $d[4] = chld($d[0]);
}
 
$rows = [];
 
foreach($data as $d){
    if(!isset($rows[$d[3]])) $rows[$d[3]] = '';
    $rows[$d[3]] .= '<td colspan='.$d[4].'>'.$d[2].'</td>';
}
 
echo '<table border=1>';
foreach($rows as $r) echo '<tr>'.$r.'</tr>';
echo '</table>';
с подсчетом родителей и потомков готово, теперь только надо думать над сортировкой колонок и и создания также пустых полей с нужным отсупом, а то без них же будет съезжать(синие клетки слева от желтых).

а у тебя уже куча таких таблиц и выхода нет придумать другой формат хранения шапки?
потому что если нет, то лучше придумать другую реализацию, то что выбрал ты неудачно, и очень заморочено.
я бы использовал иерархию в виде материальных путей, легко считать предков и потомков и сразу отсортировать ячейки в нужном порядке, останется только вколхозить пустые синие клетки. плюс у тебя если по ошибке задать допустим
две записи 0 1 и 1 0, получится ячейки указывают друг на друга и программа построения впадет в бесконечный цикл

Добавлено через 3 минуты
архив твой не открывается и спойлеры тоже (наверное много ты туда текста впихнул) перезалей куда нить на яндекс например
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
08.11.2017, 11:29  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
теперь только надо думать над сортировкой колонок
Для этого я добавил еще одно поле sort_order и метод:
PHP
1
2
3
4
5
6
7
8
9
/*
     * Функция сравнения для сортировки
     */
    public function sortMassive($a, $b, $sort_field = 'ключ массива в данном случае'){
        if ($a[$sort_field] == $b[$sort_field]) {
            return 0;
        }
        return ($a[$sort_field] < $b[$sort_field]) ? -1 : 1;
    }
Цитата Сообщение от Уф Посмотреть сообщение
а у тебя уже куча таких таблиц и выхода нет придумать другой формат хранения шапки?
Именно в таком виде мне указали в начале, я и следовал слепо...

Цитата Сообщение от Уф Посмотреть сообщение
я бы использовал иерархию в виде материальных путей
вот тут то я не до конца понял, как это?

Цитата Сообщение от Уф Посмотреть сообщение
останется только вколхозить пустые синие клетки
Это по моей версии и в моей реализации самая геморойная проблема, как их туда приписать вообще, т.е нужно в конечные узлы веток(точки конечные) уже приписывать данные, ядумал с помощью JS уже как-то это делать, задавая идентификаторы ячейкам и под ними уже как-то добавлять...

Цитата Сообщение от Уф Посмотреть сообщение
две записи 0 1 и 1 0, получится ячейки указывают друг на друга и программа построения впадет в бесконечный цикл
Действительно, чет не подумал

Добавлено через 1 минуту
Цитата Сообщение от Уф Посмотреть сообщение
архив твой не открывается и спойлеры тоже (наверное много ты туда текста впихнул) перезалей куда нить на яндекс например
Вот:https://yadi.sk/d/3zsdIsa83PWEXV

Там же можно посмотреть и массивы, в каком виде и т.д
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 11:45
спойлеры открылись, но лучше ты мне данные выведи функцией
PHP
1
echo json_encode($data);
а то твой дамп print_r мне назад в скрипт не воткнуть никак

Добавлено через 2 минуты
материальные пути это ты указываешь в поле ключ просто строкой номера
PHP
1
2
3
4
5
6
7
8
'1'
'1-2'
'1-3'
'1-3-1'
'1-3-1-1'
'1-3-1-2'
'1-4'
'2'
просто через тире.

Добавлено через 1 минуту
архив пишет поврежден, ни Winrar ни 7-zip у меня его не открывает. лучше в зип запакуй.
и в итоге остался вопрос есть ли возможность сменить формат хранения или таблиц уже миллион готовых в базе?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 13:10
Все. задача с шапкой решена. Если взять данные в нужном порядке и тянуть ячейки вниз, а не заполнять слева то выходит нормально
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//id,pId,name
$data = [
[0,-1,'F1'],
    [3, 0,'F4'],
    [5, 0,'F6'],
[1,-1,'F2'],
    [7, 1,'F8'],
    [4, 1,'F5'],
[2,-1,'F3'],
    [10,2,'F11'],
    [9, 2,'F10'],
        [6, 9,'F7'],
        [8, 9,'F9'],
            [12,8,'F13'],
            [11,8,'F12']
];
 
function pars($k){ //поиск родителя
    global $data;
    $res = false;
    foreach($data as $ind => $d) { if($d[0]==$k){ $res = $ind; break; } }
    return $res;
}
 
function chld($k){ //подсчет потомков
    global $data;
    $res = 0;
    foreach($data as &$d) {
        if($d[1]==$k){
            $kek = chld($d[0]);
            if($kek==0){
                $res += 1;
                $d[5]=true;
            } else {
                $res += $kek;
            }
        }
    }
    return $res;
}
 
$maxlvl = 0;
foreach($data as &$d) {
    if($d[1]==-1)
        $d[3] = 0;
    else {
        $p = $d[1]; $i = 0; 
        while(pars($p)!==false) { $p = $data[pars($p)][1]; $i++; }
        $d[3] = $i;
        if($maxlvl<$i) $maxlvl=$i;
    }
    $d[4] = chld($d[0]);
}
 
$rows = [];
 
foreach($data as $d){
    if(!isset($rows[$d[3]])) $rows[$d[3]] = '';
    $rows[$d[3]] .= '<td colspan='.$d[4].($d[5]?' rowspan='.($maxlvl-$d[4]):' ').'>'.$d[2].'</td>';
}
 
echo '<table border=1>';
foreach($rows as $r) echo '<tr>'.$r.'</tr>';
echo '</table>';
если порядок в шапки верный, то сами данные приписывай ниже просто по порядку
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 13:11
можно попробовать алгоритм на твоей шапки, ток выложи в json_encode и я подправлю свой скрипт
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
08.11.2017, 17:02  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
ток выложи в json_encode и я подправлю свой скрипт
Вот вот такой массив JSON:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{  
   "1":{  
      "id":"1",
      "internal_key":"0",
      "sort_order":"1",
      "status":"1",
      "field_name":"name",
      "name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"255"
   },
   "2":{  
      "id":"2",
      "internal_key":"0",
      "sort_order":"2",
      "status":"1",
      "field_name":"type",
      "name":"\u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"255"
   },
   "3":{  
      "id":"3",
      "internal_key":"0",
      "sort_order":"4",
      "status":"1",
      "field_name":"author",
      "name":"\u0410\u0432\u0442\u043e\u0440",
      "field_type":"varchar",
      "lenght":"100"
   },
   "4":{  
      "id":"4",
      "internal_key":"0",
      "sort_order":"3",
      "status":"1",
      "field_name":"locate",
      "name":"\u041c\u0435\u0441\u0442\u043e",
      "field_type":"varchar",
      "lenght":"255"
   },
   "5":{  
      "id":"5",
      "internal_key":"1",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_name",
      "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"100"
   },
   "6":{  
      "id":"6",
      "internal_key":"1",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_name_two",
      "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"100"
   },
   "7":{  
      "id":"7",
      "internal_key":"2",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_type",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"100"
   },
   "8":{  
      "id":"8",
      "internal_key":"9",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_un_type",
      "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"10"
   },
   "9":{  
      "id":"9",
      "internal_key":"2",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_type_2",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 2",
      "field_type":"varchar",
      "lenght":"100"
   },
   "10":{  
      "id":"10",
      "internal_key":"2",
      "sort_order":"3",
      "status":"1",
      "field_name":"un_type_3",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 3",
      "field_type":"int",
      "lenght":"10"
   },
   "11":{  
      "id":"11",
      "internal_key":"5",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_un_name_1_1",
      "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
      "field_type":"int",
      "lenght":"10"
   },
   "12":{  
      "id":"12",
      "internal_key":"5",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_un_name_2_1",
      "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
      "field_type":"varchar",
      "lenght":"100"
   },
   "13":{  
      "id":"13",
      "internal_key":"9",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_un_type 2",
      "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0442\u0438\u043f",
      "field_type":"varchar",
      "lenght":"255"
   }
}
вот мой вариант сортированного массива:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
{  
   "1":{  
      "id":"1",
      "internal_key":"0",
      "sort_order":"1",
      "status":"1",
      "field_name":"name",
      "name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"255",
      "childs":{  
         "6":{  
            "id":"6",
            "internal_key":"1",
            "sort_order":"1",
            "status":"1",
            "field_name":"un_name_two",
            "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
            "field_type":"varchar",
            "lenght":"100"
         },
         "5":{  
            "id":"5",
            "internal_key":"1",
            "sort_order":"2",
            "status":"1",
            "field_name":"un_name",
            "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
            "field_type":"varchar",
            "lenght":"100",
            "childs":{  
               "12":{  
                  "id":"12",
                  "internal_key":"5",
                  "sort_order":"1",
                  "status":"1",
                  "field_name":"un_un_name_2_1",
                  "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
                  "field_type":"varchar",
                  "lenght":"100"
               },
               "11":{  
                  "id":"11",
                  "internal_key":"5",
                  "sort_order":"2",
                  "status":"1",
                  "field_name":"un_un_name_1_1",
                  "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
                  "field_type":"int",
                  "lenght":"10"
               }
            }
         }
      }
   },
   "2":{  
      "id":"2",
      "internal_key":"0",
      "sort_order":"2",
      "status":"1",
      "field_name":"type",
      "name":"\u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"255",
      "childs":{  
         "7":{  
            "id":"7",
            "internal_key":"2",
            "sort_order":"1",
            "status":"1",
            "field_name":"un_type",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f",
            "field_type":"varchar",
            "lenght":"100"
         },
         "9":{  
            "id":"9",
            "internal_key":"2",
            "sort_order":"2",
            "status":"1",
            "field_name":"un_type_2",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 2",
            "field_type":"varchar",
            "lenght":"100",
            "childs":{  
               "8":{  
                  "id":"8",
                  "internal_key":"9",
                  "sort_order":"1",
                  "status":"1",
                  "field_name":"un_un_type",
                  "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0422\u0438\u043f",
                  "field_type":"varchar",
                  "lenght":"10"
               },
               "13":{  
                  "id":"13",
                  "internal_key":"9",
                  "sort_order":"2",
                  "status":"1",
                  "field_name":"un_un_type 2",
                  "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0442\u0438\u043f",
                  "field_type":"varchar",
                  "lenght":"255"
               }
            }
         },
         "10":{  
            "id":"10",
            "internal_key":"2",
            "sort_order":"3",
            "status":"1",
            "field_name":"un_type_3",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 3",
            "field_type":"int",
            "lenght":"10"
         }
      }
   },
   "4":{  
      "id":"4",
      "internal_key":"0",
      "sort_order":"3",
      "status":"1",
      "field_name":"locate",
      "name":"\u041c\u0435\u0441\u0442\u043e",
      "field_type":"varchar",
      "lenght":"255"
   },
   "3":{  
      "id":"3",
      "internal_key":"0",
      "sort_order":"4",
      "status":"1",
      "field_name":"author",
      "name":"\u0410\u0432\u0442\u043e\u0440",
      "field_type":"varchar",
      "lenght":"100"
   }
}
Цитата Сообщение от Уф Посмотреть сообщение
если порядок в шапки верный
Дело как раз в том, чтобы можно было спокойно поменять местами, уровнями и порядком следования, возможно даже некоторый интерфейс, но пока без реализации вполне можно обойтись просто набором данных.

Цитата Сообщение от Уф Посмотреть сообщение
архив пишет поврежден, ни Winrar ни 7-zip у меня его не открывает. лучше в зип запакуй.
Дело сделано: https://yadi.sk/d/CqTs9Sru3PWt4g

Цитата Сообщение от Уф Посмотреть сообщение
и в итоге остался вопрос есть ли возможность сменить формат хранения или таблиц уже миллион готовых в базе?
Думаю можно, как максимально удобно и просто реализовать? Дело еще не зашло так далеко в основном вопрос реализации сейчас и всего-то одна таблица.

А как вы предлагаете связывать данные? Вышло у вас отлично!

Не по теме:


Мы в ветви jQuery, а дело пока все в PHP :)



Добавлено через 2 минуты
Вот еще раз, на всякий дамп базы:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
--
-- Структура таблицы `description_table`
--
 
CREATE TABLE IF NOT EXISTS `description_table` (
  `id` INT(11) NOT NULL COMMENT 'Идентификатор',
  `internal_key` INT(12) NOT NULL DEFAULT '0' COMMENT 'Внутренний ключ к полям таблицы',
  `sort_order` INT(12) NOT NULL COMMENT 'Сортировка полей',
  `status` INT(1) NOT NULL DEFAULT '1' COMMENT 'Стаус: 1 - активный(создавать), 0 - не создавать(для отчета) ',
  `field_name` VARCHAR(255) NOT NULL COMMENT 'Название поля',
  `name` VARCHAR(255) NOT NULL,
  `field_type` VARCHAR(50) NOT NULL COMMENT 'Тип поля',
  `lenght` INT(3) NOT NULL COMMENT 'Длина поля'
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
 
--
-- Дамп данных таблицы `description_table`
--
 
INSERT INTO `description_table` (`id`, `internal_key`, `sort_order`, `status`, `field_name`, `name`, `field_type`, `lenght`) VALUES
(1, 0, 1, 1, 'f1', 'F1', 'varchar', 255),
(2, 0, 2, 1, 'f2', 'F2', 'varchar', 255),
(3, 0, 4, 1, 'f3', 'F3', 'varchar', 100),
(4, 0, 3, 1, 'f4', 'F4', 'varchar', 255),
(5, 1, 2, 1, 'f5', 'F5', 'varchar', 100),
(6, 1, 1, 1, 'f6', 'F6', 'varchar', 100),
(7, 2, 1, 1, 'f7', 'F7', 'varchar', 100),
(8, 9, 1, 1, 'f8', 'F8', 'varchar', 10),
(9, 2, 2, 1, 'f9', 'F9', 'varchar', 100),
(10, 2, 3, 1, 'f10', 'F10', 'int', 10),
(11, 5, 2, 1, 'f11', 'F11 ', 'int', 10),
(12, 5, 1, 1, 'f12', 'F12 ', 'varchar', 100);
 
--
-- Индексы сохранённых таблиц
--
 
--
-- Индексы таблицы `description_table`
--
ALTER TABLE `description_table`
  ADD PRIMARY KEY (`id`);
 
--
-- AUTO_INCREMENT для сохранённых таблиц
--
 
--
-- AUTO_INCREMENT для таблицы `description_table`
--
ALTER TABLE `description_table`
  MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',AUTO_INCREMENT=13;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Добавлено через 11 минут
Хотел бы внести ясность:
`id` - понятно, ключ
`internal_key` - внутренний ключ parent_id
`sort_order` - сортировка на каждом уровне иерархии
`status` - статус, физическое поле или условное (необязательный)
`field_name` - имя поля(необязательный)
`name` - наименование на кириллице
`field_type` - тип поля (необязательный)
`lenght` - длина поля (необязательный)

все что необязательно - это делалось чтобы запросом(CREATE TABLE) из такого шаблона создавать таблицы в БД, для другого дела, а может и можно, сначала создать таблицу а заполненные данные уже как раз "вписывать" под шапкой, синяя область на картинке. Все это реализовано в приложении в архиве, кроме сложной шапки и данных под ними(

Добавлено через 4 минуты
Мой косяк, вот новая ссылка: https://yadi.sk/d/E6lLg_Yi3PWwL4
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 17:53
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
//id,pId,name
$data = json_decode('{  
    "1":{  
        "id":"1",
        "internal_key":"0",
        "sort_order":"1",
        "status":"1",
        "field_name":"name",
        "name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
        "field_type":"varchar",
        "lenght":"255"
    },
        "6":{  
            "id":"6",
            "internal_key":"1",
            "sort_order":"1",
            "status":"1",
            "field_name":"un_name_two",
            "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
            "field_type":"varchar",
            "lenght":"100"
        },
        "5":{  
            "id":"5",
            "internal_key":"1",
            "sort_order":"2",
            "status":"1",
            "field_name":"un_name",
            "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
            "field_type":"varchar",
            "lenght":"100"
        },
            "12":{  
                "id":"12",
                "internal_key":"5",
                "sort_order":"1",
                "status":"1",
                "field_name":"un_un_name_2_1",
                "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
                "field_type":"varchar",
                "lenght":"100"
            },
            "11":{  
                "id":"11",
                "internal_key":"5",
                "sort_order":"2",
                "status":"1",
                "field_name":"un_un_name_1_1",
                "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
                "field_type":"int",
                "lenght":"10"
            },
    "2":{  
        "id":"2",
        "internal_key":"0",
        "sort_order":"2",
        "status":"1",
        "field_name":"type",
        "name":"\u0422\u0438\u043f",
        "field_type":"varchar",
        "lenght":"255"
    },
        "7":{  
            "id":"7",
            "internal_key":"2",
            "sort_order":"1",
            "status":"1",
            "field_name":"un_type",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f",
            "field_type":"varchar",
            "lenght":"100"
        },
        "9":{  
            "id":"9",
            "internal_key":"2",
            "sort_order":"2",
            "status":"1",
            "field_name":"un_type_2",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 2",
            "field_type":"varchar",
            "lenght":"100"
        },
            "8":{
                "id":"8",
                "internal_key":"9",
                "sort_order":"1",
                "status":"1",
                "field_name":"un_un_type",
                "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0422\u0438\u043f",
                "field_type":"varchar",
                "lenght":"10"
            },
            "13":{  
                "id":"13",
                "internal_key":"9",
                "sort_order":"2",
                "status":"1",
                "field_name":"un_un_type 2",
                "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0442\u0438\u043f",
                "field_type":"varchar",
                "lenght":"255"
            },
        "10":{  
            "id":"10",
            "internal_key":"2",
            "sort_order":"3",
            "status":"1",
            "field_name":"un_type_3",
            "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 3",
            "field_type":"int",
            "lenght":"10"
        },
    "4":{  
        "id":"4",
        "internal_key":"0",
        "sort_order":"3",
        "status":"1",
        "field_name":"locate",
        "name":"\u041c\u0435\u0441\u0442\u043e",
        "field_type":"varchar",
        "lenght":"255"
    },
    "3":{  
        "id":"3",
        "internal_key":"0",
        "sort_order":"4",
        "status":"1",
        "field_name":"author",
        "name":"\u0410\u0432\u0442\u043e\u0440",
        "field_type":"varchar",
        "lenght":"100"
    }
}',true);
 
 
function pars($k){ //поиск родителя
    global $data;
    $res = false;
    foreach($data as $ind => $d) { if($d['id']==$k){ $res = $ind; break; } }
    return $res;
}
 
function chld($k){ //подсчет потомков
    global $data;
    $res = 0;
    foreach($data as &$d) {
        if($d['internal_key']==$k){
            $kek = chld($d['id']);
            if($kek==0){
                $res += 1;
                $d['ischld']=true;
            } else {
                $res += $kek;
            }
        }
    }
    return $res;
}
 
$maxlvl = 0;
foreach($data as &$d) {
    if($d['internal_key']==0)
        $d['qtyp'] = 0;
    else {
        $p = $d['internal_key']; $i = 0; 
        while(pars($p)!==false) { $p = $data[pars($p)]['internal_key']; $i++; }
        $d['qtyp'] = $i;
        if($maxlvl<$i) $maxlvl=$i;
    }
    $d['qtyc'] = chld($d['id']);
}
 
$rows = [];
 
foreach($data as $d){
    if(!isset($rows[$d['qtyp']])) $rows[$d['qtyp']] = '';
    $rows[$d['qtyp']] .= '<td colspan='.$d['qtyc'].($d['ischld']?' rowspan='.($maxlvl-$d['qtyp']):' ').'>'.$d['name'].'</td>';
}
 
echo '<table border=1>';
foreach($rows as $r) echo '<tr>'.$r.'</tr>';
echo '</table>';
не понял до конца как рассортировать, дома еще посмотрю, но лучше подумаю над более удобным форматом, сорт ордер как я понял у тебя внутри уровня, а не глобальный

Добавлено через 2 минуты
и на счет слова "динамическая" в названии темы. эти шапки будут редактировать постоянно или ты один раз их придумал для всех таблиц и всё?
1
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
08.11.2017, 17:58  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
сорт ордер как я понял у тебя внутри уровня
да так и есть, на каждом уровне

Цитата Сообщение от Уф Посмотреть сообщение
не понял до конца как рассортировать
Рассортировать? Вот исходный массив, без ничего из БД, сели я правильно понял:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{  
   "1":{  
      "id":"1",
      "internal_key":"0",
      "sort_order":"1",
      "status":"1",
      "field_name":"name",
      "name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"255"
   },
   "2":{  
      "id":"2",
      "internal_key":"0",
      "sort_order":"2",
      "status":"1",
      "field_name":"type",
      "name":"\u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"255"
   },
   "3":{  
      "id":"3",
      "internal_key":"0",
      "sort_order":"4",
      "status":"1",
      "field_name":"author",
      "name":"\u0410\u0432\u0442\u043e\u0440",
      "field_type":"varchar",
      "lenght":"100"
   },
   "4":{  
      "id":"4",
      "internal_key":"0",
      "sort_order":"3",
      "status":"1",
      "field_name":"locate",
      "name":"\u041c\u0435\u0441\u0442\u043e",
      "field_type":"varchar",
      "lenght":"255"
   },
   "5":{  
      "id":"5",
      "internal_key":"1",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_name",
      "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"100"
   },
   "6":{  
      "id":"6",
      "internal_key":"1",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_name_two",
      "name":"\u041f\u043e\u0434 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
      "field_type":"varchar",
      "lenght":"100"
   },
   "7":{  
      "id":"7",
      "internal_key":"2",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_type",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"100"
   },
   "8":{  
      "id":"8",
      "internal_key":"9",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_un_type",
      "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0422\u0438\u043f",
      "field_type":"varchar",
      "lenght":"10"
   },
   "9":{  
      "id":"9",
      "internal_key":"2",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_type_2",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 2",
      "field_type":"varchar",
      "lenght":"100"
   },
   "10":{  
      "id":"10",
      "internal_key":"2",
      "sort_order":"3",
      "status":"1",
      "field_name":"un_type_3",
      "name":"\u041f\u043e\u0434 \u0422\u0438\u043f 3",
      "field_type":"int",
      "lenght":"10"
   },
   "11":{  
      "id":"11",
      "internal_key":"5",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_un_name_1_1",
      "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
      "field_type":"int",
      "lenght":"10"
   },
   "12":{  
      "id":"12",
      "internal_key":"5",
      "sort_order":"1",
      "status":"1",
      "field_name":"un_un_name_2_1",
      "name":"\u041f\u043e\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 ",
      "field_type":"varchar",
      "lenght":"100"
   },
   "13":{  
      "id":"13",
      "internal_key":"9",
      "sort_order":"2",
      "status":"1",
      "field_name":"un_un_type 2",
      "name":"\u041f\u043e\u0434 \u041f\u043e\u0434 \u0442\u0438\u043f",
      "field_type":"varchar",
      "lenght":"255"
   }
}
с помощью функции sortMassive, уже получаю сортированный массив, но сначала еще преобразовываю, делаю ключами массива id, а потом уже получаю дерево(tree)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
     * Функция сравнения для сортировки
     */
    public function sortMassive($a, $b, $sort_field = 'sort_order'){
        if ($a[$sort_field] == $b[$sort_field]) {
            return 0;
        }
        return ($a[$sort_field] < $b[$sort_field]) ? -1 : 1;
    }
 
    /*
     * Получаем массив нашей таблицы из БД
     */
    public function getFields(){
        $sql = 'SELECT * FROM `description_table`';
        $res = $this->mysqli->query($sql);
 
        if($res->num_rows > 0) {
            //Создаем масив где ключ массива является ID поля
            $cat = [];
            while ($row = $res->fetch_assoc()) {
                $cat[$row['id']] = $row;
            }
            return $cat;
        }
        return null;
    }
 
    /*
     * Метод построения сортированного дерева из массива
     */
    public function getDataTree($dataset) {
        $tree = [];
        if($dataset) {
            uasort($dataset, ['Table', 'sortMassive']);  // вот тут сортирую методом sotrMassive выше
            foreach ($dataset as $id => &$node) {
                //Если нет вложений
                if (!$node['internal_key']) {
                    $tree[$id] = &$node;
                } else {
                    //Если есть потомки то перебераем массив
                    $dataset[$node['internal_key']]['childs'][$id] = &$node;
                }
            }
            return $tree;
        }
        return null;
    }
Добавлено через 3 минуты
Цитата Сообщение от Уф Посмотреть сообщение
и на счет слова "динамическая" в названии темы. эти шапки будут редактировать постоянно или ты один раз их придумал для всех таблиц и всё?
Ну динамический в том смысле, что не пришлось бы переделывать все данные заново, например, сортировку чисто по порядку добавления, для этого помогло бы поле sort_order, а так тупо берутся из базы и все, идея в том, что все это(данные) должно служить неким шаблоном, из которой можно "сочинять" разнообразные по виду и иерархии таблицы(главное с данными снизу, а то толку от них )
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
08.11.2017, 22:33
конечно вручную такие данные писать глупо, да и велика вероятность ошибки.
поэтому набросал пока простенький конструктор
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<html>
<head>
<title>headGenerator</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<style>
input[type=button] {
 border: 1px  solid #ccc;
 padding: 0px;
}
td.cell:nth-child(odd) {
 border: 3px solid green;
}
td.cell:nth-child(even) {
 border: 3px solid red;
}
</style>
</head>
<body>
<table id="shap" border=1>
<tr class="row"><td class="cell">
<table>
<tr><td>name</td><td><input class="tdname"></td></tr>
<tr><td>in db</td><td><input class="dbname"></td></tr>
<tr><td>cell</td>
<td>
    <input type="button" title="add cell left" class="cell_addl" value="+L">
    <input type="button" title="add cell right" class="cell_addr" value="+R">
    <input type="button" title="move cell left" class="cell_movl" value="&lArr; L">
    <input type="button" title="move cell right" class="cell_movr" value="R &rArr;">
    <input type="button" title="delete this cell" class="cell_del" value="DEL">
</td></tr>
<tr><td>row</td>
<td>
    <input type="button" title="add row up" class="row_addu" value="+U">
    <input type="button" title="add row down" class="row_addd" value="+D">
    <input type="button" title="move row up" class="row_movu" value="&uArr; U">
    <input type="button" title="move row down" class="row_movd" value="D &dArr;">
    <input type="button" title="delete this row" class="row_del" value="DEL">
</td></tr>
<tr><td>span</td>
<td>
    <input type="button" title="increase rowspan" class="rsp_add" value="+R">
    <span class="rsp_now">1</span>
    <input type="button" title="decrease rowspan" class="rsp_del" value="-R">
    <input type="button" title="increase colspan" class="csp_add" value="+C">
    <span class="csp_now">1</span>
    <input type="button" title="decrease colspan" class="csp_del" value="-C">
</td></tr>
</table>
</td></tr>
</table>
<script>
$('#shap').on('click','input.cell_addl',function(){
    var par = $(this).parents('td.cell');
    par.clone().insertBefore(par).find('input.tdname, input.dbname').val('');
});
$('#shap').on('click','input.cell_addr',function(){
    var par = $(this).parents('td.cell');
    par.clone().insertAfter(par).find('input.tdname, input.dbname').val('');
});
$('#shap').on('click','input.cell_movl',function(){
    var par = $(this).parents('td.cell');
    var mov = par.prev();
    if(mov) par.detach().insertBefore(mov);
});
$('#shap').on('click','input.cell_movr',function(){
    var par = $(this).parents('td.cell');
    var mov = par.next();
    if(mov) par.detach().insertAfter(mov);
});
$('#shap').on('click','input.cell_del',function(){
    var par = $(this).parents('td.cell');
    par.remove();
});
$('#shap').on('click','input.rsp_add',function(){
    var par = $(this).parents('td.cell');
    par[0].rowSpan += 1;
    par.find('span.rsp_now').html(par[0].rowSpan);
});
$('#shap').on('click','input.rsp_del',function(){
    var par = $(this).parents('td.cell');
    if(par[0].rowSpan>1) par[0].rowSpan -= 1;
    par.find('span.rsp_now').html(par[0].rowSpan);
});
$('#shap').on('click','input.csp_add',function(){
    var par = $(this).parents('td.cell');
    par[0].colSpan += 1;
    par.find('span.csp_now').html(par[0].colSpan);
});
$('#shap').on('click','input.csp_del',function(){
    var par = $(this).parents('td.cell');
    if(par[0].colSpan>1) par[0].colSpan -= 1;
    par.find('span.csp_now').html(par[0].colSpan);
});
$('#shap').on('click','input.row_addu',function(){
    var par = $(this).parents('tr.row');
    par.clone().insertBefore(par).find('input.tdname, input.dbname').val('');
});
$('#shap').on('click','input.row_addd',function(){
    var par = $(this).parents('tr.row');
    par.clone().insertAfter(par).find('input.tdname, input.dbname').val('');
});
$('#shap').on('click','input.row_movu',function(){
    var par = $(this).parents('tr.row');
    var mov = par.prev();
    if(mov) par.detach().insertBefore(mov);
});
$('#shap').on('click','input.row_movd',function(){
    var par = $(this).parents('tr.row');
    var mov = par.next();
    if(mov) par.detach().insertBefore(mov);
});
$('#shap').on('click','input.row_del',function(){
    var par = $(this).parents('tr.row');
    par.remove();
});
</script>
</body>
</html>
потом надо будет добавить возможность генерировать структуру из получившийся таблицы, и строить назад по ней.
в базе она всегда будет в нужном порядке, и мозг напрягать не надо.
1
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
09.11.2017, 12:36  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
поэтому набросал пока простенький конструктор
Прошу прощения, за долгий перерыв, никак возможности не было.

Интересный у вас конструктор получился, и правда визуально легче составлять. Но вот как пройтись по получившейся шапке и сохранить ее в БД?

И наверное самый главный вопрос, какую можно создать структуру, чтобы можно было привязывать к шапке данные? Ведь при смене порядка данные должны быть неразлучно закреплены с шапкой... Мой мозг уже ничего не придумывает, кроме как к определенной ячейке по идентификатору прибавлять строки снизу. Не знаю правильный метод, но что-то типа append наверное...

Добавлено через 39 секунд
По форме пройтись не проблема, но с таким еще не сталкивался
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
09.11.2017, 12:45
я тоже подумал, шапку нужно строить снизу, т.е. ты сначала именно перечисляешь все колонки данных типа
суп хлеб чай компот
потом сверху добавляешь строки и пишешь
еда напитки
и растягиваешь так чтобы они были над нужными ячейками
потом добавляешь еще одну растягиваешь на все 4 клетки и пишешь
пища
как то так. наверно надо и правда колонки данных брать как корень этой шапки, то есть ты выбираешь таблицу с данными к которой хочешь построить шапку, она выплевывает название колонок в базе, ты их менять не можешь, можешь только пересортировать и написать им русские названия, далее надо этой строкой уже строишь шапку из объединенных ячеек как тебе надо и сколько уровней надо.
потом если захочется поменять местами меняешь в первой строке порядок и ручками двигаешь все котегории в верхних слоях как тебе надо пока не получишь желаемую структуру
делать чтобы они автоматизированно весь верх двигался за колонкой очень заморочено и сложно будет.
а так кнопки управления можно не в каждой ячейке сделать, а снизу а щелкаешь только мышкой выделяешь ячейку и ей параметры выствляешь. так нагляднее в итоге шаблон будет в конструкторе
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
10.11.2017, 21:18  [ТС]
Цитата Сообщение от Уф Посмотреть сообщение
я тоже подумал, шапку нужно строить снизу
Чего только не попробовал, но без jQuery здесь никуда)) Я правильно понимаю, что нужно использовать что-то типа:
JavaScript
1
2
3
4
$(row).find('td:first')
.parent()
.child()
.prev()
?

Вот, я объединил вашу реализацию с БД:
- Прикрепляю дамп Базы;
- Прикрепляю архив с приложением;
-- Конфигурация config.php
-- j.json c массивом
-- Table.php класс Table, тут все основное
-- index.php понятно, там несколько способов создания шапки

В предпоследней таблице, с желтыми ячейками то, что сейчас хочу сказать, т.е с add data добавлять строки, таким же образом возможно ли задать <td id="row-13"... и к нему уже добавлять, что-то типа:
JavaScript
1
2
3
$('#row-13').each(function(){
     $(this).find('td').addChildrenCells();  // не знаю правильных методов, МБ поймете)
});
И до этого как-то определить последние элементы массива, возможно с помощью SQL запроса же определить, или пересчитать в PHP, jQuery знал, в какие столбцы "вписывать данные" и какие данные, в таблице-данные(еще не существующей) есть внешний ключ field_id тобишь идентификатор поля(такойже как и у ячеек(или столбца)) возможно просто добавлять в цикле все данные, до этого определив весь порядок следования и "правильных" родителей, не будет же мясо в напитках, это так утрированно

Я может и подогнал, но что-то он глюкованный, некоторые ячейки не в своих местах...
Вложения
Тип файла: zip app2zip.zip (12.4 Кб, 2 просмотров)
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
10.11.2017, 21:19  [ТС]
Вот еще на всякий загрузил на диск: https://yadi.sk/d/OFJ53XNA3PbBnZ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2017, 21:19
Помогаю со студенческими работами здесь

Динамическая таблица
Есть два скрипта: Первый &lt;div id=&quot;table_wrapper&quot;&gt; &lt;table id=&quot;my_table&quot;&gt; &lt;tr&gt; &lt;td&gt;&lt;/td&gt; ...

Динамическая таблица
Ребят,дали такое задание: По заполненной экзаменационной ведомости (таблица: фамилия студента – оценка на экзамене) создать сводку...

Динамическая Таблица
Привет, еще вопросик. Имеется формочка, она отображается в dialogbox. На этой формочке кнопка. Пользователь на нее нажимает, появляется...

Динамическая таблица
Пожалуйста, подскажите, как сделать, чтобы на сайте была динамическая таблица. Чтобы пользователи могли добавлять туда и удалять оттуда...

динамическая таблица
необходимо создать таблицу: верхний заголовок и первый левый столбец - номера вершин графа, значения ячеек в каждой строке =1. При этом,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru