comparison .cms/mod/pages.mod.php @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:78edf6b517a0
1 <?php
2
3 $cms["modules"]["pages.mod.php"] = array(
4 "name" => "pages_module_name",
5 "description" => "pages_module_description",
6 "files" => array(
7 ".cms/mod/pages.mod.php",
8 ".cms/js/pages.js",
9 ".cms/css/pages.css",
10 ".cms/lang/ru_RU.UTF-8/pages.mod.php",
11 ".cms/lang/en_US.UTF-8/pages.mod.php",
12 ".cms/lang/uk_UA.UTF-8/pages.mod.php",
13 ),
14 );
15
16 // Return if module disabled
17 if ( ! empty( $cms["config"]["pages.mod.php"]["disabled"] ) ) {
18
19 return;
20
21 } else {
22
23 if ( is_admin() ) {
24 if ( empty( $_COOKIE["pages_pager"] ) ) {
25 if ( PHP_VERSION_ID < 70300 ) {
26 setcookie( "pages_pager", 100 );
27 } else {
28 setcookie( "pages_pager", 100, array( "SameSite" => "Lax" ) );
29 }
30 }
31
32 hook_add_fn( "create_tables", "cms_pages_create_tables" );
33 hook_add_fn( "admin", "cms_pages_admin" );
34 hook_add_fn( "admin_header", "cms_pages_admin_header" );
35 hook_add_fn( "api", "cms_pages_api" );
36 hook_add_fn( "mod_menu_item", "cms_pages_menu_item" );
37 }
38 hook_add_fn( "query", "cms_pages_query" );
39 hook_add_fn( "menu", "cms_pages_menu" );
40
41 }
42
43 function cms_pages_menu_item() {
44 global $cms;
45 if ( empty( $cms["menu.mod.php"]["item"]["found"] ) ) {
46 $q = "SELECT id, title, url FROM pages WHERE id={$cms["menu.mod.php"]["item"]['id']}";
47 if ( $res_page = mysqli_query( $cms["base"], $q ) ) {
48 if ( $page = mysqli_fetch_assoc( $res_page ) ) {
49 $cms["menu.mod.php"]["item"]["link_title"] = $page["title"];
50 $cms["menu.mod.php"]["item"]["select_title"] = $page["title"];
51 $cms["menu.mod.php"]["item"]["url"] = $page["url"];
52 $cms["menu.mod.php"]["item"]["found"] = true;
53 } else {
54 $cms["menu.mod.php"]["item"]["link_title"] = __( "deleted_page" );
55 $cms["menu.mod.php"]["item"]["select_title"] = __( "deleted_page" );
56 $cms["menu.mod.php"]["item"]["found"] = false;
57 }
58 }
59 }
60 }
61
62 function cms_pages_admin_header() {
63 global $cms;
64 $hide = true;
65 foreach ( $cms["config"]["pages.mod.php"]["menu"] as $menu ) {
66 $hide = $hide && ( ! empty( $menu["hide"] ) || ! empty( $cms["config"]["admin_sections"][ $menu["section"] ]["hide"] ) );
67 }
68 if ( ! $hide ) {
69 echo "<link rel=stylesheet href='{$cms['base_path']}css/pages.css'>";
70 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/lib/codemirror.css'>";
71 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.css'>";
72 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.css'>";
73 echo "<script src='{$cms['base_path']}lib/codemirror/lib/codemirror.js'></script>";
74 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.js'></script>";
75 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/xml-hint.js'></script>";
76 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/html-hint.js'></script>";
77 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/javascript-hint.js'></script>";
78 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/anyword-hint.js'></script>";
79 echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/css-hint.js'></script>";
80 echo "<script src='{$cms['base_path']}lib/codemirror/addon/selection/active-line.js'></script>";
81 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/search.js'></script>";
82 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/searchcursor.js'></script>";
83 echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/jump-to-line.js'></script>";
84 echo "<script src='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.js'></script>";
85 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchbrackets.js'></script>";
86 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchtags.js'></script>";
87 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closebrackets.js'></script>";
88 echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closetag.js'></script>";
89 #region folding
90 echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.css'>";
91 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldcode.js'></script>";
92 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.js'></script>";
93 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/brace-fold.js'></script>";
94 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/xml-fold.js'></script>";
95 //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/indent-fold.js'></script>";
96 //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/markdown-fold.js'></script>";
97 echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/comment-fold.js'></script>";
98 #endregion
99 echo "<script src='{$cms['base_path']}lib/codemirror/mode/htmlmixed/htmlmixed.js'></script>";
100 echo "<script src='{$cms['base_path']}lib/codemirror/mode/xml/xml.js'></script>";
101 echo "<script src='{$cms['base_path']}lib/codemirror/mode/javascript/javascript.js'></script>";
102 echo "<script src='{$cms['base_path']}lib/codemirror/mode/css/css.js'></script>";
103 echo "<script src='{$cms['base_path']}lib/codemirror/mode/clike/clike.js'></script>";
104 echo "<script src='{$cms['base_path']}lib/codemirror/mode/php/php.js'></script>";
105 echo "<script src='{$cms['base_path']}js/pages.js'></script>";
106 }
107 }
108
109
110 function cms_pages_api() {
111 global $cms;
112
113 if ( ! empty( $_POST["fn"] ) ) {
114
115 switch ( $_POST["fn"] ) {
116
117 case "create_page":
118
119 if ( empty( $cms["base"] ) ) {
120 echo( json_encode( array(
121 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>",
122 ) ) );
123 return;
124 }
125
126 // Read template settings
127 cms_template_load_settings();
128
129 $tpl = "page";
130
131 // Default text for new page from template
132 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] ) ) {
133 $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] );
134 } else {
135 $text = "";
136 }
137
138 $modified = number_format( microtime( true ), 6, ".", "" );
139 //$modified = 0; // Это позволит исключить новые страницы из RSS, но сортировка страниц в админке по этому полю
140 $created = date( "Y-m-d H:i:s", $modified );
141
142 $q = "INSERT INTO pages SET created='{$created}', modified='{$modified}', tpl='{$tpl}', text='{$text}'";
143 if ( $r = mysqli_query( $cms["base"], $q ) ) {
144 $id = mysqli_insert_id( $cms["base"] );
145 } else {
146 echo( json_encode( array(
147 "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ),
148 "info_class" => "info-error",
149 "info_time" => 5000,
150 ) ) );
151 return;
152 }
153
154 // Create title, url and update in database
155 $title = __( "page_default_title" );
156 $url = "{$id}";
157
158 // Если страница одна, то сделать ее главной
159 $q = "SELECT COUNT(*) FROM pages";
160 $res = mysqli_query( $cms["base"], $q );
161 $row = mysqli_fetch_assoc( $res );
162 $count = $row["COUNT(*)"];
163 if ( $count == 1 ) {
164 $url = "";
165 $title = __( "home_page" );
166 }
167
168 $q = "UPDATE pages SET title='{$title}', url='{$url}' WHERE id={$id}";
169 if ( $r = mysqli_query( $cms["base"], $q ) ) {
170 $_POST["where"] = "id={$id}";
171 $r = cms_pages_get_pages_list();
172 $r = array_merge( $r,
173 array(
174 "info_text" => __( "page_created" ),
175 "info_class" => "info-success",
176 "info_time" => 5000,
177 )
178 );
179 echo( json_encode( $r ) );
180 return;
181 } else {
182 echo( json_encode( array(
183 "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ),
184 "info_class" => "info-error",
185 "info_time" => 5000,
186 ) ) );
187 return;
188 }
189 break;
190
191 case "save_prop":
192
193 $_POST["url"] = trim( $_POST["url"] );
194 if ( substr( $_POST["url"], 0, 1 ) === "/" ) {
195 $_POST["url"] = substr( $_POST["url"], 1 );
196 }
197
198 // Read template settings
199 cms_template_load_settings();
200
201 $id = (int) $_POST["id"];
202 $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] );
203 $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] );
204 $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] );
205 $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] );
206
207 // get page text
208 $q = "SELECT `text` FROM `pages` WHERE `id`={$id}";
209 $r = mysqli_query( $cms["base"], $q );
210 $row = mysqli_fetch_assoc( $r );
211 $text = $row["text"];
212
213 $update_text = "";
214 // Default text for old_template
215 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) {
216 $text2 = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ];
217 } else {
218 $text2 = "";
219 }
220
221 // Change template text
222 if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) {
223 // Default text for template
224 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) {
225 $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] );
226 $update_text = ", `text`='{$text}'";
227 }
228 }
229
230 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] );
231
232 // Check dupl
233 if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) {
234 if ( $cnt = mysqli_fetch_assoc( $r ) ) {
235 if ( $cnt["COUNT(*)"] > 0 ) {
236 $_POST["url"] = cms_uid();
237 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] );
238 }
239 }
240 }
241
242 if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; }
243 if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; }
244 $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" );
245 $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] );
246 $modified = str_replace( ",", ".", microtime( true ) );
247 $q = "UPDATE `pages` SET
248 `title`='{$title}',
249 `seo_title`='{$seo_title}',
250 `description`='{$description}',
251 `tags`='{$tags}',
252 `created`='{$created}',
253 `modified`='{$modified}',
254 `tpl`='{$tpl}',
255 `url`='{$esc_url}'
256 {$update_text}
257 WHERE id={$id}";
258
259 // clear cache before change url
260 if ( function_exists( "cms_clear_cache" ) ) {
261 cms_clear_cache();
262 }
263 if ( $r = mysqli_query( $cms["base"], $q ) ) {
264 if ( strtotime( $created ) > time() ) {
265 $planned = true;
266 } else {
267 $planned = false;
268 }
269 $time = strtotime( $created );
270 $created = date( "d.m.Y", $time )."<br>".date( "H:i", $time );
271
272 $r = array(
273 "info_text" => __( "updated" ),
274 "info_class" => "info-success",
275 "info_time" => 1000,
276 "title" => htmlspecialchars( $_POST["title"] ),
277 "url" => $_POST["url"],
278 "base_path" => $cms["base_path"],
279 "created" => $created,
280 "planned" => $planned,
281 "ok" => "true",
282 );
283 if ( function_exists( "cms_sitemap_update" ) ) {
284 cms_sitemap_update();
285 }
286 if ( function_exists( "cms_rss_update" ) ) {
287 cms_rss_update();
288 }
289
290 // Если страница задействована в меню, то нужно сообщить,
291 // что требуется перезагрузить страницу меню
292 $q = "SELECT * FROM `menu` WHERE `id`={$id}";
293 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) {
294 $r["update_menu"] = "true";
295 } else {
296 $r["update_menu"] = "false";
297 }
298
299 echo( json_encode( $r ) );
300 return;
301 }
302 break;
303
304 case "save_page":
305
306 $_POST["url"] = trim( $_POST["url"] );
307 if ( substr( $_POST["url"], 0, 1 ) === "/" && strlen( $_POST["url"] ) > 1 ) {
308 $_POST["url"] = substr( $_POST["url"], 1 );
309 }
310
311 // Read template settings
312 cms_template_load_settings();
313
314 // hook for save page
315 do_hook( "save_page" );
316
317 $id = (int) $_POST["id"];
318 $old_modified = mysqli_real_escape_string( $cms["base"], $_POST["modified"] );
319 $modified = number_format( microtime( true ), 6, ".", "" );
320 $text = mysqli_real_escape_string( $cms["base"], $_POST["text"] );
321
322 // Default text for old_template
323 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) {
324 $text2 = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] );
325 } else {
326 $text2 = "";
327 }
328
329 // Change template text
330 $new_text = "";
331 if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) {
332 // Default text for template
333 if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) {
334 $new_text = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ];
335 $text = mysqli_real_escape_string( $cms["base"], $new_text );
336 }
337 }
338
339
340 $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] );
341 $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] );
342 $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] );
343 $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] );
344
345
346 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] );
347
348 // Check dupl
349 if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) {
350 if ( $cnt = mysqli_fetch_assoc( $r ) ) {
351 if ( $cnt["COUNT(*)"] > 0 ) {
352 $_POST["url"] = cms_uid();
353 $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] );
354 }
355 }
356 }
357
358 if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; }
359 if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; }
360 $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" );
361 $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] );
362
363 $q = "UPDATE pages SET
364 text='{$text}',
365 modified={$modified},
366 title='{$title}',
367 seo_title='{$seo_title}',
368 description='{$description}',
369 tags='{$tags}',
370 created='{$created}',
371 tpl='{$tpl}',
372 url='{$esc_url}'
373 WHERE id={$id} AND modified={$old_modified}";
374
375 // clear cache before change url
376 if ( function_exists( "cms_clear_cache" ) ) {
377 cms_clear_cache();
378 }
379
380 if ( mysqli_query( $cms["base"], $q ) ) {
381
382 if ( ! mysqli_affected_rows( $cms["base"] ) ) {
383 echo( json_encode( array(
384 "ok" => "false",
385 "info_text" => __( "page_changed" ),
386 "info_class" => "info-error",
387 "info_time" => 5000,
388 ) ) );
389 return;
390 }
391
392 // update sitemap and rss
393 if ( function_exists( "cms_sitemap_update" ) ) {
394 cms_sitemap_update();
395 }
396 if ( function_exists( "cms_rss_update" ) ) {
397 cms_rss_update();
398 }
399
400 if ( strtotime( $created ) > time() ) {
401 $planned = true;
402 } else {
403 $planned = false;
404 }
405
406 $r = array(
407 "ok" => "true",
408 "info_text" => __( "saved" ),
409 "info_class" => "info-success",
410 "info_time" => 5000,
411 "modified" => $modified,
412 "planned" => $planned,
413 "title" => htmlspecialchars( $_POST["title"] ),
414 "url" => $_POST["url"],
415 "base_path" => $cms["base_path"],
416 "new_text" => $new_text,
417 );
418
419 // Если страница задействована в меню, то нужно сообщить,
420 // что требуется перезагрузить страницу меню
421 $q = "SELECT * FROM `menu` WHERE `id`={$id}";
422 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) {
423 $r["update_menu"] = "true";
424 } else {
425 $r["update_menu"] = "false";
426 }
427
428 echo( json_encode( $r ) );
429 return;
430 } else {
431 echo( json_encode( array(
432 "ok" => "false",
433 "info_text" => mysqli_error( $cms["base"] ),
434 "info_class" => "info-error",
435 "info_time" => 5000,
436 ) ) );
437 return;
438 }
439 break;
440
441 case "page_pin":
442 $id = (int) $_POST['id'];
443 $pin = (int) $_POST['pin'];
444 $q = "UPDATE `pages` SET `pin`={$pin} WHERE `id`={$id}";
445 if ( $res = mysqli_query( $cms["base"], $q ) ) {
446 echo( json_encode( array(
447 "ok" => "true",
448 ) ) );
449 return;
450 }
451 break;
452
453 case "page_publish":
454 $id = (int) $_POST['id'];
455 $published = (int) $_POST['published'];
456 $q = "UPDATE `pages` SET `published`={$published} WHERE `id`={$id}";
457 if ( $res = mysqli_query( $cms["base"], $q ) ) {
458 echo( json_encode( array(
459 "ok" => "true",
460 ) ) );
461 return;
462 }
463 break;
464
465 case "get_page":
466 if ( $id = (int) $_POST['id'] and $res = mysqli_query( $cms["base"], "SELECT * FROM `pages` WHERE `id`={$id}" ) ) {
467 if ( $page = mysqli_fetch_assoc( $res ) ) {
468
469 // date and time
470 $date = date( "Y-m-d", strtotime( $page["created"] ) );
471 $time = date( "H:i", strtotime( $page["created"] ) );
472
473 // template
474 $templates_list = array();
475 $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php";
476 foreach ( glob( $expr ) as $tpl ) {
477 $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl );
478 if ( $name !== "html" && strpos( $name, "." ) === false ) {
479 array_push( $templates_list, $name );
480 }
481 }
482
483 cms_template_load_settings();
484 $current_template = $cms["config"]["template.mod.php"]["template"];
485
486 $template_options = "";
487 foreach( $templates_list as $tpl ) {
488 if ( $tpl !== $page['tpl'] ) {
489 $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>";
490 }
491 }
492 // Добавляем текущий подшаблон страницы в список если его там нет.
493 // Такое может быть если переключен главный шаблон.
494 if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) {
495 $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>";
496 }
497
498
499 // files
500 $farr = array();
501 foreach ( glob( "{$cms['site_dir']}/uploads/{$page['id']}/*", GLOB_NOSORT ) as $path ) {
502 if ( is_file( $path ) ) {
503 $farr[] = array( "path" => $path, "sort" => filemtime( $path ) );
504 }
505 }
506 cms_asort( $farr );
507
508 $flist = "";
509 foreach ( $farr as $f ) {
510 // cut path
511 $path_name = str_replace( $_SERVER["DOCUMENT_ROOT"], "", $f["path"] );
512 //$rel_path_name = str_replace( $cms['site_dir'], "$", $f["path"] );
513 $name = preg_replace( "/.*\//u", "", $path_name );
514 $ext = strtolower( preg_replace( "/.*\./u", ".", $path_name ) ); // .jpg
515 // icon file
516 if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) {
517 $icon = "{$cms['base_path']}img/icon{$ext}.svg";
518 } else {
519 $icon = "{$cms['base_path']}img/icon.default.svg";
520 }
521 // no need icon for image
522 switch ( $ext ) {
523 case ".webp":
524 case ".tiff":
525 case ".jpeg":
526 case ".jpg":
527 case ".png":
528 case ".svg":
529 case ".gif":
530 case ".bmp":
531 case ".ico":
532 $size = getimagesize( $f["path"] );
533 if ( ! empty( $size[3] ) ) {
534 $size = $size[3];
535 } else {
536 $size = "";
537 }
538 // $upd = time();
539 // ?upd={$upd}
540 $flist = "<div class=file-block><div class=media-name>{$name}</div><img src='{$path_name}' data-src='{$path_name}' {$size}><input type=checkbox><div class=ext>{$ext}</div></div>{$flist}";
541 break;
542
543 default:
544 $flist = "<div class=file-block><div class=media-name>{$name}</div><img src='{$icon}' data-src='{$path_name}'><input type=checkbox><div class=ext>{$ext}</div></div>{$flist}";
545 break;
546 }
547 }
548 echo( json_encode( array(
549 "result" => "ok",
550 "page" => $page,
551 "base_path" => $cms["base_path"],
552 "flist" => $flist,
553 "date" => $date,
554 "time" => $time,
555 "options" => $template_options,
556 "option" => $page['tpl'],
557 "option_tr" => __( $page['tpl'], $current_template ),
558 ) ) );
559 return;
560 }
561 }
562 break;
563
564 case "del_files":
565 foreach ( $_POST["flist"] as $path_name ) {
566 $f = "{$_SERVER["DOCUMENT_ROOT"]}{$path_name}";
567 if ( is_file( $f ) ) {
568 unlink( $f );
569 }
570 }
571 $dir = dirname( $f );
572 if ( is_dir_and_empty( $dir ) ) {
573 rmdir( $dir );
574 }
575 echo( json_encode( array(
576 "info_text" => __( "files_deleted" ),
577 "info_class" => "info-success",
578 "info_time" => 5000,
579 ) ) );
580 return;
581 break;
582
583 case "get_pages_list":
584 echo( json_encode( cms_pages_get_pages_list() ) );
585 return;
586 break;
587
588 case "del_pages":
589 // Clear cache
590 if ( function_exists( "cms_clear_cache" ) ) {
591 cms_clear_cache();
592 }
593 // Создание корзины
594 $trash = $cms["site_dir"] . "/uploads/.trash";
595 if ( ! is_dir( $trash ) ) {
596 mkdir( $trash );
597 }
598 foreach( $_POST["ids"] as $id ) {
599 if ( $id = (int) $id ) {
600 // Вытаскивание и сохранение страницы
601 $q = "SELECT * FROM pages WHERE `id`={$id}";
602 $res = mysqli_query( $cms["base"], $q );
603 $p = mysqli_fetch_assoc( $res );
604 file_put_contents( "{$trash}/{$id}.txt", "url {$p['url']}\nid {$p['id']}\npin {$p['pin']}\npublished {$p['published']}\ncreated {$p['created']}\nmodified {$p['modified']}\ntpl {$p['tpl']}\ntitle {$p['title']}\nseo_title {$p['seo_title']}\ndescription {$p['description']}\ntags {$p['tags']}\ntext\n{$p['text']}\n" );
605
606 // Delete page from base
607 mysqli_query( $cms["base"], "DELETE FROM `pages` WHERE `id`={$id}" );
608
609 // Перемещение файлов страницы
610 $files_dir = "{$cms['site_dir']}/uploads/{$id}";
611 if ( $files_dir ) {
612 rename( $files_dir, "{$trash}/{$id}" );
613 }
614 // Delete page files
615 /*
616 foreach ( glob( "{$cms['site_dir']}/uploads/{$id}/*", GLOB_NOSORT ) as $f ) {
617 if ( is_file( $f ) ) {
618 unlink( $f );
619 }
620 }
621
622 if ( isset( $f ) ) {
623 $dir = dirname( $f );
624 if ( is_dir_and_empty( $dir ) ) {
625 rmdir( $dir );
626 }
627 }
628 */
629
630 }
631 }
632
633 // update sitemap and rss
634 if ( function_exists( "cms_sitemap_update" ) ) {
635 cms_sitemap_update();
636 }
637 if ( function_exists( "cms_rss_update" ) ) {
638 cms_rss_update();
639 }
640
641 // Если страницы задействованы в меню, то нужно сообщить,
642 // что требуется перезагрузить страницу меню
643 $q = "SELECT * FROM `menu` WHERE `id` IN ( " . implode( ",", $_POST["ids"] ) . " )";
644 if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) {
645 $update_menu = "true";
646 } else {
647 $update_menu = "false";
648 }
649
650 echo( json_encode( array(
651 "info_text" => __( "pages_deleted" ),
652 "info_class" => "info-success",
653 "info_time" => 5000,
654 "update_menu" => $update_menu,
655 ) ) );
656 return;
657 break;
658
659 case "upload_files":
660 $id = (int) $_POST["id"];
661 $path = "{$cms['base_path']}uploads/{$id}";
662 $dir = $_SERVER["DOCUMENT_ROOT"] . $path;
663 // create dir if not exists
664 if ( ! is_dir( $dir ) && ! mkdir( $dir, 0777, true ) ) {
665 echo( json_encode( array(
666 "info_text" => __( "error_create_folder" ) . " " . $dir,
667 "info_class" => "info-error",
668 "info_time" => 5000,
669 ) ) );
670 return;
671 }
672 $flist = "";
673 $success = true;
674 foreach ( $_FILES["myfile"]["name"] as $n => $name ) {
675 if ( $_FILES["myfile"]["error"][$n] ) {
676 $success = false;
677 $text = __( "error_upload_file" ) . " \"{$name}\"";
678 break;
679 }
680 // Транслит
681 $ext = strtolower( preg_replace( "/.*\./u", ".", $name ) );
682 $name = substr( $name, 0, strlen( $name ) - strlen( $ext ) );
683 $name = strtolower( cms_translit_file( $name ) );
684 $name = "{$name}{$ext}";
685 // Перемещение с заменой. Проверка на одинаковость и предупреждение об этом сделано на js
686 if ( ! move_uploaded_file( $_FILES["myfile"]["tmp_name"][$n], "{$dir}/{$name}" ) ) {
687 $success = false;
688 $text = __( "file_move_error" ) . " \"{$dir}/{$name}\"";
689 break;
690 }
691 if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) {
692 $icon = "{$cms['base_path']}img/icon{$ext}.svg";
693 } else {
694 $icon = "{$cms['base_path']}img/icon.default.svg";
695 }
696 if ( $success ) {
697 switch ( $ext ) {
698 case ".webp":
699 case ".tiff":
700 case ".jpeg":
701 case ".jpg":
702 case ".png":
703 case ".svg":
704 case ".gif":
705 case ".bmp":
706 case ".ico":
707 $size = getimagesize( "{$dir}/{$name}" );
708 if ( ! empty( $size[3] ) ) {
709 $size = $size[3];
710 } else {
711 $size = "";
712 }
713 $upd = time();
714 $flist .= "<div class='file-block'><div class=media-name>{$name}</div><img src='{$path}/{$name}?upd={$upd}' data-src='{$path}/{$name}' {$size}><input type=checkbox><div class=ext>{$ext}</div></div>";
715 break;
716
717 default:
718 $flist .= "<div class='file-block'><div class=media-name>{$name}</div><img src='{$icon}' data-src='{$path}/{$name}'><input type=checkbox><div class=ext>{$ext}</div></div>";
719 break;
720 }
721
722 }
723 }
724
725 if ( $success ) {
726 $text = __( "files_uploaded" );
727 echo( json_encode( array(
728 "info_text" => $text,
729 "info_class" => "info-success",
730 "info_time" => 5000,
731 "flist" => $flist,
732 ) ) );
733 return;
734 } else {
735 echo( json_encode( array(
736 "info_text" => $text,
737 "info_class" => "info-error",
738 "info_time" => 5000,
739 ) ) );
740 return;
741 }
742 break;
743
744 case "replace_in_pages":
745 $table = mysqli_real_escape_string( $cms["base"], $_POST["table"] );
746 $id_col = mysqli_real_escape_string( $cms["base"], $_POST["id_col"] );
747 $column = mysqli_real_escape_string( $cms["base"], $_POST["column"] );
748 $q = "SELECT `{$id_col}`, `{$column}` FROM `{$table}`";
749 $t = trim( $_POST["search_regex"] );
750 if ( ! empty( $t ) ) {
751 if ( $res = mysqli_query( $cms["base"], $q ) ) {
752 $regex = preg_replace( "/\//u", "\\/", $_POST["search_regex"] ); // Escape / for regexp
753 while( $page = mysqli_fetch_assoc( $res ) ) {
754 $new_text = preg_replace( "/{$regex}/u", $_POST["replace"], $page[$_POST["column"]] );
755 $text = mysqli_real_escape_string( $cms["base"], $new_text );
756 $id_val = $page[$_POST["id_col"]];
757 $q = "UPDATE `{$table}` SET `{$column}`='{$text}' WHERE `{$id_col}`='{$id_val}'";
758 mysqli_query( $cms["base"], $q );
759 }
760 }
761 }
762
763 echo( json_encode( array(
764 "info_text" => __( "replace_ok" ),
765 "info_class" => "info-success",
766 "info_time" => 5000,
767 ) ) );
768 return;
769 break;
770 }
771 }
772 }
773
774 // Create pages list
775 // $_POST["where"] = "id=123"; нужно для момента создания страницы
776 // $_POST["count"] = "1000";
777 // $_POST["search"] = "test";
778 // $_COOKIE["pages_pager"] = 10;
779 function cms_pages_get_pages_list() {
780 global $cms;
781
782 if ( empty( $cms["base"] ) ) {
783 return array(
784 "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>",
785 );
786 }
787
788 $templates_list = array();
789 $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php";
790 foreach ( glob( $expr ) as $tpl ) {
791 $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl );
792 if ( $name !== "html" && strpos( $name, "." ) === false ) {
793 array_push( $templates_list, $name );
794 }
795 }
796
797 if ( ! empty( $_POST["where"] ) ) {
798 $where = $_POST["where"];
799 } else {
800 $where = "1";
801 }
802
803 if ( empty( $_COOKIE["pages_pager"] ) ) {
804 $pager = 100;
805 } else {
806 $pager = (int) $_COOKIE["pages_pager"];
807 }
808
809 if ( empty( $_POST["offset"] ) ) {
810 $_POST["offset"] = 0;
811 }
812 $offset = $_POST["offset"];
813
814 if ( ! empty( $_POST["count"] ) ) {
815 $pager = $_POST["count"];
816 }
817 $limit = "LIMIT {$offset}, {$pager}";
818
819 if ( ! empty( $_POST["search"] ) ) {
820
821 // Shift разбивает искомое на символы
822 if ( $_POST["Shift"] === "true" ) {
823 $s = preg_replace( "/\s/u", "", $_POST["search"] );
824 $s = preg_split( '//u', $s, -1, PREG_SPLIT_NO_EMPTY );
825 foreach( $s as $n => $ch ) {
826 $s[$n] = mysqli_real_escape_string( $cms["base"], $ch );
827 }
828 $s = implode( "%", $s );
829 } else {
830 $s = mysqli_real_escape_string( $cms["base"], $_POST["search"] );
831 }
832
833 // Ctrl ищет только по тексту
834 if ( $_POST["Ctrl"] === "true" ) {
835 $search = "( text LIKE '%{$s}%' )";
836 } else {
837 $search = "( title LIKE '%{$s}%' OR url LIKE '%{$s}%' OR tpl LIKE '%{$s}%' OR tags LIKE '%{$s}%' )";
838 }
839
840 $q_count = "SELECT COUNT(*) FROM `pages` WHERE {$search}";
841 } else {
842 $search = "1";
843 $q_count = "SELECT COUNT(*) FROM `pages`";
844 }
845 // count pages
846 if ( ! $res = mysqli_query( $cms["base"], $q_count ) ) {
847 return array(
848 "no_database" => "<span class=no-tables>" . __( "no_tables_db" ) . "</span>",
849 );
850 }
851 $res = mysqli_fetch_assoc( $res );
852 $count = $res["COUNT(*)"];
853
854 $pages = array();
855 $start = microtime( true );
856 $overload = false;
857 $q = "SELECT `id`, `published`, `pin`, `title`, `seo_title`, `description`, `created`, `url`, `tpl`, `tags`, `modified` FROM `pages` WHERE {$search} AND {$where} ORDER BY `pin` DESC, FROM_UNIXTIME( `modified` ) DESC {$limit}";
858
859 if ( $res = mysqli_query( $cms["base"], $q ) ) {
860
861 $tTitle = __( "title" );
862 $tDescription = __( "description" );
863 $tSeoTitle = __( "seo_title" );
864 $tTemplate = __( "template" );
865 $tPublished = __( "published" );
866 $tUnPublished = __( "unpublished" );
867 $tDate = __( "date" );
868 $tTime = __( "time" );
869 $tSave = __( "save" );
870 $tProperties = __( "properties" );
871 $tEdit = __( "edit" );
872 $tr_pin = __( "pin" );
873
874 cms_template_load_settings();
875 $current_template = $cms["config"]["template.mod.php"]["template"];
876
877 while ( $page = mysqli_fetch_assoc( $res ) ) {
878
879 $time = strtotime( $page["created"] );
880 if ( time() >= $time ) {
881 $date_class = "past";
882 } else {
883 $date_class = "future";
884 }
885 $created = date( "d.m.Y", $time ) . "<br>" . date( "H:i", $time );
886 $date = date( "Y-m-d", $time );
887 $time = date( "H:i", $time );
888
889 $template_options = "";
890 foreach( $templates_list as $tpl ) {
891 if ( $tpl !== $page['tpl'] ) {
892 $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>";
893 }
894 }
895 // Добавляем текущий подшаблон страницы в список если его там нет.
896 // Такое может быть если переключен главный шаблон.
897 if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) {
898 $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>";
899 }
900
901 if ( $page["published"] ) {
902 $tpub = $tPublished;
903 } else {
904 $tpub = $tUnPublished;
905 }
906
907 if ( $page["url"] == "" ) {
908 $class = "class=home";
909 } else {
910 $class = "";
911 }
912
913 if ( empty( $page["tpl"] ) ) {
914 $tpl_translated = __( "no_template" );
915 } else {
916 $tpl_translated = __( $page['tpl'], $current_template );
917 }
918
919 $html = "
920 <div {$class} data-id={$page['id']} data-pin={$page['pin']} data-published={$page['published']}>
921
922 <a class=page-name href='{$cms['base_path']}{$page["url"]}' target=_blank title='id={$page['id']}'>{$page['title']}</a>
923 <div class=pin title='" . $tr_pin . "'></div>
924 <div class=published title='{$tpub}'></div>
925 <div class=page-buttons>
926 <div class=page-edit-btn>{$tEdit}</div>
927 <div class=page-prop-btn>{$tProperties}</div>
928 <div class=page-prop-save-btn>{$tSave}</div>
929 </div>
930 <div class='page-date {$date_class}'>{$created}</div>
931 <input type=checkbox>
932
933 <div class=page-prop>
934
935 <div class='page title'>{$tTitle}:</div>
936 <input name=title type=text value='{$page['title']}'>
937
938 <div class='url title'>URL:</div>
939 <div class=url-input>
940 <input name=url type=text value='{$page['url']}' placeholder='" . __( "front_url" ) . "'>
941 <div class=url-translit title='" . __( "url_translit" ) . "'></div>
942 </div>
943
944 <div class='seo title'>{$tSeoTitle}:</div>
945 <input name=seo_title type=text value='{$page['seo_title']}'>
946
947 <div class='description title'>{$tDescription}:</div>
948 <textarea name=description rows=3>{$page['description']}</textarea>
949
950 <div class='template title'>{$tTemplate}:</div>
951 <div class=template-select-grid>
952 <div class=field-select data-template='{$page['tpl']}' data-old-template='{$page['tpl']}'>
953 <div class=value>{$tpl_translated}</div>
954 <div class=icon></div>
955 </div>
956 <div class=field-options>
957 {$template_options}
958 </div>
959 </div>
960
961 <div class='date title'>{$tDate}:</div>
962 <input name=date type=date value='{$date}'>
963 <div class='time title'>{$tTime}:</div>
964 <input name=time type=time value='{$time}'>
965
966 <div class='tags title'>" . __( "tags" ) . ":</div>
967 <textarea name=tags rows=3>" . htmlspecialchars( $page["tags"] ) . "</textarea>
968
969 </div>
970
971 </div>";
972 array_push( $pages, array( "id" => (int) $page["id"], "html" => $html ) );
973 if ( microtime( true ) - $start > 1 ) {
974 $overload = true;
975 break;
976 }
977 }
978 }
979 if ( isset( $_POST["search"] ) ) {
980 $search = trim( $_POST["search"] );
981 } else {
982 $search = "";
983 }
984
985 return array(
986 "pages" => $pages,
987 "offset" => $_POST["offset"],
988 "count" => $count,
989 "overload" => $overload,
990 "search" => $search,
991 );
992 }
993
994
995 function cms_pages_query() {
996 global $cms;
997
998 // Skip SQL query if file exists
999 if ( is_file( $cms["cms_file"] ) ) {
1000 return;
1001 }
1002
1003 // fix template warnings
1004 $cms["page"]["id"] = 0;
1005 $cms["page"]["tpl"] = "";
1006
1007 if ( empty( $cms["base"] ) ) return; // fix 500 error
1008 $url = mysqli_real_escape_string( $cms["base"], $cms["url"]["path"] );
1009 if ( $res = mysqli_query( $cms["base"], "SELECT * FROM pages WHERE url = '{$url}' OR CONCAT( url, '/' ) = '{$url}' OR url = CONCAT( '{$url}', '/' )" ) ) {
1010 if ( $page = mysqli_fetch_assoc( $res ) ) {
1011 $cms["page"] = $page;
1012 if ( $cms["page"]["created"] <= date( "Y-m-d H:i:s" ) && $cms["page"]["published"] ) {
1013 $cms["status"] = "200";
1014 } else {
1015 $cms["status"] = "404"; // disable write to disk but echo if admin
1016 }
1017 }
1018 }
1019 }
1020
1021 function cms_pages_create_tables() {
1022 global $cms;
1023
1024 mysqli_query( $cms["base"], "
1025 CREATE TABLE IF NOT EXISTS `pages` (
1026 `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
1027 `pin` tinyint(1) NOT NULL DEFAULT 0,
1028 `published` tinyint(1) NOT NULL DEFAULT 1,
1029 `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
1030 `modified` double NOT NULL DEFAULT 0,
1031 `tpl` varchar(64) DEFAULT NULL,
1032 `title` varchar(255) DEFAULT NULL,
1033 `seo_title` varchar(255) DEFAULT NULL,
1034 `text` longtext DEFAULT NULL,
1035 `url` varchar(255) DEFAULT NULL,
1036 `description` varchar(2048) NOT NULL DEFAULT '',
1037 `tags` varchar(2048) NOT NULL DEFAULT '',
1038 UNIQUE KEY `id` (`id`)
1039 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1040 ");
1041
1042 }
1043
1044
1045 function cms_pages_admin() {
1046 global $cms;
1047
1048 $conf = $cms["config"]["pages.mod.php"]["menu"]["pages"];
1049 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) {
1050
1051 // Read template settings
1052 cms_template_load_settings();
1053
1054 $tMaxUploadSize = __( "max_size" ) . " " . number_format( file_upload_max_size(), 0, ".", " " ) . " " . __( "bytes" );
1055
1056 $help_file = "{$cms['config']['template.mod.php']['template']}/instruction.{$cms['config']['locale']}.html";
1057 if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) {
1058 $help_blanks = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "blanks" ) . "</a>";
1059 } else {
1060 $help_blanks = "";
1061 }
1062
1063 $help_file = "man/{$cms['config']['locale']}/codemirror.html";
1064 if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) {
1065 $help_codemirror = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "codemirror" ) . "</a>";
1066 } else {
1067 $help_codemirror = "";
1068 }
1069
1070 $files_panel = "
1071 <div class=mediateka-grid>
1072 <div class=mediateka-files-hscroll>
1073 <div class=mediateka-files-grid>
1074
1075 </div>
1076 </div>
1077
1078 <div class=mediateka-buttons>
1079 <div class=upload-files>
1080 <input id=upload-btn type=file name='myfile[]' multiple class=inputfile title='{$tMaxUploadSize}'>
1081 <label for=upload-btn title='{$tMaxUploadSize}'>" . __( "upload" ) . "</label>
1082 </div>
1083 <div class=link-file>
1084 <span class=link-file-tag></span>
1085 <span class=link-file-copy-btn>" . __( "copy" ) . "</span>
1086 </div>
1087 <div class='del-uploaded-files disabled'>" . __( "delete" ) . "</div>
1088 </div>
1089
1090 </div>";
1091
1092 $buttons = "<div class=save-page-button>" . __( "save" ) . "</div>";
1093 $buttons .= "<div class=open-properties>" . __( "properties" ) . "</div>";
1094 $buttons .= "<div class=open-mediateka>" . __( "mediateka" ) . "</div>";
1095 $buttons .= "<div class=tags-helper>" . __( "tags" ) . "</div>";
1096 $buttons .= "<div class=codemirror-replace>" . __( "replace" ) . "</div>";
1097 $buttons .= $help_blanks;
1098 $buttons .= $help_codemirror;
1099
1100 $page = "
1101 <div class=main-header>
1102
1103 <div class=search-wrapper>
1104 <input class=page-search type=text
1105 placeholder='" . __( "search" ) . "'
1106 title='" . __( "search_with_ctrl" ) . "'
1107 autocomplete=off data-result-of=''>
1108 <div class=reset></div>
1109 <button class=page-search-button></button>
1110 </div>
1111
1112 <div class=add-page-btn>
1113 <div class=x1></div>
1114 <div class=x2></div>
1115 <div class=add-page-label>" . __( "add_page_title" ) . "</div>
1116 </div>
1117
1118 <div> </div>
1119
1120 <a class=del-pages-btn title='" . __( "delete_pages" ) . "'></a>
1121
1122 </div>
1123
1124 <div class=main-main>
1125
1126 <div class=pages-grid>
1127 </div>
1128
1129 </div>
1130
1131 <div class=main-footer>
1132 <div class=pager></div>
1133 <div class=counters>
1134 <input class=loaded value=0 autocomplete=off data-offset=0>
1135 <span>" . __( "of" ) . "</span>
1136 <span class=count>0</span>
1137 </div>
1138 </div>
1139
1140 <div class='page-editor-bg hidden'>
1141 <div class='page-editor-grid editor-grid'>
1142
1143 <div class=page-editor-header>
1144 <div class=close-page-button></div>
1145 <a data-page-title class=page-editor-title target=_blank></a>
1146 </div>
1147
1148 <div class=page-editor-buttons>{$buttons}</div>
1149
1150 <div class='page-properties hidden'>
1151
1152 <div class='page title'>" . __( "title" ) . ":</div>
1153 <input name=title type=text>
1154
1155 <div class='url title'>URL:</div>
1156 <div class=url-input>
1157 <input name=url type=text placeholder='" . __( "front_url" ) . "'>
1158 <div class=url-translit title='" . __( "url_translit" ) . "'></div>
1159 </div>
1160
1161 <div class='seo title'>" . __( "seo_title" ) . ":</div>
1162 <input name=seo_title type=text>
1163
1164 <div class='description title'>" . __( "description" ) . ":</div>
1165 <textarea name=description rows=3></textarea>
1166
1167 <div class='template title'>" . __( "template" ) . ":</div>
1168 <div class=template-select-grid>
1169 <div class=field-select data-template data-old-template>
1170 <div class=value></div>
1171 <div class=icon></div>
1172 </div>
1173 <div class=field-options>
1174
1175 </div>
1176 </div>
1177
1178 <div class='date title'>" . __( "date" ) . ":</div>
1179 <input name=date type=date>
1180 <div class='time title'>" . __( "time" ) . ":</div>
1181 <input name=time type=time>
1182
1183 <div class='tags title'>" . __( "tags" ) . ":</div>
1184 <textarea name=tags rows=3></textarea>
1185
1186 </div>
1187
1188 <div class='page-editor-panel hidden'>
1189 <div class=upload-progress></div>
1190 {$files_panel}
1191 </div>
1192
1193 <div class=page-editor>
1194 <textarea data-modified class=coffee-editorpage-area name=add_editorpage></textarea>
1195 </div>
1196
1197 <div class=tags>
1198 <div class=tags-grid>
1199 <div data-type=wrap data-otag='<h1>' data-ctag='</h1>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag>&lt;h1></span></div>
1200 <div data-type=wrap data-otag='<h2>' data-ctag='</h2>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag>&lt;h2></span></div>
1201 <div data-type=wrap data-otag='<p>' data-ctag='</p>' data-len=3><span>" . __( "p" ) . "</span> <span class=tag>&lt;p></span></div>
1202 <div data-type=wrap data-otag='<div>' data-ctag='</div>' data-len=5><span>" . __( "div" ) . "</span> <span class=tag>&lt;div></span></div>
1203 <div data-type=wrap-a><span>" . __( "link" ) . "</span> <span class=tag>&lt;a></span></div>
1204 <div data-type=wrap data-otag='<code>' data-ctag='</code>' data-len=6><span>" . __( "code" ) . "</span> <span class=tag>&lt;code></span></div>
1205 <div data-type=wrap data-otag='<pre><code>' data-ctag='</code></pre>' data-len=11><span>" . __( "code" ) . "</span> <span class=tag>&lt;pre>&lt;code></span></div>
1206 <div data-type=wrap data-otag='<span>' data-ctag='</span>' data-len=6><span>" . __( "span" ) . "</span> <span class=tag>&lt;span></span></div>
1207 <div data-type=wrap data-otag='<blockquote>' data-ctag='</blockquote>' data-len=12><span>" . __( "cite" ) . "</span> <span class=tag>&lt;blockquote></span></div>
1208 <div data-type=wrap-list data-tag=ul><span>" . __( "ul" ) . "</span> <span class=tag>&lt;ul></span></div>
1209 <div data-type=wrap-list data-tag=ol><span>" . __( "ol" ) . "</span> <span class=tag>&lt;ol></span></div>
1210 <div data-type=wrap data-otag='<li>' data-ctag='</li>' data-len=4><span>" . __( "li" ) . "</span> <span class=tag>&lt;li></span></div>
1211 <div data-type=wrap data-otag='<figure>\n ' data-ctag='\n <figcaption></figcaption>\n</figure>' data-ch=4 data-line=1><span>" . __( "figure" ) . "</span> <span class=tag>&lt;figure></span></div>
1212 <div data-type=wrap data-otag='<!-- ' data-ctag=' -->' data-len=5><span class=tag>&lt;!--</span>&nbsp;<span>" . __( "comment" ) . "</span>&nbsp;<span class=tag>--></span></div>
1213 <div data-type=wrap data-otag='<b>' data-ctag='</b>' data-len=3><span>" . __( "bold" ) . "</span> <span class=tag>&lt;b></span></div>
1214 <div data-type=wrap data-otag='<kbd>' data-ctag='</kbd>' data-len=5><span>" . __( "kbd" ) . "</span> <span class=tag>&lt;kbd></span></div>
1215 <div data-type=wrap data-otag='<mark>' data-ctag='</mark>' data-len=6><span>" . __( "mark" ) . "</span> <span class=tag>&lt;mark></span></div>
1216 </div>
1217 </div>
1218 </div>
1219 </div>";
1220
1221 // Create menu item if not exists
1222 if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages"] ) ) {
1223 $cms["config"]["pages.mod.php"]["menu"]["pages"] = array(
1224 "title" => "pages_module_name",
1225 "sort" => 10,
1226 "section" => "content",
1227 );
1228 cms_save_config();
1229 }
1230
1231 $cms["admin_pages"]["pages"] = $page;
1232
1233 }
1234
1235
1236
1237 $conf = $cms["config"]["pages.mod.php"]["menu"]["pages-utils"];
1238 if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) {
1239
1240 // Create menu item if not exists
1241 if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] ) ) {
1242 $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] = array(
1243 "title" => "pages_utils",
1244 "sort" => 15,
1245 "section" => "content",
1246 "hide" => true,
1247 );
1248 cms_save_config();
1249 }
1250
1251
1252 $page = "
1253 <div class=pages-utils-main>
1254 <div class=replace-util>
1255 <p>" . __( "replace_instruction" ) . "</p>
1256 <div class=replace-inputs>
1257 <div class=replace_table>
1258 <div class=title>" . __( "replace_table" ) . "</div>
1259 <input type=text name=table autocomplete=off value=pages>
1260 </div>
1261 <div class=stub></div>
1262 <div class=replace_id_col>
1263 <div class=title>" . __( "replace_id_col" ) . "</div>
1264 <input type=text name=id_col autocomplete=off value=id>
1265 </div>
1266 <div class=replace_column>
1267 <div class=title>" . __( "replace_column" ) . "</div>
1268 <input type=text name=column autocomplete=off value=text>
1269 </div>
1270 <div class=regex>
1271 <div class=title>" . __( "regex_title" ) . "</div>
1272 <input type=text name=search_regex autocomplete=off>
1273 </div>
1274 <div class=replace>
1275 <div class=title>" . __( "replace_title" ) . "</div>
1276 <input type=text name=replace autocomplete=off>
1277 </div>
1278 </div>
1279 <div class=replace-btn>" . __( "replace_btn" ) . "</div>
1280 </div>
1281 </div>
1282 ";
1283
1284 $cms["admin_pages"]["pages-utils"] = $page;
1285
1286 }
1287 }
1288
1289
1290 function cms_pages_menu() {
1291 global $cms;
1292
1293 foreach( $cms["menu"] as $id => $menu ) {
1294 if ( is_array( $menu["items"] ) ) {
1295 cms_pages_menu_items( $cms["menu"][$id]["items"] );
1296 }
1297 }
1298 }
1299
1300
1301 function cms_pages_menu_items( &$items ) {
1302 global $cms;
1303
1304 foreach( $items as $id => $item ) {
1305 if ( $item["id"] ) {
1306 $q_pages = "SELECT * FROM pages WHERE id={$item['id']}";
1307 if ( $res_p = mysqli_query( $cms["base"], $q_pages ) ) {
1308 if ( $page = mysqli_fetch_assoc( $res_p ) ) {
1309 if ( empty( $items[$id]["title"] ) ) {
1310 $items[$id]["title"] = $page["title"];
1311 }
1312 $items[$id]["url"] = $page["url"];
1313 } else {
1314 $items[$id]["title"] = __( "deteled_page" );
1315 }
1316 }
1317 }
1318 if ( is_array( $items[$id]["items"] ) ) {
1319 cms_pages_menu_items( $items[$id]["items"] );
1320 }
1321 }
1322 }