diff .cms/index.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
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/index.php	Sat Oct 12 02:51:39 2024 +0000
@@ -0,0 +1,157 @@
+<?php
+
+/*
+$time_start = microtime( true );
+*/
+
+// for bad hosters
+ini_set( "display_errors", "Off" );
+
+$cms["kernel_version"] = "24.10";
+$cms["kernel_compat"]  = "23.04";
+
+// PHP_VERSION_ID available in PHP 5.2.7 and above
+if ( ! defined( "PHP_VERSION_ID" ) ) {
+    $version = explode( ".", PHP_VERSION );
+    define( "PHP_VERSION_ID", ( $version[0] * 10000 + $version[1] * 100 + $version[2] ) );
+}
+
+$cms["cms_dir"] = dirname( __FILE__ );
+
+// for windows
+if ( DIRECTORY_SEPARATOR === "\\" ) {
+    $cms["cms_dir"] = str_replace( "\\", "/", $cms["cms_dir"] );
+}
+
+$cms["site_dir"] = dirname( $cms["cms_dir"] );
+
+if ( empty( $_SERVER["HTTPS"] ) ) {
+    $protocol = "http";
+} else {
+    $protocol = "https";
+}
+
+// if tail DocumentRoot containing / or \
+$_SERVER["DOCUMENT_ROOT"] = rtrim( $_SERVER["DOCUMENT_ROOT"], "/\\" );
+
+// https://coffee-cms.com/base_path/
+//                       ^         ^
+$cms["base_path"] = str_replace( $_SERVER["DOCUMENT_ROOT"], "", $cms["site_dir"] ) . "/";
+$regex_base_path  = str_replace( "/", "\\/", $cms["base_path"] ); // escape / for regexp
+
+//#todo? It seems there is no point in adding /u for the URL and checking preg_replace for null
+$url = "{$protocol}://{$_SERVER['SERVER_NAME']}/" . preg_replace( "/^{$regex_base_path}/", "", $_SERVER['REQUEST_URI'] );
+$cms["url"] = parse_url( $url );
+$cms["url"]["path"] = urldecode( $cms["url"]["path"] );
+// file in .cms/ directory (for prevent sql query in pages module)
+$cms["cms_file"] = $cms["cms_dir"] . $cms["url"]["path"];
+$cms["url"]["path"] = substr( $cms["url"]["path"], 1 ); // remove leading /
+
+$cms["status"] = "404";
+
+
+// Load config.php
+$cms["config_file"] = "{$cms['cms_dir']}/config.php";
+if ( is_file( $cms["config_file"] ) && $handle = fopen( $cms["config_file"], "r" ) ) {
+    flock( $handle, LOCK_SH );
+    include( $cms["config_file"] );
+    flock( $handle, LOCK_UN );
+}
+
+
+if ( ! empty( $cms["config"]["locale"] ) ) {
+    setlocale( LC_ALL, $cms["config"]["locale"] );
+}
+
+
+if ( ! empty( $cms["config"]["timezone"] ) ) {
+    date_default_timezone_set ( $cms["config"]["timezone"] );
+}
+
+    
+// Init hooks
+// Отключение производится добавлением disable => true рядом с next
+$cms["hook"]  = "query"; // Default hook
+$cms["hooks"] = array(
+    "query"    => array( "next" => "template" ), 
+    "template" => array( "next" => "echo"     ), 
+    "echo"     => array( "next" => "write"    ), 
+    "write"    => array( "next" => ""         ), 
+    "admin"    => array( "next" => "template" ), 
+    "api"      => array( "next" => ""         ), 
+    "cron"     => array( "next" => ""         ),
+);
+
+// route array
+$cms["urls"] = array();
+
+// Load functions files
+foreach( glob( $cms["cms_dir"] . "/*.fn.php" ) as $file ) {
+    include_once( $file );
+}
+
+// Load modules
+foreach( glob( "{$cms['cms_dir']}/mod/*.mod.php" ) as $module ) {
+    include_once( $module );
+}
+
+// Load current template modules
+if ( ! empty( $cms["config"]["template.mod.php"]["template"] ) ) {
+    foreach( glob( "{$cms['cms_dir']}/{$cms['config']['template.mod.php']['template']}/*.mod.php" ) as $module ) {
+        include_once( $module );
+    }
+}
+
+// Отсортировать маршруты чтобы короткие совпадения не перекрывали более длинные
+function urls_sort( $a, $b ) {
+    if ( strlen( $a ) >= strlen( $b ) )
+        return -1;
+    else
+        return 1;
+}
+uksort( $cms["urls"], "urls_sort" );
+
+// select route
+foreach( $cms["urls"] as $url => $hook ) {
+    // Нет смысла в /u для URL
+    if ( $url = preg_replace( "/\//", "\\/", $url ) ) { // Escape / for regexp
+        if ( preg_match( "/{$url}/", $cms["base_path"] . $cms["url"]["path"], $cms["url"]["match"] ) ) {
+            $cms["hook"] = $hook;
+            break;
+        }
+    }
+}
+
+// RUN
+while ( ! empty( $cms["hook"] ) ) {
+    do_hook( $cms["hook"] );
+    $cms["hook"] = $cms["hooks"][ $cms["hook"] ]["next"];
+}
+
+// Saving accumulated debugging information to a file
+if ( ! empty( $cms["config"]["debug"] ) && ! empty( $cms["debug"] ) ) {
+    $debug_file = $cms["cms_dir"] . "/debug.log.php";
+    $new_debug = $cms["debug"];
+    if ( is_file( $debug_file ) && $handle = fopen( $debug_file, "r" ) ) {
+        flock( $handle, LOCK_SH );
+        include( $debug_file );
+        flock( $handle, LOCK_UN );
+        $cms["debug"] = array_replace_recursive( $cms["debug"], $new_debug );
+    }
+    file_put_contents( $debug_file, '<?php $cms["debug"] = ' . var_export( $cms["debug"], true ) . ";\n", LOCK_EX );
+}
+
+/* Measuring speed and memory consumption
+if ( $cms["url"]["path"] == $cms["config"]["admin.mod.php"]["api_url"] ) {
+    $fn = $_POST["fn"] . " ";
+} else {
+    $fn = "";
+}
+file_put_contents( __DIR__ . "/perf.log",
+    $cms["base_path"] . $cms["url"]["path"] . " " .
+    $fn .
+    (int)( ( microtime( true ) - $time_start ) * 1000 ) . "ms " .
+    (int)( memory_get_peak_usage() / 1000 ) . " kB\n",
+    FILE_APPEND );
+*/
+//file_put_contents( __DIR__ . "/cms.log.php", '<?php $cms = ' . var_export( $cms, true ) . ";\n" );