diff --git a/init.php b/init.php index d7fdaed..b6e6e36 100644 --- a/init.php +++ b/init.php @@ -24,30 +24,29 @@ $baseDir = getcwd() . DIRECTORY_SEPARATOR . $projectName; $dirs = [ '', 'WEBROOT', - 'public/api', - 'public/api/v1', + 'WEBROOT/api', + 'WEBROOT/api/v1', 'WEBROOT/commands', - 'public/static', + 'WEBROOT/static', 'WEBROOT/src', - 'config', - 'src/config', - 'src/database', - 'src/utils', - 'src/MVC', - 'src/MVC/Core', - 'src/MVC/Classes', - 'src/MVC/Controller', - 'src/MVC/Model', - 'src/MVC/View', - 'src/MVC/View/admin', - 'src/MVC/View/templates', - 'src/MVC/Middleware', - 'src/MVC/Layout', - 'src/MVC/Layout/Templates', - 'src/MVC/Layout/Block', - 'storage', - 'storage/uploads', - 'storage/logs', + 'WEBROOT/src/config', + 'WEBROOT/src/database', + 'WEBROOT/src/utils', + 'WEBROOT/src/MVC', + 'WEBROOT/src/MVC/Core', + 'WEBROOT/src/MVC/Classes', + 'WEBROOT/src/MVC/Controller', + 'WEBROOT/src/MVC/Model', + 'WEBROOT/src/MVC/View', + 'WEBROOT/src/MVC/View/admin', + 'WEBROOT/src/MVC/View/templates', + 'WEBROOT/src/MVC/Middleware', + 'WEBROOT/src/MVC/Layout', + 'WEBROOT/src/MVC/Layout/Templates', + 'WEBROOT/src/MVC/Layout/Block', + 'WEBROOT/storage', + 'WEBROOT/storage/uploads', + 'WEBROOT/logs', ]; foreach ($dirs as $dir) { @@ -65,13 +64,13 @@ $files['server.php'] = <<<'PHP' $file, 'size' => round(filesize($path) / 1024, 2), 'date' => date('Y-m-d H:i:s', filemtime($path)) @@ -1061,7 +1060,7 @@ $files[] = [ PHP; // --- CORE --- -$files['src/MVC/Core/Controller.php'] = <<<'PHP' +$files['WEBROOT/src/MVC/Core/Controller.php'] = <<<'PHP' @@ -1627,7 +1626,7 @@ $files['src/MVC/Layout/Templates/main.php'] = <<<'HTML' HTML; // --- CONTROLLERS --- -$files['src/MVC/Controller/AdminController.php'] = <<<'PHP' +$files['WEBROOT/src/MVC/Controller/AdminController.php'] = <<<'PHP' đź“§ E-Mail Service
HTML; -$files['src/MVC/View/admin/users.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/admin/users.php'] = <<<'HTML'

👤 Benutzerverwaltung

- +
- +
@@ -1717,7 +1716,7 @@ $files['src/MVC/View/admin/users.php'] = <<<'HTML'
HTML; -$files['src/MVC/Controller/ApiController.php'] = <<<'PHP' +$files['WEBROOT/src/MVC/Controller/ApiController.php'] = <<<'PHP' Dashboard

Willkommen in deinem neuen MVC-System mit integriertem Header.

"; -$files['src/MVC/View/test1.php'] = "

Service 1

"; -$files['src/MVC/View/test2.php'] = "

System Check

- "; +$files['WEBROOT/src/MVC/View/home.php'] = "

Dashboard

Willkommen in deinem neuen MVC-System mit integriertem Header.

"; -$files['src/MVC/View/docs.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/test1.php'] = "

Service 1

"; + +$files['WEBROOT/src/MVC/View/test2.php'] = "

System Check

"; + +$files['WEBROOT/src/MVC/View/docs.php'] = <<<'HTML'
-

🏛️ MVC Framework - Die Entwickler-Bibel

+

🏛️ MVC Framework - Die Entwickler-Bibel

-
-

đź“– Inhaltsverzeichnis

- -
+
+

đź“– Inhaltsverzeichnis

+ +
- -
-

1.1 Request Lifecycle

-

Der Weg einer Anfrage durch das Framework ist linear und vorhersehbar:

-
    -
  1. Entry: Alle Requests treffen auf public/index.php.
  2. -
  3. Bootstrap: Session wird gestartet, der autoloader lädt Klassen - nach Bedarf.
  4. -
  5. Routing: Der Router lädt die routes.php und prüft - den GET['service'] Parameter.
  6. -
  7. Security: Middlewares (z.B. auth) werden ausgefĂĽhrt.
  8. -
  9. Logic: Der Controller fĂĽhrt die Zielmethode aus.
  10. -
  11. Rendering: Der Controller ruft $this->render() auf.
  12. -
  13. Output: Das fertige Layout wird an den Browser gesendet.
  14. -
-
+ +
+

1.1 Request Lifecycle

+

Der Weg einer Anfrage durch das Framework ist linear und vorhersehbar:

+
    +
  1. Entry: Alle Requests treffen auf WEBROOT/index.php.
  2. +
  3. Bootstrap: Session wird gestartet, der autoloader lädt Klassen + nach Bedarf.
  4. +
  5. Routing: Der Router lädt die routes.php und prüft + den GET['service'] Parameter.
  6. +
  7. Security: Middlewares (z.B. auth) werden ausgefĂĽhrt.
  8. +
  9. Logic: Der Controller fĂĽhrt die Zielmethode aus.
  10. +
  11. Rendering: Der Controller ruft $this->render() auf.
  12. +
  13. Output: Das fertige Layout wird an den Browser gesendet.
  14. +
+
-
-

1.2 Detaillierte Verzeichnisstruktur

-
-            ├── Framework.code-workpace
-            ├── README.md
-            ├── init.php
-            └── /WEBROOT
-                ├── /api
-                |   └── /v1
-                ├── /src
-                |   ├── /config
-                |   ├── /database
-                |   ├── /MVC
-                |       ├── /Core
-                |       ├── /Classes
-                |       ├── /Controller
-                |       ├── /Model
-                |       ├── /View
-                |       └── /Layout
-                |           └── /Templates
-                ├── /commands
-                ├── /static
-                ├── /storage
-                └── /logs
-                    
+
+

1.2 Detaillierte Verzeichnisstruktur

+
+├── Framework.code-workpace
+├── README.md
+├── init.php
+└── /WEBROOT
+	├── /api
+	|   └── /v1
+	├── /src
+	|   ├── /config
+	|   ├── /database
+	|   ├── /MVC
+	|       ├── /Core
+	|       ├── /Classes
+	|       ├── /Controller
+	|       ├── /Model
+	|       ├── /View
+	|       └── /Layout
+	|           └── /Templates
+	├── /commands
+	├── /static
+	├── /storage
+	└── /logs
+		
-
+
-
-

1.3 Autoloader & Namespaces

-

Das Framework nutzt einen PSR-4 kompatiblen Autoloader in src/MVC/autoloader.php. -

-
// Automatische Auflösung:
-            // MVC\Classes\Auth -> src/MVC/Classes/Auth.php
-            // MVC\Core\Router  -> src/MVC/Core/Router.php
-
+
+

1.3 Autoloader & Namespaces

+

Das Framework nutzt einen PSR-4 kompatiblen Autoloader in src/MVC/autoloader.php. +

+
// Automatische Auflösung:
+// MVC\Classes\Auth -> src/MVC/Classes/Auth.php
+// MVC\Core\Router  -> src/MVC/Core/Router.php
+
- -
-

2.1 Routing Grundlagen

-

Routen werden zentral in src/config/routes.php definiert.

-
$router->add('home', \MVC\Controller\HomeController::class, 'index');
-
+ +
+

2.1 Routing Grundlagen

+

Routen werden zentral in src/config/routes.php definiert.

+
$router->add('home', \MVC\Controller\HomeController::class, 'index');
+
-
-

2.2 Middleware System

-

Middlewares sind Klassen, die vor dem eigentlichen Controller ausgefĂĽhrt werden. Sie dienen der - Validierung von Requests, Authentifizierung oder Logging.

+
+

2.2 Middleware System

+

Middlewares sind Klassen, die vor dem eigentlichen Controller ausgefĂĽhrt werden. Sie dienen der + Validierung von Requests, Authentifizierung oder Logging.

-

Globale Middlewares

-

Diese werden bei jedem Request ausgefĂĽhrt (z.B. IP-Blocker oder globales - Logging):

-
$router->addGlobal('block');
-            $router->addGlobal('global');
+

Globale Middlewares

+

Diese werden bei jedem Request ausgefĂĽhrt (z.B. IP-Blocker oder globales + Logging):

+
$router->addGlobal('block');
+$router->addGlobal('global');
-

Routen-spezifische Middlewares

-

Diese werden nur fĂĽr bestimmte Services definiert:

-
// Erfordert Login ('auth') und Admin-Status ('admin')
-            $router->add('admin', Controller::class, 'index', ['auth', 'admin']);
+

Routen-spezifische Middlewares

+

Diese werden nur fĂĽr bestimmte Services definiert:

+
// Erfordert Login ('auth') und Admin-Status ('admin')
+$router->add('admin', Controller::class, 'index', ['auth', 'admin']);
-

VerfĂĽgbare Middlewares

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameKlasseFunktion
authAuthMiddlewarePrĂĽft, ob der User eingeloggt ist ($_SESSION['user_logged_in']).
adminAdminMiddlewarePrĂĽft auf Administrator-Rechte ($_SESSION['is_admin']).
blockBlockMiddlewareEinfacher IP-Blocker fĂĽr gesperrte Adressen.
globalEveryRequestMiddlewarePlatzhalter fĂĽr Logik, die immer laufen soll.
+

VerfĂĽgbare Middlewares

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameKlasseFunktion
authAuthMiddlewarePrĂĽft, ob der User eingeloggt ist ($_SESSION['user_logged_in']).
adminAdminMiddlewarePrĂĽft auf Administrator-Rechte ($_SESSION['is_admin']).
blockBlockMiddlewareEinfacher IP-Blocker fĂĽr gesperrte Adressen.
globalEveryRequestMiddlewarePlatzhalter fĂĽr Logik, die immer laufen soll.
-

Eigene Middleware erstellen

-
    -
  1. Erstelle eine Klasse in src/MVC/Middleware/.
  2. -
  3. Implementiere das MiddlewareInterface.
  4. -
  5. Registriere den Namen im Mapping der src/MVC/Core/Middleware.php.
  6. -
-
+

Eigene Middleware erstellen

+
    +
  1. Erstelle eine Klasse in src/MVC/Middleware/.
  2. +
  3. Implementiere das MiddlewareInterface.
  4. +
  5. Registriere den Namen im Mapping der src/MVC/Core/Middleware.php.
  6. +
+
- + - -
-

3.1 Database Methods (Low-Level)

-

Sichere DB-Operationen via src/utils/databaseMethods.php unter Verwendung von - Prepared Statements:

-
    -
  • DatabaseShow($table, $cols, $where, ...$values)
  • -
  • DatabaseInsert($table, $cols, ...$values)
  • -
  • DatabaseUpdate($table, $set, $where, ...$values)
  • -
  • DatabaseDelete($table, $where, ...$values)
  • -
-
+ +
+

3.1 Database Methods (Low-Level)

+

Sichere DB-Operationen via src/utils/databaseMethods.php unter Verwendung von + Prepared Statements:

+
    +
  • DatabaseShow($table, $cols, $where, ...$values)
  • +
  • DatabaseInsert($table, $cols, ...$values)
  • +
  • DatabaseUpdate($table, $set, $where, ...$values)
  • +
  • DatabaseDelete($table, $where, ...$values)
  • +
+
-
-

3.2 Core\Model (Abstraktion)

-

Ermöglicht objektorientierte DB-Zugriffe durch Vererbung.

-
class User extends \MVC\Core\Model {
-                protected static $table = "Users";
-            }
-            $allUsers = User::all();
-
+
+

3.2 Core\Model (Abstraktion)

+

Ermöglicht objektorientierte DB-Zugriffe durch Vererbung.

+
class User extends \MVC\Core\Model {
+	protected static $table = "Users";
+}
+$allUsers = User::all();
+
-
-

3.3 Installations-Script

-

Das Script install_db.php automatisiert das gesamte DB-Setup:

-
    -
  • Root-Access: Verbindet sich mit Root-Rechten (siehe env.ini). -
  • -
  • DB-Erstellung: Erstellt die Datenbank und einen dedizierten Worker-User. -
  • -
  • Tabellen: Legt Users (mit Admin-Account) und - Mailing an. -
  • -
  • Models: Generiert automatisch die zugehörigen Model-Dateien im Quellcode. -
  • -
-
+
+

3.3 Installations-Script

+

Das Script install_db.php automatisiert das gesamte DB-Setup:

+
    +
  • Root-Access: Verbindet sich mit Root-Rechten (siehe env.ini). +
  • +
  • DB-Erstellung: Erstellt die Datenbank und einen dedizierten Worker-User. +
  • +
  • Tabellen: Legt Users (mit Admin-Account) und + Mailing an. +
  • +
  • Models: Generiert automatisch die zugehörigen Model-Dateien im Quellcode. +
  • +
+
- -
-

4.1 Layout Engine (Blöcke)

-

Das Framework nutzt ein flexibles Block-System in MVC\Layout\Layout:

-
$layout = new Layout('main');
-            $layout->setBlock('title', 'Mein Titel');
-            $layout->setBlock('content', 'HTML-Inhalt');
-            echo $layout->render();
-
+ +
+

4.1 Layout Engine (Blöcke)

+

Das Framework nutzt ein flexibles Block-System in MVC\Layout\Layout:

+
$layout = new Layout('main');
+$layout->setBlock('title', 'Mein Titel');
+$layout->setBlock('content', 'HTML-Inhalt');
+echo $layout->render();
+
-
-

4.2 View System

-

Die MVC\Core\View Klasse extrahiert Daten-Arrays direkt in PHP-Templates:

-
// Im Controller:
-            return $this->render('home', ['name' => 'Max']);
+	
+

4.2 View System

+

Die MVC\Core\View Klasse extrahiert Daten-Arrays direkt in PHP-Templates:

+
// Im Controller:
+return $this->render('home', ['name' => 'Max']);
 
-            // In src/MVC/View/home.php:
-            <h1>Hallo <?= $name ?></h1>
-
+// In src/MVC/View/home.php: +<h1>Hallo <?= $name ?></h1>
+
-
-

4.3 DarkMode & Themes

-

UnterstĂĽtzt nahtlose Umschaltung zwischen Light- und DarkMode:

-
    -
  • Zustand: Gespeichert in $_SESSION['theme'].
  • -
  • Frontend: Die Klasse .dark-mode am <html> - Tag schaltet CSS-Variablen um.
  • -
  • Toggle: Ăśber den Service toggle_theme steuerbar.
  • -
-
+
+

4.3 DarkMode & Themes

+

UnterstĂĽtzt nahtlose Umschaltung zwischen Light- und DarkMode:

+
    +
  • Zustand: Gespeichert in $_SESSION['theme'].
  • +
  • Frontend: Die Klasse .dark-mode am <html> + Tag schaltet CSS-Variablen um.
  • +
  • Toggle: Ăśber den Service toggle_theme steuerbar.
  • +
+
- -
-

5.1 Auth Klasse

-

Zentrales Identitätsmanagement:

-
Auth::login($user, $pass); // Login-Versuch
-            Auth::check();             // Eingeloggt?
-            Auth::isAdmin();           // Admin-Rechte?
-            Auth::user();              // Gibt User-Array zurĂĽck
-
+ +
+

5.1 Auth Klasse

+

Zentrales Identitätsmanagement:

+
Auth::login($user, $pass); // Login-Versuch
+Auth::check();             // Eingeloggt?
+Auth::isAdmin();           // Admin-Rechte?
+Auth::user();              // Gibt User-Array zurĂĽck
+
-
-

5.2 Form Generator

-

Erstellt konsistente HTML-Formulare mit Bootstrap-ähnlichem Styling:

-
echo Form::open('service_name');
-            echo Form::input('email', 'E-Mail', 'email');
-            echo Form::textarea('msg', 'Nachricht');
-            echo Form::submit('Senden');
-            echo Form::close();
-
+
+

5.2 Form Generator

+

Erstellt konsistente HTML-Formulare mit Bootstrap-ähnlichem Styling:

+
echo Form::open('service_name');
+echo Form::input('email', 'E-Mail', 'email');
+echo Form::textarea('msg', 'Nachricht');
+echo Form::submit('Senden');
+echo Form::close();
+
-
-

5.3 Storage & File Handling

-

Abstraktionslayer fĂĽr das Dateisystem:

-
    -
  • Upload: Storage::upload('file_input') speichert sicher in - /storage/uploads/. -
  • -
  • Download: Storage::download('path/to/file') erzwingt - Datei-Download mit korrekten Headern.
  • -
  • Listing: Storage::listFiles() gibt Array aller verfĂĽgbaren - Dateien zurĂĽck.
  • -
-
+
+

5.3 Storage & File Handling

+

Abstraktionslayer fĂĽr das Dateisystem:

+
    +
  • Upload: Storage::upload('file_input') speichert sicher in + /storage/uploads/. +
  • +
  • Download: Storage::download('path/to/file') erzwingt + Datei-Download mit korrekten Headern.
  • +
  • Listing: Storage::listFiles() gibt Array aller verfĂĽgbaren + Dateien zurĂĽck.
  • +
+
-
-

5.4 Mailer Klasse

-

Versand von System-Mails:

-
    -
  • Log: Jede Mail wird (wenn möglich) in der DB-Tabelle Mailing - protokolliert.
  • -
  • Fallback: Bei DB-Fehlern erfolgt automatisches Logging in - logs/mails.log. -
  • -
  • Error-Mail: Spezielle error() Methode fĂĽr kritische - Systembenachrichtigungen.
  • -
-
+
+

5.4 Mailer Klasse

+

Versand von System-Mails:

+
    +
  • Log: Jede Mail wird (wenn möglich) in der DB-Tabelle Mailing + protokolliert.
  • +
  • Fallback: Bei DB-Fehlern erfolgt automatisches Logging in + logs/mails.log. +
  • +
  • Error-Mail: Spezielle error() Methode fĂĽr kritische + Systembenachrichtigungen.
  • +
+
-
-

5.5 Logger & Debugging

-

Zentrales Fehler-Management:

-
    -
  • Auto-Catch: Registriert sich als globaler Exception- und Error-Handler. -
  • -
  • Tracing: Schreibt vollständige Stacktraces in - storage/logs/error.log. -
  • -
  • Manuell: Logger::log('Nachricht', 'LEVEL') fĂĽr eigenes - Logging.
  • -
-
+
+

5.5 Logger & Debugging

+

Zentrales Fehler-Management:

+
    +
  • Auto-Catch: Registriert sich als globaler Exception- und Error-Handler. +
  • +
  • Tracing: Schreibt vollständige Stacktraces in + WEBROOT/logs/error.log. +
  • +
  • Manuell: Logger::log('Nachricht', 'LEVEL') fĂĽr eigenes + Logging.
  • +
+
- -
-

6.1 CLI Werkzeuge (make.php)

-

Das Schweizer Taschenmesser fĂĽr die Entwicklung:

-
    -
  • -c, --controller: Nur den Controller erstellen.
  • -
  • -v, --view: Nur die View erstellen.
  • -
  • -r, --route: Nur die Route registrieren.
  • -
  • -n, --nav: Nur den Navigationspunkt hinzufĂĽgen.
  • -
  • -a, --auth: Erfordert Login fĂĽr diesen Service.
  • -
  • -l, --label "Text": Anzeigename in der Sidebar.
  • -
-

How to Use:

-
    -
  • php make.php module [Name]: Erstellt Controller, View, Route und Nav-Eintrag in - einem Rutsch.
  • -
  • php make.php model [Tabelle] [Spalten]: Generiert fertige Model-Klassen inkl. - Spaltendokumentation.
  • -
-
+ +
+

6.1 CLI Werkzeuge (make.php)

+

Das Schweizer Taschenmesser fĂĽr die Entwicklung:

+
    +
  • -c, --controller: Nur den Controller erstellen.
  • +
  • -v, --view: Nur die View erstellen.
  • +
  • -r, --route: Nur die Route registrieren.
  • +
  • -n, --nav: Nur den Navigationspunkt hinzufĂĽgen.
  • +
  • -a, --auth: Erfordert Login fĂĽr diesen Service.
  • +
  • -l, --label "Text": Anzeigename in der Sidebar.
  • +
+

How to Use:

+
    +
  • php make.php module [Name]: Erstellt Controller, View, Route und Nav-Eintrag in + einem Rutsch.
  • +
  • php make.php model [Tabelle] [Spalten]: Generiert fertige Model-Klassen inkl. + Spaltendokumentation.
  • +
+
-
-

6.2 API Entwicklung

-

Standardisierte JSON-Antworten ĂĽber die Api Klasse:

-
// In src/MVC/Classes/Api.php
-            Api::jsonResponse(['data' => '...'], 200);
-

API-Files befinden sich ĂĽbersichtlich in public/api/v1/.

-
+
+

6.2 API Entwicklung

+

Standardisierte JSON-Antworten ĂĽber die Api Klasse:

+
// In src/MVC/Classes/Api.php
+Api::jsonResponse(['data' => '...'], 200);
+

API-Files befinden sich ĂĽbersichtlich in WEBROOT/api/v1/.

+
-
-

6.3 Best Practices

-
    -
  • Security: Keine Variablen direkt in SQL-Strings (Prepared Statements - nutzen!).
  • -
  • Output: Variablen in Views immer mit htmlspecialchars() - maskieren.
  • -
  • Architecture: Controller rufen Models auf, Views zeigen nur Daten an. Keine - DB-Logik in der View!
  • -
-
-
+
+

6.3 Best Practices

+ +
+
- + @media (max-width: 768px) { + .toc-grid { + grid-template-columns: 1fr; + } + } + HTML; - -$files['src/MVC/View/login.php'] = <<<'HTML' - -
-

🔑 Login

- -
- -
-
- - -
-
- - -
- -
-
+$files['WEBROOT/src/MVC/View/login.php'] = <<<'HTML' + +
+

🔑 Login

+ +
+ +
+
+ + +
+
+ + +
+ +
+
HTML; -$files['src/MVC/View/templates/data_form.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/templates/data_form.php'] = <<<'HTML'

📝 Daten-Formular

- + - -
-
- + +
+
+ - -
- -
- + +
+ +
+ -
- -
-
- 'Max', 'required' => true]) ?> -
-
- 'Mustermann', 'required' => true]) ?> -
-
+
+ +
+
+ 'Max', 'required' => true]) ?> +
+
+ 'Mustermann', 'required' => true]) ?> +
+
- 'max@example.com', 'required' => true]) ?> + 'max@example.com', 'required' => true]) ?> -
- - -
+
+ + +
-
- -
- - - -
-
+
+ +
+ + + +
+
-
- -
- - -
-
+
+ +
+ + +
+
- - - -
+ + + +
- +.btn:hover { + opacity: 0.9; +} + HTML; -$files['src/MVC/View/templates/data_table.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/templates/data_table.php'] = <<<'HTML'

