Mercurial
diff .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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.cms/mod/pages.mod.php Fri Oct 11 22:40:23 2024 +0000 @@ -0,0 +1,1322 @@ +<?php + +$cms["modules"]["pages.mod.php"] = array( + "name" => "pages_module_name", + "description" => "pages_module_description", + "files" => array( + ".cms/mod/pages.mod.php", + ".cms/js/pages.js", + ".cms/css/pages.css", + ".cms/lang/ru_RU.UTF-8/pages.mod.php", + ".cms/lang/en_US.UTF-8/pages.mod.php", + ".cms/lang/uk_UA.UTF-8/pages.mod.php", + ), +); + +// Return if module disabled +if ( ! empty( $cms["config"]["pages.mod.php"]["disabled"] ) ) { + + return; + +} else { + + if ( is_admin() ) { + if ( empty( $_COOKIE["pages_pager"] ) ) { + if ( PHP_VERSION_ID < 70300 ) { + setcookie( "pages_pager", 100 ); + } else { + setcookie( "pages_pager", 100, array( "SameSite" => "Lax" ) ); + } + } + + hook_add_fn( "create_tables", "cms_pages_create_tables" ); + hook_add_fn( "admin", "cms_pages_admin" ); + hook_add_fn( "admin_header", "cms_pages_admin_header" ); + hook_add_fn( "api", "cms_pages_api" ); + hook_add_fn( "mod_menu_item", "cms_pages_menu_item" ); + } + hook_add_fn( "query", "cms_pages_query" ); + hook_add_fn( "menu", "cms_pages_menu" ); + +} + +function cms_pages_menu_item() { + global $cms; + if ( empty( $cms["menu.mod.php"]["item"]["found"] ) ) { + $q = "SELECT id, title, url FROM pages WHERE id={$cms["menu.mod.php"]["item"]['id']}"; + if ( $res_page = mysqli_query( $cms["base"], $q ) ) { + if ( $page = mysqli_fetch_assoc( $res_page ) ) { + $cms["menu.mod.php"]["item"]["link_title"] = $page["title"]; + $cms["menu.mod.php"]["item"]["select_title"] = $page["title"]; + $cms["menu.mod.php"]["item"]["url"] = $page["url"]; + $cms["menu.mod.php"]["item"]["found"] = true; + } else { + $cms["menu.mod.php"]["item"]["link_title"] = __( "deleted_page" ); + $cms["menu.mod.php"]["item"]["select_title"] = __( "deleted_page" ); + $cms["menu.mod.php"]["item"]["found"] = false; + } + } + } +} + +function cms_pages_admin_header() { + global $cms; + $hide = true; + foreach ( $cms["config"]["pages.mod.php"]["menu"] as $menu ) { + $hide = $hide && ( ! empty( $menu["hide"] ) || ! empty( $cms["config"]["admin_sections"][ $menu["section"] ]["hide"] ) ); + } + if ( ! $hide ) { + echo "<link rel=stylesheet href='{$cms['base_path']}css/pages.css'>"; + echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/lib/codemirror.css'>"; + echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.css'>"; + echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.css'>"; + echo "<script src='{$cms['base_path']}lib/codemirror/lib/codemirror.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/show-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/xml-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/html-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/javascript-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/anyword-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/hint/css-hint.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/selection/active-line.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/search.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/searchcursor.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/search/jump-to-line.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/dialog/dialog.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchbrackets.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/matchtags.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closebrackets.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/edit/closetag.js'></script>"; + #region folding + echo "<link rel=stylesheet href='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.css'>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldcode.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/foldgutter.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/brace-fold.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/xml-fold.js'></script>"; + //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/indent-fold.js'></script>"; + //echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/markdown-fold.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/addon/fold/comment-fold.js'></script>"; + #endregion + echo "<script src='{$cms['base_path']}lib/codemirror/mode/htmlmixed/htmlmixed.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/mode/xml/xml.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/mode/javascript/javascript.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/mode/css/css.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/mode/clike/clike.js'></script>"; + echo "<script src='{$cms['base_path']}lib/codemirror/mode/php/php.js'></script>"; + echo "<script src='{$cms['base_path']}js/pages.js'></script>"; + } +} + + +function cms_pages_api() { + global $cms; + + if ( ! empty( $_POST["fn"] ) ) { + + switch ( $_POST["fn"] ) { + + case "create_page": + + if ( empty( $cms["base"] ) ) { + echo( json_encode( array( + "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", + ) ) ); + return; + } + + // Read template settings + cms_template_load_settings(); + + $tpl = "page"; + + // Default text for new page from template + if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] ) ) { + $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][$tpl] ); + } else { + $text = ""; + } + + $modified = number_format( microtime( true ), 6, ".", "" ); + //$modified = 0; // Это позволит исключить новые страницы из RSS, но сортировка страниц в админке по этому полю + $created = date( "Y-m-d H:i:s", $modified ); + + $q = "INSERT INTO pages SET created='{$created}', modified='{$modified}', tpl='{$tpl}', text='{$text}'"; + if ( $r = mysqli_query( $cms["base"], $q ) ) { + $id = mysqli_insert_id( $cms["base"] ); + } else { + echo( json_encode( array( + "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ), + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + + // Create title, url and update in database + $title = __( "page_default_title" ); + $url = "{$id}"; + + // Если страница одна, то сделать ее главной + $q = "SELECT COUNT(*) FROM pages"; + $res = mysqli_query( $cms["base"], $q ); + $row = mysqli_fetch_assoc( $res ); + $count = $row["COUNT(*)"]; + if ( $count == 1 ) { + $url = ""; + $title = __( "home_page" ); + } + + $q = "UPDATE pages SET title='{$title}', url='{$url}' WHERE id={$id}"; + if ( $r = mysqli_query( $cms["base"], $q ) ) { + $_POST["where"] = "id={$id}"; + $r = cms_pages_get_pages_list(); + $r = array_merge( $r, + array( + "info_text" => __( "page_created" ), + "info_class" => "info-success", + "info_time" => 5000, + ) + ); + echo( json_encode( $r ) ); + return; + } else { + echo( json_encode( array( + "info_text" => __( "error_creating_page" ) . mysqli_error( $cms["base"] ), + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + break; + + case "save_prop": + + $_POST["url"] = trim( $_POST["url"] ); + if ( substr( $_POST["url"], 0, 1 ) === "/" ) { + $_POST["url"] = substr( $_POST["url"], 1 ); + } + + // Read template settings + cms_template_load_settings(); + + $id = (int) $_POST["id"]; + $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] ); + $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] ); + $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] ); + $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] ); + + // get page text + $q = "SELECT `text` FROM `pages` WHERE `id`={$id}"; + $r = mysqli_query( $cms["base"], $q ); + $row = mysqli_fetch_assoc( $r ); + $text = $row["text"]; + + $update_text = ""; + // Default text for old_template + if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) { + $text2 = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ]; + } else { + $text2 = ""; + } + + // Change template text + if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) { + // Default text for template + if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) { + $text = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ); + $update_text = ", `text`='{$text}'"; + } + } + + $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); + + // Check dupl + if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) { + if ( $cnt = mysqli_fetch_assoc( $r ) ) { + if ( $cnt["COUNT(*)"] > 0 ) { + $_POST["url"] = cms_uid(); + $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); + } + } + } + + if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; } + if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; } + $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" ); + $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] ); + $modified = str_replace( ",", ".", microtime( true ) ); + $q = "UPDATE `pages` SET + `title`='{$title}', + `seo_title`='{$seo_title}', + `description`='{$description}', + `tags`='{$tags}', + `created`='{$created}', + `modified`='{$modified}', + `tpl`='{$tpl}', + `url`='{$esc_url}' + {$update_text} + WHERE id={$id}"; + + // clear cache before change url + if ( function_exists( "cms_clear_cache" ) ) { + cms_clear_cache(); + } + if ( $r = mysqli_query( $cms["base"], $q ) ) { + if ( strtotime( $created ) > time() ) { + $planned = true; + } else { + $planned = false; + } + $time = strtotime( $created ); + $created = date( "d.m.Y", $time )."<br>".date( "H:i", $time ); + + $r = array( + "info_text" => __( "updated" ), + "info_class" => "info-success", + "info_time" => 1000, + "title" => htmlspecialchars( $_POST["title"] ), + "url" => $_POST["url"], + "base_path" => $cms["base_path"], + "created" => $created, + "planned" => $planned, + "ok" => "true", + ); + if ( function_exists( "cms_sitemap_update" ) ) { + cms_sitemap_update(); + } + if ( function_exists( "cms_rss_update" ) ) { + cms_rss_update(); + } + + // Если страница задействована в меню, то нужно сообщить, + // что требуется перезагрузить страницу меню + $q = "SELECT * FROM `menu` WHERE `id`={$id}"; + if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { + $r["update_menu"] = "true"; + } else { + $r["update_menu"] = "false"; + } + + echo( json_encode( $r ) ); + return; + } + break; + + case "save_page": + + $_POST["url"] = trim( $_POST["url"] ); + if ( substr( $_POST["url"], 0, 1 ) === "/" && strlen( $_POST["url"] ) > 1 ) { + $_POST["url"] = substr( $_POST["url"], 1 ); + } + + // Read template settings + cms_template_load_settings(); + + // hook for save page + do_hook( "save_page" ); + + $id = (int) $_POST["id"]; + $old_modified = mysqli_real_escape_string( $cms["base"], $_POST["modified"] ); + $modified = number_format( microtime( true ), 6, ".", "" ); + $text = mysqli_real_escape_string( $cms["base"], $_POST["text"] ); + + // Default text for old_template + if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ) ) { + $text2 = mysqli_real_escape_string( $cms["base"], $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["old_template"] ] ); + } else { + $text2 = ""; + } + + // Change template text + $new_text = ""; + if ( $_POST["old_template"] !== $_POST["template"] and $text === $text2 ) { + // Default text for template + if ( ! empty( $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ] ) ) { + $new_text = $cms["templates"][ $cms["template"] ]["page_templates"][ $_POST["template"] ]; + $text = mysqli_real_escape_string( $cms["base"], $new_text ); + } + } + + + $title = mysqli_real_escape_string( $cms["base"], $_POST["title"] ); + $seo_title = mysqli_real_escape_string( $cms["base"], $_POST["seo_title"] ); + $description = mysqli_real_escape_string( $cms["base"], $_POST["description"] ); + $tags = mysqli_real_escape_string( $cms["base"], $_POST["tags"] ); + + + $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); + + // Check dupl + if ( $r = mysqli_query( $cms["base"], "SELECT COUNT(*) FROM `pages` WHERE `url`='{$esc_url}' AND `id`<>{$id}" ) ) { + if ( $cnt = mysqli_fetch_assoc( $r ) ) { + if ( $cnt["COUNT(*)"] > 0 ) { + $_POST["url"] = cms_uid(); + $esc_url = mysqli_real_escape_string( $cms["base"], $_POST["url"] ); + } + } + } + + if ( empty( $_POST["date"] ) ) { $_POST["date"] = "0000-00-00"; } + if ( empty( $_POST["time"] ) ) { $_POST["time"] = "00:00"; } + $created = mysqli_real_escape_string( $cms["base"], $_POST["date"] . " " . $_POST["time"] . ":00" ); + $tpl = mysqli_real_escape_string( $cms["base"], $_POST["template"] ); + + $q = "UPDATE pages SET + text='{$text}', + modified={$modified}, + title='{$title}', + seo_title='{$seo_title}', + description='{$description}', + tags='{$tags}', + created='{$created}', + tpl='{$tpl}', + url='{$esc_url}' + WHERE id={$id} AND modified={$old_modified}"; + + // clear cache before change url + if ( function_exists( "cms_clear_cache" ) ) { + cms_clear_cache(); + } + + if ( mysqli_query( $cms["base"], $q ) ) { + + if ( ! mysqli_affected_rows( $cms["base"] ) ) { + echo( json_encode( array( + "ok" => "false", + "info_text" => __( "page_changed" ), + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + + // update sitemap and rss + if ( function_exists( "cms_sitemap_update" ) ) { + cms_sitemap_update(); + } + if ( function_exists( "cms_rss_update" ) ) { + cms_rss_update(); + } + + if ( strtotime( $created ) > time() ) { + $planned = true; + } else { + $planned = false; + } + + $r = array( + "ok" => "true", + "info_text" => __( "saved" ), + "info_class" => "info-success", + "info_time" => 5000, + "modified" => $modified, + "planned" => $planned, + "title" => htmlspecialchars( $_POST["title"] ), + "url" => $_POST["url"], + "base_path" => $cms["base_path"], + "new_text" => $new_text, + ); + + // Если страница задействована в меню, то нужно сообщить, + // что требуется перезагрузить страницу меню + $q = "SELECT * FROM `menu` WHERE `id`={$id}"; + if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { + $r["update_menu"] = "true"; + } else { + $r["update_menu"] = "false"; + } + + echo( json_encode( $r ) ); + return; + } else { + echo( json_encode( array( + "ok" => "false", + "info_text" => mysqli_error( $cms["base"] ), + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + break; + + case "page_pin": + $id = (int) $_POST['id']; + $pin = (int) $_POST['pin']; + $q = "UPDATE `pages` SET `pin`={$pin} WHERE `id`={$id}"; + if ( $res = mysqli_query( $cms["base"], $q ) ) { + echo( json_encode( array( + "ok" => "true", + ) ) ); + return; + } + break; + + case "page_publish": + $id = (int) $_POST['id']; + $published = (int) $_POST['published']; + $q = "UPDATE `pages` SET `published`={$published} WHERE `id`={$id}"; + if ( $res = mysqli_query( $cms["base"], $q ) ) { + echo( json_encode( array( + "ok" => "true", + ) ) ); + return; + } + break; + + case "get_page": + if ( $id = (int) $_POST['id'] and $res = mysqli_query( $cms["base"], "SELECT * FROM `pages` WHERE `id`={$id}" ) ) { + if ( $page = mysqli_fetch_assoc( $res ) ) { + + // date and time + $date = date( "Y-m-d", strtotime( $page["created"] ) ); + $time = date( "H:i", strtotime( $page["created"] ) ); + + // template + $templates_list = array(); + $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php"; + foreach ( glob( $expr ) as $tpl ) { + $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl ); + if ( $name !== "html" && strpos( $name, "." ) === false ) { + array_push( $templates_list, $name ); + } + } + + cms_template_load_settings(); + $current_template = $cms["config"]["template.mod.php"]["template"]; + + $template_options = ""; + foreach( $templates_list as $tpl ) { + if ( $tpl !== $page['tpl'] ) { + $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>"; + } + } + // Добавляем текущий подшаблон страницы в список если его там нет. + // Такое может быть если переключен главный шаблон. + if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) { + $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>"; + } + + + // files + $farr = array(); + foreach ( glob( "{$cms['site_dir']}/uploads/{$page['id']}/*", GLOB_NOSORT ) as $path ) { + if ( is_file( $path ) ) { + $farr[] = array( "path" => $path, "sort" => filemtime( $path ) ); + } + } + cms_asort( $farr ); + + $flist = ""; + foreach ( $farr as $f ) { + // cut path + $path_name = str_replace( $_SERVER["DOCUMENT_ROOT"], "", $f["path"] ); + //$rel_path_name = str_replace( $cms['site_dir'], "$", $f["path"] ); + $name = preg_replace( "/.*\//u", "", $path_name ); + $ext = strtolower( preg_replace( "/.*\./u", ".", $path_name ) ); // .jpg + // icon file + if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) { + $icon = "{$cms['base_path']}img/icon{$ext}.svg"; + } else { + $icon = "{$cms['base_path']}img/icon.default.svg"; + } + // no need icon for image + switch ( $ext ) { + case ".webp": + case ".tiff": + case ".jpeg": + case ".jpg": + case ".png": + case ".svg": + case ".gif": + case ".bmp": + case ".ico": + $size = getimagesize( $f["path"] ); + if ( ! empty( $size[3] ) ) { + $size = $size[3]; + } else { + $size = ""; + } + // $upd = time(); + // ?upd={$upd} + $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}"; + break; + + default: + $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}"; + break; + } + } + echo( json_encode( array( + "result" => "ok", + "page" => $page, + "base_path" => $cms["base_path"], + "flist" => $flist, + "date" => $date, + "time" => $time, + "options" => $template_options, + "option" => $page['tpl'], + "option_tr" => __( $page['tpl'], $current_template ), + ) ) ); + return; + } + } + break; + + case "del_files": + foreach ( $_POST["flist"] as $path_name ) { + $f = "{$_SERVER["DOCUMENT_ROOT"]}{$path_name}"; + if ( is_file( $f ) ) { + unlink( $f ); + } + } + $dir = dirname( $f ); + if ( is_dir_and_empty( $dir ) ) { + rmdir( $dir ); + } + echo( json_encode( array( + "info_text" => __( "files_deleted" ), + "info_class" => "info-success", + "info_time" => 5000, + ) ) ); + return; + break; + + case "get_pages_list": + echo( json_encode( cms_pages_get_pages_list() ) ); + return; + break; + + case "del_pages": + // Clear cache + if ( function_exists( "cms_clear_cache" ) ) { + cms_clear_cache(); + } + // Создание корзины + $trash = $cms["site_dir"] . "/uploads/.trash"; + if ( ! is_dir( $trash ) ) { + mkdir( $trash ); + } + foreach( $_POST["ids"] as $id ) { + if ( $id = (int) $id ) { + // Вытаскивание и сохранение страницы + $q = "SELECT * FROM pages WHERE `id`={$id}"; + $res = mysqli_query( $cms["base"], $q ); + $p = mysqli_fetch_assoc( $res ); + 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" ); + + // Delete page from base + mysqli_query( $cms["base"], "DELETE FROM `pages` WHERE `id`={$id}" ); + + // Перемещение файлов страницы + $files_dir = "{$cms['site_dir']}/uploads/{$id}"; + if ( $files_dir ) { + rename( $files_dir, "{$trash}/{$id}" ); + } + // Delete page files + /* + foreach ( glob( "{$cms['site_dir']}/uploads/{$id}/*", GLOB_NOSORT ) as $f ) { + if ( is_file( $f ) ) { + unlink( $f ); + } + } + + if ( isset( $f ) ) { + $dir = dirname( $f ); + if ( is_dir_and_empty( $dir ) ) { + rmdir( $dir ); + } + } + */ + + } + } + + // update sitemap and rss + if ( function_exists( "cms_sitemap_update" ) ) { + cms_sitemap_update(); + } + if ( function_exists( "cms_rss_update" ) ) { + cms_rss_update(); + } + + // Если страницы задействованы в меню, то нужно сообщить, + // что требуется перезагрузить страницу меню + $q = "SELECT * FROM `menu` WHERE `id` IN ( " . implode( ",", $_POST["ids"] ) . " )"; + if ( mysqli_query( $cms["base"], $q ) and mysqli_affected_rows( $cms["base"] ) ) { + $update_menu = "true"; + } else { + $update_menu = "false"; + } + + echo( json_encode( array( + "info_text" => __( "pages_deleted" ), + "info_class" => "info-success", + "info_time" => 5000, + "update_menu" => $update_menu, + ) ) ); + return; + break; + + case "upload_files": + $id = (int) $_POST["id"]; + $path = "{$cms['base_path']}uploads/{$id}"; + $dir = $_SERVER["DOCUMENT_ROOT"] . $path; + // create dir if not exists + if ( ! is_dir( $dir ) && ! mkdir( $dir, 0777, true ) ) { + echo( json_encode( array( + "info_text" => __( "error_create_folder" ) . " " . $dir, + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + $flist = ""; + $success = true; + foreach ( $_FILES["myfile"]["name"] as $n => $name ) { + if ( $_FILES["myfile"]["error"][$n] ) { + $success = false; + $text = __( "error_upload_file" ) . " \"{$name}\""; + break; + } + // Транслит + $ext = strtolower( preg_replace( "/.*\./u", ".", $name ) ); + $name = substr( $name, 0, strlen( $name ) - strlen( $ext ) ); + $name = strtolower( cms_translit_file( $name ) ); + $name = "{$name}{$ext}"; + // Перемещение с заменой. Проверка на одинаковость и предупреждение об этом сделано на js + if ( ! move_uploaded_file( $_FILES["myfile"]["tmp_name"][$n], "{$dir}/{$name}" ) ) { + $success = false; + $text = __( "file_move_error" ) . " \"{$dir}/{$name}\""; + break; + } + if ( file_exists( "{$cms['cms_dir']}/img/icon{$ext}.svg" ) ) { + $icon = "{$cms['base_path']}img/icon{$ext}.svg"; + } else { + $icon = "{$cms['base_path']}img/icon.default.svg"; + } + if ( $success ) { + switch ( $ext ) { + case ".webp": + case ".tiff": + case ".jpeg": + case ".jpg": + case ".png": + case ".svg": + case ".gif": + case ".bmp": + case ".ico": + $size = getimagesize( "{$dir}/{$name}" ); + if ( ! empty( $size[3] ) ) { + $size = $size[3]; + } else { + $size = ""; + } + $upd = time(); + $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>"; + break; + + default: + $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>"; + break; + } + + } + } + + if ( $success ) { + $text = __( "files_uploaded" ); + echo( json_encode( array( + "info_text" => $text, + "info_class" => "info-success", + "info_time" => 5000, + "flist" => $flist, + ) ) ); + return; + } else { + echo( json_encode( array( + "info_text" => $text, + "info_class" => "info-error", + "info_time" => 5000, + ) ) ); + return; + } + break; + + case "replace_in_pages": + $table = mysqli_real_escape_string( $cms["base"], $_POST["table"] ); + $id_col = mysqli_real_escape_string( $cms["base"], $_POST["id_col"] ); + $column = mysqli_real_escape_string( $cms["base"], $_POST["column"] ); + $q = "SELECT `{$id_col}`, `{$column}` FROM `{$table}`"; + $t = trim( $_POST["search_regex"] ); + if ( ! empty( $t ) ) { + if ( $res = mysqli_query( $cms["base"], $q ) ) { + $regex = preg_replace( "/\//u", "\\/", $_POST["search_regex"] ); // Escape / for regexp + while( $page = mysqli_fetch_assoc( $res ) ) { + $new_text = preg_replace( "/{$regex}/u", $_POST["replace"], $page[$_POST["column"]] ); + $text = mysqli_real_escape_string( $cms["base"], $new_text ); + $id_val = $page[$_POST["id_col"]]; + $q = "UPDATE `{$table}` SET `{$column}`='{$text}' WHERE `{$id_col}`='{$id_val}'"; + mysqli_query( $cms["base"], $q ); + } + } + } + + echo( json_encode( array( + "info_text" => __( "replace_ok" ), + "info_class" => "info-success", + "info_time" => 5000, + ) ) ); + return; + break; + } + } +} + +// Create pages list +// $_POST["where"] = "id=123"; нужно для момента создания страницы +// $_POST["count"] = "1000"; +// $_POST["search"] = "test"; +// $_COOKIE["pages_pager"] = 10; +function cms_pages_get_pages_list() { + global $cms; + + if ( empty( $cms["base"] ) ) { + return array( + "no_database" => "<span class=no-database>" . __( "no_connect_db" ) . "</span>", + ); + } + + $templates_list = array(); + $expr = "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.php"; + foreach ( glob( $expr ) as $tpl ) { + $name = preg_replace( "/.*\/([^\/]+)\.php/u", "$1", $tpl ); + if ( $name !== "html" && strpos( $name, "." ) === false ) { + array_push( $templates_list, $name ); + } + } + + if ( ! empty( $_POST["where"] ) ) { + $where = $_POST["where"]; + } else { + $where = "1"; + } + + if ( empty( $_COOKIE["pages_pager"] ) ) { + $pager = 100; + } else { + $pager = (int) $_COOKIE["pages_pager"]; + } + + if ( empty( $_POST["offset"] ) ) { + $_POST["offset"] = 0; + } + $offset = $_POST["offset"]; + + if ( ! empty( $_POST["count"] ) ) { + $pager = $_POST["count"]; + } + $limit = "LIMIT {$offset}, {$pager}"; + + if ( ! empty( $_POST["search"] ) ) { + + // Shift разбивает искомое на символы + if ( $_POST["Shift"] === "true" ) { + $s = preg_replace( "/\s/u", "", $_POST["search"] ); + $s = preg_split( '//u', $s, -1, PREG_SPLIT_NO_EMPTY ); + foreach( $s as $n => $ch ) { + $s[$n] = mysqli_real_escape_string( $cms["base"], $ch ); + } + $s = implode( "%", $s ); + } else { + $s = mysqli_real_escape_string( $cms["base"], $_POST["search"] ); + } + + // Ctrl ищет только по тексту + if ( $_POST["Ctrl"] === "true" ) { + $search = "( text LIKE '%{$s}%' )"; + } else { + $search = "( title LIKE '%{$s}%' OR url LIKE '%{$s}%' OR tpl LIKE '%{$s}%' OR tags LIKE '%{$s}%' )"; + } + + $q_count = "SELECT COUNT(*) FROM `pages` WHERE {$search}"; + } else { + $search = "1"; + $q_count = "SELECT COUNT(*) FROM `pages`"; + } + // count pages + if ( ! $res = mysqli_query( $cms["base"], $q_count ) ) { + return array( + "no_database" => "<span class=no-tables>" . __( "no_tables_db" ) . "</span>", + ); + } + $res = mysqli_fetch_assoc( $res ); + $count = $res["COUNT(*)"]; + + $pages = array(); + $start = microtime( true ); + $overload = false; + $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}"; + + if ( $res = mysqli_query( $cms["base"], $q ) ) { + + $tTitle = __( "title" ); + $tDescription = __( "description" ); + $tSeoTitle = __( "seo_title" ); + $tTemplate = __( "template" ); + $tPublished = __( "published" ); + $tUnPublished = __( "unpublished" ); + $tDate = __( "date" ); + $tTime = __( "time" ); + $tSave = __( "save" ); + $tProperties = __( "properties" ); + $tEdit = __( "edit" ); + $tr_pin = __( "pin" ); + + cms_template_load_settings(); + $current_template = $cms["config"]["template.mod.php"]["template"]; + + while ( $page = mysqli_fetch_assoc( $res ) ) { + + $time = strtotime( $page["created"] ); + if ( time() >= $time ) { + $date_class = "past"; + } else { + $date_class = "future"; + } + $created = date( "d.m.Y", $time ) . "<br>" . date( "H:i", $time ); + $date = date( "Y-m-d", $time ); + $time = date( "H:i", $time ); + + $template_options = ""; + foreach( $templates_list as $tpl ) { + if ( $tpl !== $page['tpl'] ) { + $template_options .= "<div class=option value='{$tpl}'>" . __( $tpl, $current_template ) . "</div>"; + } + } + // Добавляем текущий подшаблон страницы в список если его там нет. + // Такое может быть если переключен главный шаблон. + if ( ! in_array( $page['tpl'], $templates_list ) && ! empty( $page['tpl'] ) ) { + $template_options .= "<div class=option value='{$page['tpl']}'>" . __( $page['tpl'], $current_template ) . "</div>"; + } + + if ( $page["published"] ) { + $tpub = $tPublished; + } else { + $tpub = $tUnPublished; + } + + if ( $page["url"] == "" ) { + $class = "class=home"; + } else { + $class = ""; + } + + if ( empty( $page["tpl"] ) ) { + $tpl_translated = __( "no_template" ); + } else { + $tpl_translated = __( $page['tpl'], $current_template ); + } + + $html = " +<div {$class} data-id={$page['id']} data-pin={$page['pin']} data-published={$page['published']}> + + <a class=page-name href='{$cms['base_path']}{$page["url"]}' target=_blank title='id={$page['id']}'>{$page['title']}</a> + <div class=pin title='" . $tr_pin . "'></div> + <div class=published title='{$tpub}'></div> + <div class=page-buttons> + <div class=page-edit-btn>{$tEdit}</div> + <div class=page-prop-btn>{$tProperties}</div> + <div class=page-prop-save-btn>{$tSave}</div> + </div> + <div class='page-date {$date_class}'>{$created}</div> + <input type=checkbox> + + <div class=page-prop> + + <div class='page title'>{$tTitle}:</div> + <input name=title type=text value='{$page['title']}'> + + <div class='url title'>URL:</div> + <div class=url-input> + <input name=url type=text value='{$page['url']}' placeholder='" . __( "front_url" ) . "'> + <div class=url-translit title='" . __( "url_translit" ) . "'></div> + </div> + + <div class='seo title'>{$tSeoTitle}:</div> + <input name=seo_title type=text value='{$page['seo_title']}'> + + <div class='description title'>{$tDescription}:</div> + <textarea name=description rows=3>{$page['description']}</textarea> + + <div class='template title'>{$tTemplate}:</div> + <div class=template-select-grid> + <div class=field-select data-template='{$page['tpl']}' data-old-template='{$page['tpl']}'> + <div class=value>{$tpl_translated}</div> + <div class=icon></div> + </div> + <div class=field-options> + {$template_options} + </div> + </div> + + <div class='date title'>{$tDate}:</div> + <input name=date type=date value='{$date}'> + <div class='time title'>{$tTime}:</div> + <input name=time type=time value='{$time}'> + + <div class='tags title'>" . __( "tags" ) . ":</div> + <textarea name=tags rows=3>" . htmlspecialchars( $page["tags"] ) . "</textarea> + + </div> + +</div>"; + array_push( $pages, array( "id" => (int) $page["id"], "html" => $html ) ); + if ( microtime( true ) - $start > 1 ) { + $overload = true; + break; + } + } + } + if ( isset( $_POST["search"] ) ) { + $search = trim( $_POST["search"] ); + } else { + $search = ""; + } + + return array( + "pages" => $pages, + "offset" => $_POST["offset"], + "count" => $count, + "overload" => $overload, + "search" => $search, + ); +} + + +function cms_pages_query() { + global $cms; + + // Skip SQL query if file exists + if ( is_file( $cms["cms_file"] ) ) { + return; + } + + // fix template warnings + $cms["page"]["id"] = 0; + $cms["page"]["tpl"] = ""; + + if ( empty( $cms["base"] ) ) return; // fix 500 error + $url = mysqli_real_escape_string( $cms["base"], $cms["url"]["path"] ); + if ( $res = mysqli_query( $cms["base"], "SELECT * FROM pages WHERE url = '{$url}' OR CONCAT( url, '/' ) = '{$url}' OR url = CONCAT( '{$url}', '/' )" ) ) { + if ( $page = mysqli_fetch_assoc( $res ) ) { + $cms["page"] = $page; + if ( $cms["page"]["created"] <= date( "Y-m-d H:i:s" ) && $cms["page"]["published"] ) { + $cms["status"] = "200"; + } else { + $cms["status"] = "404"; // disable write to disk but echo if admin + } + } + } +} + +function cms_pages_create_tables() { + global $cms; + + mysqli_query( $cms["base"], " + CREATE TABLE IF NOT EXISTS `pages` ( + `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, + `pin` tinyint(1) NOT NULL DEFAULT 0, + `published` tinyint(1) NOT NULL DEFAULT 1, + `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modified` double NOT NULL DEFAULT 0, + `tpl` varchar(64) DEFAULT NULL, + `title` varchar(255) DEFAULT NULL, + `seo_title` varchar(255) DEFAULT NULL, + `text` longtext DEFAULT NULL, + `url` varchar(255) DEFAULT NULL, + `description` varchar(2048) NOT NULL DEFAULT '', + `tags` varchar(2048) NOT NULL DEFAULT '', + UNIQUE KEY `id` (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + "); + +} + + +function cms_pages_admin() { + global $cms; + + $conf = $cms["config"]["pages.mod.php"]["menu"]["pages"]; + if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { + + // Read template settings + cms_template_load_settings(); + + $tMaxUploadSize = __( "max_size" ) . " " . number_format( file_upload_max_size(), 0, ".", " " ) . " " . __( "bytes" ); + + $help_file = "{$cms['config']['template.mod.php']['template']}/instruction.{$cms['config']['locale']}.html"; + if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) { + $help_blanks = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "blanks" ) . "</a>"; + } else { + $help_blanks = ""; + } + + $help_file = "man/{$cms['config']['locale']}/codemirror.html"; + if ( is_file( "{$cms['cms_dir']}/{$help_file}" ) ) { + $help_codemirror = "<a target=_blank href='{$cms['base_path']}{$help_file}'>" . __( "codemirror" ) . "</a>"; + } else { + $help_codemirror = ""; + } + + $files_panel = " +<div class=mediateka-grid> + <div class=mediateka-files-hscroll> + <div class=mediateka-files-grid> + + </div> + </div> + + <div class=mediateka-buttons> + <div class=upload-files> + <input id=upload-btn type=file name='myfile[]' multiple class=inputfile title='{$tMaxUploadSize}'> + <label for=upload-btn title='{$tMaxUploadSize}'>" . __( "upload" ) . "</label> + </div> + <div class=link-file> + <span class=link-file-tag></span> + <span class=link-file-copy-btn>" . __( "copy" ) . "</span> + </div> + <div class='del-uploaded-files disabled'>" . __( "delete" ) . "</div> + </div> + +</div>"; + + $buttons = "<div class=save-page-button>" . __( "save" ) . "</div>"; + $buttons .= "<div class=open-properties>" . __( "properties" ) . "</div>"; + $buttons .= "<div class=open-mediateka>" . __( "mediateka" ) . "</div>"; + $buttons .= "<div class=tags-helper>" . __( "tags" ) . "</div>"; + $buttons .= "<div class=codemirror-replace>" . __( "replace" ) . "</div>"; + $buttons .= $help_blanks; + $buttons .= $help_codemirror; + + $page = " +<div class=main-header> + + <div class=search-wrapper> + <input class=page-search type=text + placeholder='" . __( "search" ) . "' + title='" . __( "search_with_ctrl" ) . "' + autocomplete=off data-result-of=''> + <div class=reset></div> + <button class=page-search-button></button> + </div> + + <div class=add-page-btn> + <div class=x1></div> + <div class=x2></div> + <div class=add-page-label>" . __( "add_page_title" ) . "</div> + </div> + + <div> </div> + + <a class=del-pages-btn title='" . __( "delete_pages" ) . "'></a> + +</div> + +<div class=main-main> + + <div class=pages-grid> + </div> + +</div> + +<div class=main-footer> + <div class=pager></div> + <div class=counters> + <input class=loaded value=0 autocomplete=off data-offset=0> + <span>" . __( "of" ) . "</span> + <span class=count>0</span> + </div> +</div> + +<div class='page-editor-bg hidden'> + <div class='page-editor-grid editor-grid'> + + <div class=page-editor-header> + <div class=close-page-button></div> + <a data-page-title class=page-editor-title target=_blank></a> + </div> + + <div class=page-editor-buttons>{$buttons}</div> + + <div class='page-properties hidden'> + + <div class='page title'>" . __( "title" ) . ":</div> + <input name=title type=text> + + <div class='url title'>URL:</div> + <div class=url-input> + <input name=url type=text placeholder='" . __( "front_url" ) . "'> + <div class=url-translit title='" . __( "url_translit" ) . "'></div> + </div> + + <div class='seo title'>" . __( "seo_title" ) . ":</div> + <input name=seo_title type=text> + + <div class='description title'>" . __( "description" ) . ":</div> + <textarea name=description rows=3></textarea> + + <div class='template title'>" . __( "template" ) . ":</div> + <div class=template-select-grid> + <div class=field-select data-template data-old-template> + <div class=value></div> + <div class=icon></div> + </div> + <div class=field-options> + + </div> + </div> + + <div class='date title'>" . __( "date" ) . ":</div> + <input name=date type=date> + <div class='time title'>" . __( "time" ) . ":</div> + <input name=time type=time> + + <div class='tags title'>" . __( "tags" ) . ":</div> + <textarea name=tags rows=3></textarea> + + </div> + + <div class='page-editor-panel hidden'> + <div class=upload-progress></div> + {$files_panel} + </div> + + <div class=page-editor> + <textarea data-modified class=coffee-editorpage-area name=add_editorpage></textarea> + </div> + + <div class=tags> + <div class=tags-grid> + <div data-type=wrap data-otag='<h1>' data-ctag='</h1>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag><h1></span></div> + <div data-type=wrap data-otag='<h2>' data-ctag='</h2>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag><h2></span></div> + <div data-type=wrap data-otag='<p>' data-ctag='</p>' data-len=3><span>" . __( "p" ) . "</span> <span class=tag><p></span></div> + <div data-type=wrap data-otag='<div>' data-ctag='</div>' data-len=5><span>" . __( "div" ) . "</span> <span class=tag><div></span></div> + <div data-type=wrap-a><span>" . __( "link" ) . "</span> <span class=tag><a></span></div> + <div data-type=wrap data-otag='<code>' data-ctag='</code>' data-len=6><span>" . __( "code" ) . "</span> <span class=tag><code></span></div> + <div data-type=wrap data-otag='<pre><code>' data-ctag='</code></pre>' data-len=11><span>" . __( "code" ) . "</span> <span class=tag><pre><code></span></div> + <div data-type=wrap data-otag='<span>' data-ctag='</span>' data-len=6><span>" . __( "span" ) . "</span> <span class=tag><span></span></div> + <div data-type=wrap data-otag='<blockquote>' data-ctag='</blockquote>' data-len=12><span>" . __( "cite" ) . "</span> <span class=tag><blockquote></span></div> + <div data-type=wrap-list data-tag=ul><span>" . __( "ul" ) . "</span> <span class=tag><ul></span></div> + <div data-type=wrap-list data-tag=ol><span>" . __( "ol" ) . "</span> <span class=tag><ol></span></div> + <div data-type=wrap data-otag='<li>' data-ctag='</li>' data-len=4><span>" . __( "li" ) . "</span> <span class=tag><li></span></div> + <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><figure></span></div> + <div data-type=wrap data-otag='<!-- ' data-ctag=' -->' data-len=5><span class=tag><!--</span> <span>" . __( "comment" ) . "</span> <span class=tag>--></span></div> + <div data-type=wrap data-otag='<b>' data-ctag='</b>' data-len=3><span>" . __( "bold" ) . "</span> <span class=tag><b></span></div> + <div data-type=wrap data-otag='<kbd>' data-ctag='</kbd>' data-len=5><span>" . __( "kbd" ) . "</span> <span class=tag><kbd></span></div> + <div data-type=wrap data-otag='<mark>' data-ctag='</mark>' data-len=6><span>" . __( "mark" ) . "</span> <span class=tag><mark></span></div> + </div> + </div> + </div> +</div>"; + + // Create menu item if not exists + if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages"] ) ) { + $cms["config"]["pages.mod.php"]["menu"]["pages"] = array( + "title" => "pages_module_name", + "sort" => 10, + "section" => "content", + ); + cms_save_config(); + } + + $cms["admin_pages"]["pages"] = $page; + + } + + + + $conf = $cms["config"]["pages.mod.php"]["menu"]["pages-utils"]; + if ( empty( $conf["hide"] ) && empty( $cms["config"]["admin_sections"][ $conf["section"] ]["hide"] ) ) { + + // Create menu item if not exists + if ( empty( $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] ) ) { + $cms["config"]["pages.mod.php"]["menu"]["pages-utils"] = array( + "title" => "pages_utils", + "sort" => 15, + "section" => "content", + "hide" => true, + ); + cms_save_config(); + } + + + $page = " +<div class=pages-utils-main> + <div class=replace-util> + <p>" . __( "replace_instruction" ) . "</p> + <div class=replace-inputs> + <div class=replace_table> + <div class=title>" . __( "replace_table" ) . "</div> + <input type=text name=table autocomplete=off value=pages> + </div> + <div class=stub></div> + <div class=replace_id_col> + <div class=title>" . __( "replace_id_col" ) . "</div> + <input type=text name=id_col autocomplete=off value=id> + </div> + <div class=replace_column> + <div class=title>" . __( "replace_column" ) . "</div> + <input type=text name=column autocomplete=off value=text> + </div> + <div class=regex> + <div class=title>" . __( "regex_title" ) . "</div> + <input type=text name=search_regex autocomplete=off> + </div> + <div class=replace> + <div class=title>" . __( "replace_title" ) . "</div> + <input type=text name=replace autocomplete=off> + </div> + </div> + <div class=replace-btn>" . __( "replace_btn" ) . "</div> + </div> +</div> + "; + + $cms["admin_pages"]["pages-utils"] = $page; + + } +} + + +function cms_pages_menu() { + global $cms; + + foreach( $cms["menu"] as $id => $menu ) { + if ( is_array( $menu["items"] ) ) { + cms_pages_menu_items( $cms["menu"][$id]["items"] ); + } + } +} + + +function cms_pages_menu_items( &$items ) { + global $cms; + + foreach( $items as $id => $item ) { + if ( $item["id"] ) { + $q_pages = "SELECT * FROM pages WHERE id={$item['id']}"; + if ( $res_p = mysqli_query( $cms["base"], $q_pages ) ) { + if ( $page = mysqli_fetch_assoc( $res_p ) ) { + if ( empty( $items[$id]["title"] ) ) { + $items[$id]["title"] = $page["title"]; + } + $items[$id]["url"] = $page["url"]; + } else { + $items[$id]["title"] = __( "deteled_page" ); + } + } + } + if ( is_array( $items[$id]["items"] ) ) { + cms_pages_menu_items( $items[$id]["items"] ); + } + } +}