Mercurial
view .cms/mod/pages.mod.php @ 1:1d486627aa1e draft default tip
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Sat, 12 Oct 2024 02:51:39 +0000 |
parents | 78edf6b517a0 |
children |
line wrap: on
line source
<?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"] ); } } }