📊 Datenübersicht

-
- -
- - -
-
+
+ +
+ + +
+
-
- - - - - - - - - - - - - - - - - - - - - -
IDNameStatusDatumAktionen
#Beispiel Datensatz Aktiv - - -
-
+
+ + + + + + + + + + + + + + + + + + + + + +
IDNameStatusDatumAktionen
#Beispiel Datensatz Aktiv + + +
+
- + .btn-icon { + background: none; + border: none; + cursor: pointer; + font-size: 1.1rem; + padding: 5px; + } + HTML; -$files['src/MVC/View/templates/download.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/templates/download.php'] = <<<'HTML'

📥 Datei Downloads -

+ -
- - - - - - - - - - - - - - - - - - - - - - - - - -
DateinameGrößeDatumAktion
Keine Dateien - verfĂĽgbar.
KB - đź’ľ Download -
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
DateinameGrößeDatumAktion
Keine Dateien + verfĂĽgbar.
KB + đź’ľ Download +
+
- + .btn-download:hover { + opacity: 0.9; + } + HTML; -$files['src/MVC/View/templates/upload.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/View/templates/upload.php'] = <<<'HTML'

📤 Datei Upload

- + - -
- -
- + +
+ +
+ -
- 'multipart/form-data']) ?> +
+ 'multipart/form-data']) ?> - true]) ?> + true]) ?> - 'Kurze Beschreibung der Datei...']) ?> + 'Kurze Beschreibung der Datei...']) ?> - + - -
+ +
- + .alert-error { + background: rgba(231, 76, 60, 0.1); + border-color: #e74c3c; + color: #c0392b; + } + HTML; -$files['src/MVC/Layout/Block/standard.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/Layout/Block/standard.php'] = <<<'HTML' @@ -2973,7 +2972,7 @@ $files['src/MVC/Layout/Block/standard.php'] = <<<'HTML' HTML; -$files['src/MVC/Layout/Block/modern.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/Layout/Block/modern.php'] = <<<'HTML' @@ -3000,7 +2999,7 @@ $files['src/MVC/Layout/Block/modern.php'] = <<<'HTML' HTML; -$files['src/MVC/Layout/Block/minimal.php'] = <<<'HTML' +$files['WEBROOT/src/MVC/Layout/Block/minimal.php'] = <<<'HTML' @@ -3026,7 +3025,7 @@ Time: HTML; // --- CONFIG: routes.php --- -$files['config/routes.php'] = <<<'PHP' +$files['WEBROOT/src/config/routes.php'] = <<<'PHP' add('api/v1/become', \MVC\Controller\ApiController::class, 'become'); PHP; // --- CONFIG: navigation.php --- -$files['config/navigation.php'] = <<<'PHP' +$files['WEBROOT/src/config/navigation.php'] = <<<'PHP' -
-

-

Hier kannst du nun dein Projekt aufbauen.

-
+
+

+

Hier kannst du nun dein Projekt aufbauen.

+
- + HTML; - if (!file_exists($viewFile)) { - file_put_contents($viewFile, $viewContent); - echo "✅ View erstellt: src/MVC/View/{$key}.php\n"; - } else { - echo "⚠️ View existiert bereits.\n"; - } - } +if (!file_exists($viewFile)) { +file_put_contents($viewFile, $viewContent); +echo "✅ View erstellt: WEBROOT/src/MVC/View/{$key}.php\n"; +} else { +echo "⚠️ View existiert bereits.\n"; +} +} - // 3. Route hinzufügen - if ($doRoute) { - if (file_exists($routesFile)) { - $routesContent = file_get_contents($routesFile); - $routeLine = "\$router->add('{$key}', - \\MVC\\Controller\\{$className}Controller::class, '{$key}'" . ($isAuth ? ", - ['auth']" : "") . ");\n"; +// 3. Route hinzufügen +if ($doRoute) { +if (file_exists($routesFile)) { +$routesContent = file_get_contents($routesFile); +$routeLine = "\$router->add('{$key}', +\\MVC\\Controller\\{$className}Controller::class, '{$key}'" . ($isAuth ? ", +['auth']" : "") . ");\n"; - if (strpos($routesContent, "'{$key}'") === false) { - file_put_contents($routesFile, $routesContent . $routeLine); - echo "✅ Route hinzugefügt: {$routesFile}\n"; - } else { - echo "⚠️ Route für '{$key}' existiert bereits in routes.php\n"; - } - } else { - echo "❌ Fehler: routes.php nicht gefunden!\n"; - } - } +if (strpos($routesContent, "'{$key}'") === false) { +file_put_contents($routesFile, $routesContent . $routeLine); +echo "✅ Route hinzugefügt: {$routesFile}\n"; +} else { +echo "⚠️ Route für '{$key}' existiert bereits in routes.php\n"; +} +} else { +echo "❌ Fehler: routes.php nicht gefunden!\n"; +} +} - // 4. Navigation hinzufügen - if ($doNav) { - if (file_exists($navFile)) { - $navContent = file_get_contents($navFile); - $navItem = " '{$key}' => ['label' => '{$label}'],\n"; +// 4. Navigation hinzufügen +if ($doNav) { +if (file_exists($navFile)) { +$navContent = file_get_contents($navFile); +$navItem = " '{$key}' => ['label' => '{$label}'],\n"; - if (strpos($navContent, "'{$key}'") === false) { - // Wir suchen nach dem Ende des Arrays ]; - $newNavContent = preg_replace('/(\];\s*)$/', $navItem . '$1', - trim($navContent)); - file_put_contents($navFile, $newNavContent . "\n"); - echo "✅ Navigation hinzugefügt: {$navFile}\n"; - } else { - echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\n"; - } - } else { - echo "❌ Fehler: navigation.php nicht gefunden!\n"; - } - } +if (strpos($navContent, "'{$key}'") === false) { +// Wir suchen nach dem Ende des Arrays ]; +$newNavContent = preg_replace('/(\];\s*)$/', $navItem . '$1', +trim($navContent)); +file_put_contents($navFile, $newNavContent . "\n"); +echo "✅ Navigation hinzugefügt: {$navFile}\n"; +} else { +echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\n"; +} +} else { +echo "❌ Fehler: navigation.php nicht gefunden!\n"; +} +} - echo "\nFertig!\n"; - } +echo "\nFertig!\n"; +} PHP; - - $files['install_db.php'] = <<<'PHP' $info) { echo "--- $name ---\n"; try { if (DatabaseCreateTable($name, $info['columns'])) { - $path = __DIR__ . "/src/MVC/Model/{$name}.php"; + $path = __DIR__ . "/WEBROOT/src/MVC/Model/{$name}.php"; if (!file_exists($path)) { if (!is_dir(dirname($path))) mkdir(dirname($path), 0755, true); file_put_contents($path, $info['model']); @@ -3512,8 +3509,8 @@ foreach ($tables as $name => $info) { // 3. Test-User anlegen echo "👤 Erstelle Test-User...\n"; -require_once __DIR__ . '/src/MVC/Core/Model.php'; -require_once __DIR__ . '/src/MVC/Model/Users.php'; +require_once __DIR__ . '/WEBROOT/src/MVC/Core/Model.php'; +require_once __DIR__ . '/WEBROOT/src/MVC/Model/Users.php'; try { if (!\MVC\Model\Users::getByUsername('admin')) { \MVC\Model\Users::insert([ @@ -3547,10 +3544,9 @@ foreach ($files as $file => $content) { } echo "\n✨ Projekt '$projectName' wurde initialisiert!\n"; -echo "1. Richte deine Datenbankverbindung in config/env.ini ein.\n"; +echo "1. Richte deine Datenbankverbindung in WEBROOT/src/config/env.ini ein.\n"; echo "2. Datenbank installieren: php install_db.php\n"; echo " (Ohne Tabelle werden Logs in /logs/ gespeichert)\n"; echo "3. CLI-Tool nutzen: php make.php help\n"; echo "4. Starten: php server.php\n"; -echo "5. Öffnen: http://localhost:8000\n"; - +echo "5. Öffnen: http://localhost:8000\n"; \ No newline at end of file