v2.5.1: Admin theme refactor, Navigation plugin, user roles, guide restructure
- Reorganize admin into admin/theme/default/ (views + assets) - Rename GuideNav to Navigation plugin (essential, protected) - Plugin assets support (SCSS/CSS) loaded after theme CSS - User roles: Admin, Content Manager, BI Manager, Site Admin - Role-based access control (RBAC) for admin routes and sidebar - Guide restructure: sub-topics in separate folders with sidebar nav - Dynamic breadcrumb for homepage and subdirectories - Fix theme path traversal (../../ -> ../) in admin.php - Fix CodeMirror mode load order (xml -> css -> js -> htmlmixed -> php) - Fix editor-toolbar.js null checks for plugin edit pages - Layout select from theme.json with live frontmatter update - Footer sticky at bottom of viewport (min-height: 100vh) - Breadcrumb color fix (var(--nav-font) -> var(--header-bg)) - Remove language switcher from guide pages - Update README.md and README.en.md - Bump version to 2.5.1
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
# CMS Architecture
|
||||
|
||||
```
|
||||
codepress/
|
||||
├── cms/core/ # Core engine
|
||||
├── admin/ # Admin console
|
||||
├── themes/ # Themes
|
||||
├── plugins/ # Plugins
|
||||
├── content/ # Content
|
||||
└── public/ # Web root
|
||||
```
|
||||
@@ -0,0 +1,34 @@
|
||||
# Security
|
||||
|
||||
## XSS prevention
|
||||
|
||||
```php
|
||||
// Always escape
|
||||
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
|
||||
|
||||
// In Twig (automatic)
|
||||
{{ userVariable }}
|
||||
```
|
||||
|
||||
## CSRF tokens
|
||||
|
||||
```php
|
||||
// Generate
|
||||
$csrf = $auth->getCsrfToken();
|
||||
|
||||
// Verify
|
||||
if (!$auth->verifyCsrf($_POST['csrf_token'])) {
|
||||
die('Invalid CSRF token');
|
||||
}
|
||||
```
|
||||
|
||||
## Path traversal prevention
|
||||
|
||||
```php
|
||||
// Use realpath() and check prefix
|
||||
$realPath = realpath($filePath);
|
||||
$realContentDir = realpath($contentDir);
|
||||
if (strpos($realPath, $realContentDir) !== 0) {
|
||||
die('Invalid path');
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,32 @@
|
||||
# Core Classes
|
||||
|
||||
## CodePressCMS.php
|
||||
|
||||
Main CMS class in `cms/core/class/CodePressCMS.php`:
|
||||
|
||||
```php
|
||||
$cms = new CodePressCMS();
|
||||
$cms->init();
|
||||
$cms->renderPage($pagePath);
|
||||
```
|
||||
|
||||
## ThemeManager.php
|
||||
|
||||
Theme management in `cms/core/class/ThemeManager.php`:
|
||||
|
||||
```php
|
||||
$themeManager = new ThemeManager($config);
|
||||
$themeManager->getActiveTheme();
|
||||
$themeManager->renderTwig($template, $data);
|
||||
$themeManager->compileCss($force);
|
||||
```
|
||||
|
||||
## PluginManager.php
|
||||
|
||||
Plugin system in `cms/core/class/PluginManager.php`:
|
||||
|
||||
```php
|
||||
$pluginManager = new PluginManager();
|
||||
$pluginManager->loadPlugins($enabledPlugins);
|
||||
$pluginManager->executeHook($name, $params);
|
||||
```
|
||||
@@ -0,0 +1,23 @@
|
||||
# Debugging
|
||||
|
||||
## Logging
|
||||
|
||||
```php
|
||||
// Admin logging
|
||||
adminLog($config, 'info', 'Message text');
|
||||
|
||||
// LogManager
|
||||
LogManager::log(LogManager::EVENT_ADMIN, 'info', 'Message');
|
||||
```
|
||||
|
||||
## Disabling cache
|
||||
|
||||
In `config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"cache": {
|
||||
"enabled": false
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,19 @@
|
||||
# Performance
|
||||
|
||||
## Enabling OPcache
|
||||
|
||||
In `php.ini`:
|
||||
|
||||
```ini
|
||||
opcache.enable=1
|
||||
opcache.memory_consumption=128
|
||||
opcache.max_accelerated_files=10000
|
||||
```
|
||||
|
||||
## SCSS caching
|
||||
|
||||
SCSS is compiled with caching:
|
||||
|
||||
```php
|
||||
$themeManager->compileCss(false); // Use cache when possible
|
||||
```
|
||||
@@ -0,0 +1,43 @@
|
||||
# Plugin Development
|
||||
|
||||
## Plugin structure
|
||||
|
||||
```
|
||||
plugins/MyPlugin/
|
||||
├── plugin.json # Plugin metadata
|
||||
├── plugin.php # Plugin code
|
||||
└── config.json # Optional configuration
|
||||
```
|
||||
|
||||
## plugin.json
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "My Plugin",
|
||||
"version": "1.0.0",
|
||||
"author": "Your Name",
|
||||
"description": "Description"
|
||||
}
|
||||
```
|
||||
|
||||
## plugin.php example
|
||||
|
||||
```php
|
||||
<?php
|
||||
/**
|
||||
* Plugin: MyPlugin
|
||||
*/
|
||||
|
||||
echo '<div class="my-plugin">Hello World</div>';
|
||||
```
|
||||
|
||||
## Using CMSAPI
|
||||
|
||||
```php
|
||||
<?php
|
||||
require_once '../../cms/core/class/PluginManager.php';
|
||||
|
||||
$api = PluginManager::getAPI();
|
||||
$config = $api->getConfig();
|
||||
$content = $api->getContent();
|
||||
```
|
||||
@@ -0,0 +1,19 @@
|
||||
# Routing
|
||||
|
||||
## Frontend routing
|
||||
|
||||
Via `cms/router.php` for PHP dev server:
|
||||
|
||||
```php
|
||||
// Clean URLs: /nl/page
|
||||
// Query: ?page=page&lang=nl
|
||||
```
|
||||
|
||||
## Admin routing
|
||||
|
||||
Via `public/admin.php`:
|
||||
|
||||
```php
|
||||
// Routes: /admin/dashboard, /admin/content, etc.
|
||||
// Query parameter: ?route=dashboard
|
||||
```
|
||||
@@ -0,0 +1,22 @@
|
||||
# Testing
|
||||
|
||||
## Penetration tests
|
||||
|
||||
```bash
|
||||
cd cli/test/pentest
|
||||
./security-test.sh
|
||||
```
|
||||
|
||||
## Accessibility tests
|
||||
|
||||
```bash
|
||||
cd cli/test
|
||||
./accessibility.sh
|
||||
```
|
||||
|
||||
## Functional tests
|
||||
|
||||
```bash
|
||||
cd cli/test/functional
|
||||
./content-tests.sh
|
||||
```
|
||||
Reference in New Issue
Block a user