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>&lt;h1></span></div>
+                <div data-type=wrap data-otag='<h2>' data-ctag='</h2>' data-len=4><span>" . __( "h1" ) . "</span> <span class=tag>&lt;h2></span></div>
+                <div data-type=wrap data-otag='<p>' data-ctag='</p>' data-len=3><span>" . __( "p" ) . "</span> <span class=tag>&lt;p></span></div>
+                <div data-type=wrap data-otag='<div>' data-ctag='</div>' data-len=5><span>" . __( "div" ) . "</span> <span class=tag>&lt;div></span></div>
+                <div data-type=wrap-a><span>" . __( "link" ) . "</span> <span class=tag>&lt;a></span></div>
+                <div data-type=wrap data-otag='<code>' data-ctag='</code>' data-len=6><span>" . __( "code" ) . "</span> <span class=tag>&lt;code></span></div>
+                <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>
+                <div data-type=wrap data-otag='<span>' data-ctag='</span>' data-len=6><span>" . __( "span" ) . "</span> <span class=tag>&lt;span></span></div>
+                <div data-type=wrap data-otag='<blockquote>' data-ctag='</blockquote>' data-len=12><span>" . __( "cite" ) . "</span> <span class=tag>&lt;blockquote></span></div>
+                <div data-type=wrap-list data-tag=ul><span>" . __( "ul" ) . "</span> <span class=tag>&lt;ul></span></div>
+                <div data-type=wrap-list data-tag=ol><span>" . __( "ol" ) . "</span> <span class=tag>&lt;ol></span></div>
+                <div data-type=wrap data-otag='<li>' data-ctag='</li>' data-len=4><span>" . __( "li" ) . "</span> <span class=tag>&lt;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>&lt;figure></span></div>
+                <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>
+                <div data-type=wrap data-otag='<b>' data-ctag='</b>' data-len=3><span>" . __( "bold" ) . "</span> <span class=tag>&lt;b></span></div>
+                <div data-type=wrap data-otag='<kbd>' data-ctag='</kbd>' data-len=5><span>" . __( "kbd" ) . "</span> <span class=tag>&lt;kbd></span></div>
+                <div data-type=wrap data-otag='<mark>' data-ctag='</mark>' data-len=6><span>" . __( "mark" ) . "</span> <span class=tag>&lt;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"] );
+        }
+    }
+}