Compare commits

...
9 Commits
18 changed files with 421 additions and 28 deletions
+6
View File
@@ -0,0 +1,6 @@
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-]+)/?$ index.php?page=$1 [QSA,L]
+162 -2
View File
@@ -1,3 +1,163 @@
# sld-php-template # SLD PHP Template
Basic php framework for php plain websites. A lightweight and modular PHP starter framework for building plain PHP websites without heavy dependencies.
This project is designed to provide a clean structure, reusable components, and a simple initialization system to speed up development while keeping full control over the codebase.
---
## 🚀 Features
- ⚡ Lightweight and fast (no external frameworks required)
- 📁 Clean and scalable folder structure
- 🔧 Centralized configuration system
- 🧩 Modular templates (header, footer, includes)
- 🎨 Basic frontend setup (CSS variables, animations, JS helpers)
- 🛠 Ready-to-use initialization system
- ❌ Built-in error pages (environment & database)
---
## 📂 Project Structure
```
.
├── admin/
├── assets/
│ ├── css/
│ ├── img/
│ └── js/
├── config/
├── functions/
├── includes/
├── pages/
├── templates/
├── themes/
├── public/
├── index.php
└── README.md
```
---
## ⚙️ Configuration
All core configuration is located inside the `config/` directory:
- `init.php` → Application bootstrap
- `constants.php` → Global constants
- `settings.php` → App settings
- `db.php` → Database connection
- `functions_init.php` → Function loader
---
## 🧠 How It Works
1. The application starts from `index.php`
2. Core initialization is handled by the config system
3. Templates are loaded dynamically (`header.php`, `footer.php`)
4. Pages are rendered from the `pages/` directory
5. Custom logic can be added via the `functions/` folder
---
## 🎨 Frontend
The project includes a minimal frontend setup:
### CSS System
- Variables-based color system with multiple shades
- Basic layout styles
- Animation utilities
### JavaScript
- Simple helper functions like dynamic year rendering
---
## 🛠 Usage
1. Clone the repository:
```bash
git clone https://github.com/your-username/sld-php-template.git
```
2. Move it into your web server directory
3. Configure:
- Database (`config/db.php`)
- Environment settings (`config/settings.php`)
4. Open in browser:
```
http://localhost/your-project
```
---
## 📄 Pages
- `home.php` → Main homepage
- `db-error.php` → Database error page
- `env-error.php` → Environment error page
---
## 🧩 Templates
Reusable layout components:
- `templates/header.php`
- `templates/footer.php`
---
## 🧪 Status
🚧 This project is currently in development.
New features and improvements will be added progressively.
---
## 📌 Roadmap (Planned)
- [ ] Routing system
- [ ] Theme engine
- [ ] Admin panel structure
- [ ] CLI tools
- [ ] Environment (.env) support
- [ ] Basic authentication system
---
## 🤝 Contributing
Contributions, ideas, and feedback are welcome.
Feel free to open issues or pull requests.
---
## 📜 License
This project is licensed under the MIT License.
See the `LICENSE` file for details.
---
## 👤 Author
Created by Simone (SLD)
---
## 💡 Philosophy
This project aims to stay:
- Simple
- Transparent
- Framework-free
- Easy to extend
No magic, just clean PHP.
+42
View File
@@ -1,4 +1,15 @@
<?php <?php
/*
* In this array, please add the functions you may want to add on your project.
* Please note that you can use a variable or a costant by adding a space rather than
*/
$NewCostants = [
[ "BLOCKNOTES_FOLD", "ROOT_DIR", "blocknotes/" ]
];
// ##### PLEASE DO NOT TOUCH THE BELOW COSTANTS ##### //
// --- ROOT DIR --- // // --- ROOT DIR --- //
define("ASSETS_FOLD", ROOT_DIR . "assets/"); define("ASSETS_FOLD", ROOT_DIR . "assets/");
define("ADMIN_FOLD", ROOT_DIR . "admin/"); define("ADMIN_FOLD", ROOT_DIR . "admin/");
@@ -32,5 +43,36 @@
// --------------- // // --------------- //
/// CUSTOM COSTANTS DECLARED ///
foreach ($NewCostants as $const_array) {
$const_name = strtoupper($const_array[0]);
if (isset($const_array[2]) && !empty($const_array[2])) {
$base = $const_array[1];
$const_before = defined($base) ? constant($base) : $base;
$const_value = $const_array[2];
$full_path = $const_before . $const_value;
if (!is_dir($full_path) && !is_file($full_path)) {
debugStatusMes("The folder/file declared into '$const_name' constant is missing or not accessible. Please check it.", "High");
die;
}
if (!defined($const_name)) {
define($const_name, $full_path);
}
} else {
$const_value = $const_array[1];
if (!is_dir($const_value) && !is_file($const_value)) {
debugStatusMes("The folder/file declared into '$const_name' constant is missing or not accessible. Please check it.", "High");
die;
}
if (!defined($const_name)) {
define($const_name, $const_value);
}
}
}
?> ?>
+1
View File
@@ -13,6 +13,7 @@ try {
} catch (mysqli_sql_exception $e) { } catch (mysqli_sql_exception $e) {
// Access Deny // Access Deny
include(PAGES_FOLD . "db-error.php"); include(PAGES_FOLD . "db-error.php");
debugStatusMes("Database connection failed.", "High");
die(); die();
+120 -8
View File
@@ -1,22 +1,134 @@
<?php <?php
function error_env($option) { function error_env($option) {
global $env; global $env;
if (empty($env)) { if (empty($env)) {
$result = "<p class='err_env_result'><span>ERROR:</span> Variable '<u>\$env</u>' is empty!</p>"; $result = "<p class='err_env_result'><span>ERROR:</span> Variable '<u>\$env</u>' is empty!</p>";
$help = "<p class='err_env_help'>Please insert the correct value in the file 'config/init.php' or leave it to 'generic'</p>"; $help = "<p class='err_env_help'>Please insert the correct value in the file 'config/init.php' or leave it to 'generic'</p>";
} else { } else {
$result="<p class='err_env_result'><span>ERROR:</span> The environment '<u>{$env}</u>' not exists!</p>"; $result = "<p class='err_env_result'><span>ERROR:</span> The environment '<u>{$env}</u>' does not exist!</p>";
$help="<p class='err_env_help'>Please insert the correct value in the file 'config/init.php or leave it to 'generic'</p>"; $help = "<p class='err_env_help'>Please insert the correct value in the file 'config/init.php' or leave it to 'generic'</p>";
} }
if($option == "result"){ echo $option === "result" ? $result : $help;
echo $result; }
}elseif($option == "help"){
echo $help;
/**
* Get current page safely.
*/
function get_current_page() {
$page = $_GET["page"] ?? "home";
$page = strtolower(trim($page));
$page = preg_replace("/[^a-z0-9\-]/", "", $page);
if ($page === "") {
$page = "home";
}
return $page;
}
/**
* Resolve page file.
*/
function resolve_page() {
$page = get_current_page();
$file = PAGES_FOLD . $page . ".php";
// 👉 rendi disponibile globalmente
$GLOBALS["current_page"] = $page;
if (file_exists($file)) {
return $file;
}
http_response_code(404);
$GLOBALS["current_page"] = "404";
return PAGES_FOLD . "404.php";
}
/**
* DEBUG FUNCTIONS AND ARRAY
*/
$debug_messages = [
'High' => [],
'Medium' => [],
'Low' => [],
'Info' => []
];
// FUNCTION TO GET DEBUG STATUS MESSAGES
function debugStatusMes( string $Message, string $intensity) {
global $debug, $debug_messages;
// Controlla se il debug è attivo
if ($debug !== "on") {
return;
}
// Normalizza l'intensità per evitare errori di battitura (es. "high" diventa "High")
$intensity = ucfirst(strtolower($intensity));
// Verifica che l'intensità sia valida prima di inserire il messaggio
if (array_key_exists($intensity, $debug_messages)) {
$debug_messages[$intensity][] = $Message;
} else { } else {
echo "ERROR: Wrong attribute in declared in the function!"; // Se l'intensità non è corretta, la salva in una categoria generica o Low
die; $debug_messages['Low'][] = "[Intensità errata: $intensity] " . $Message;
}
} }
// DISPLAY DEBUG ERROR BAR
function displayDebug() {
global $debug, $debug_messages;
if ($debug !== "on") {
return;
} }
// Contenitore temporaneo nascosto per non creare sfarfallii nella pagina
echo '<div id="debug-source-content" style="display: none;">';
echo '<div style="background: #222; color: #fff; padding: 15px; font-family: monospace; border-bottom: 3px solid #ff4444; border-top: 3px solid #ff4444; margin-bottom: 20px;">';
echo '<h3 style="margin-bottom:5px;">⚙️ Debug Status Messages</h3>';
foreach ($debug_messages as $level => $messages) {
if (!empty($messages)) {
$color = '#6cef93';
if ($level === 'High') $color = '#ff4444';
if ($level === 'Medium') $color = '#ffbb33';
if ($level === 'Info') $color = '#4444ff';
echo "<div style='margin-bottom: 10px;'>";
echo "<strong style='color: $color;'>[" . $level . "]</strong>";
echo "<ul style='margin: 5px 0; padding-left: 20px;'>";
foreach ($messages as $msg) {
echo "<li>" . htmlspecialchars($msg) . "</li>";
}
echo "</ul>";
echo "</div>";
}
}
echo '</div>';
echo '</div>';
// Questo script JS prende il contenuto appena generato e lo sposta nel segnaposto in cima
?> ?>
<script>
document.addEventListener("DOMContentLoaded", function() {
const source = document.getElementById('debug-source-content');
const target = document.getElementById('debug-target-container');
if (source && target) {
// Sposta l'HTML dentro il contenitore all'inizio del body
target.innerHTML = source.innerHTML;
// Rimuove il vecchio elemento nascosto per pulizia
source.remove();
}
});
</script>
<?php
}
+5 -2
View File
@@ -1,5 +1,6 @@
<?php <?php
$env=""; include("config/functions_init.php");
$env="generic";
switch($env){ switch($env){
/*------ DON'T TOUCH THIS PART ------ */ /*------ DON'T TOUCH THIS PART ------ */
@@ -13,12 +14,14 @@
break; break;
/* ----------------------------------- */ /* ----------------------------------- */
default: default:
include("config/functions_init.php"); // Showing error page by default.
$error_env_check=true;
include("pages/env-error.php"); include("pages/env-error.php");
die; die;
} }
require_once(ROOT_DIR . "config/constants.php"); require_once(ROOT_DIR . "config/constants.php");
require_once(CONFIG_FOLD . "settings.php"); require_once(CONFIG_FOLD . "settings.php");
require_once(FUNCTIONS_FOLD . "functions.php");
?> ?>
+19 -2
View File
@@ -1,4 +1,8 @@
<?php <?php
// -- GENERAL SETTING --
$debug="on";
$php_debug="on";
// --- DB SETTINGS --- // --- DB SETTINGS ---
$db_needed="no"; $db_needed="no";
$db_debug="yes"; $db_debug="yes";
@@ -7,9 +11,23 @@ $db_name="database-name";
$db_user="database-user"; $db_user="database-user";
$db_pass="database-user-password"; $db_pass="database-user-password";
//-------------------------------------------------------------------------------------
// --- DON'T CHANGE ALL THE CODE BELOW!!! ---
//-------------------------------------------------------------------------------------
// --- GENERAL SECTION CONFIGURATION
if ($debug == "on"){ define("DEBUG",true);} else { define("DEBUG", false); }
// --- DON'T CHANGE ALL THE CODE BELOW --- if ($php_debug == "on") {
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
} else {
ini_set('display_errors', 0);
error_reporting(0);
}
// --- DB SECTION CONFIGURATION
if ($db_needed == "yes"){ if ($db_needed == "yes"){
define("DB_HOST", $db_host); define("DB_HOST", $db_host);
define("DB_USER", $db_user); define("DB_USER", $db_user);
@@ -17,6 +35,5 @@ if ($db_needed == "yes"){
define("DB_NAME", $db_name); define("DB_NAME", $db_name);
define("DB_DEBUG", $db_debug); define("DB_DEBUG", $db_debug);
require_once(CONFIG_FOLD . "db.php"); require_once(CONFIG_FOLD . "db.php");
} }
?> ?>
View File
+25
View File
@@ -0,0 +1,25 @@
<?php
/*
### LIST OF FUNCTIONS TO INCLUDE ###
Include in this array all the function files you may want to include.
You don't need to specify the extension .php, the system will automatically add it.
*/
$fun_to_inc = array(
//"example",
"demo-example"
);
// DON'T CHANGE THE CODE BELOW!!!
if (isset($fun_to_inc) && is_array($fun_to_inc) && !empty($fun_to_inc)){
foreach ($fun_to_inc as $fun){
if (file_exists(FUNCTIONS_FOLD . $fun . ".php")){
require_once(FUNCTIONS_FOLD . $fun . ".php");
} else {
debugStatusMes("Function file $fun.php not found in functions folder: '" . FUNCTIONS_FOLD . "'", "Medium");
if ($fun === "demo-example") {
debugStatusMes("The 'demo-example' function is only a demo. If you create a new function, needs to be included in the file specified above. Please remove the demo-example record from 'functions/functions.php' ", "Info");
}
}
}
}
+4 -3
View File
@@ -1,6 +1,7 @@
<?php <?php
include("./config/init.php"); include("./config/init.php");
include(ROOT_DIR . "/templates/header.php");
include("./pages/home.php"); include(TEMPLATES_FOLD . "header.php");
include("./templates/footer.php"); include(resolve_page());
include(TEMPLATES_FOLD . "footer.php");
?> ?>
+4
View File
@@ -0,0 +1,4 @@
<section>
<h1>404</h1>
<p>Page not found.</p>
</section>
+1
View File
@@ -0,0 +1 @@
<h1>About</h1>
+6 -1
View File
@@ -1,3 +1,7 @@
<?php if ($db_needed !== "yes"){
header("Location: " . ROOT_URL );
}
?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@@ -58,10 +62,11 @@
<?php <?php
if (DB_DEBUG == "yes"){ if (DB_DEBUG == "yes"){
echo "<p class=' details err_env_help'><span>Error Details: </span>" . $e->getMessage() . "</p>"; echo "<p class=' details err_env_help'><span>Error Details: </span>" . $e->getMessage() . "</p>";
} }
debugStatusMes("Database connection failed.", "High");
?> ?>
</div> </div>
</body> </body>
</html> </html>
+5
View File
@@ -1,3 +1,8 @@
<?php
if (! $error_env_check){
header("Location: " . ROOT_URL );
}
?>
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
+6
View File
@@ -0,0 +1,6 @@
<main class="main-content">
<section>
<h1>Welcome to the Home Page</h1>
<p>This is the home page.</p>
</section>
</main>
+1
View File
@@ -0,0 +1 @@
public_html
+2
View File
@@ -1,7 +1,9 @@
<footer class="main-footer"> <footer class="main-footer">
<div class="footer-credit">&copy; <year>year</year> - Company Name. All right reserved.</div> <div class="footer-credit">&copy; <year>year</year> - Company Name. All right reserved.</div>
<div class="webmaster_footer">Website designed by Simone Cusano - SimoLinuxDesign.org</div> <div class="webmaster_footer">Website designed by Simone Cusano - SimoLinuxDesign.org</div>
</footer> </footer>
<?php include(INCLUDES_FOLD . "js_footer.php"); ?> <?php include(INCLUDES_FOLD . "js_footer.php"); ?>
<?php displayDebug(); ?>
</body> </body>
</html> </html>
+3 -1
View File
@@ -4,9 +4,11 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php include(INCLUDES_FOLD . "head_links.php"); ?> <?php include(INCLUDES_FOLD . "head_links.php"); ?>
<title>Document</title> <title><?php echo ucfirst($GLOBALS["current_page"] ?? "Home"); ?></title>
</head> </head>
<body> <body>
<div id="debug-target-container"></div>
<header> <header>
<ul class="main-nav"> <ul class="main-nav">
<li><a href="#">Home</a></li> <li><a href="#">Home</a></li>