v2.6.1d (Lyra): Plugin i18n, plugin editor vernieuwd, media invoegen

Plugin internationalisatie: plugins hebben eigen language/ mappen. Systeem
plugins volgen admin taal (admin.php), content plugins volgen content taal
(site.php). Fallback chain: geselecteerd -> plugin default_language -> CMS
default. PluginManager/AdminPluginAPI/CMSAPI uitgebreid met
getPluginTranslations()/t(). plugin.json settings ondersteunen
label_key/help_key/option_label_key.

Plugin uniformiteit: alle 6 plugins hebben uniforme structuur (README.md,
assets/.gitkeep, language/nl|en/). plugins/README.md herschreven.
guide plugin-development.md (NL+EN) volledig herschreven.

Plugin editor vernieuwd: geneste bestandsbrowser zijbalk, nieuw bestand
aanmaken, uploaden naar assets/, verwijderen en verplaatsen. Nieuwe routes:
plugins-file-upload, plugins-file-delete, plugins-file-move. Path-traversal
bescherming + protected plugins geblokkeerd.

Media invoegen in editor: nieuw /admin/media-list JSON endpoint + herbruikbare
_media-modal.twig include. Plugin-context scant assets/ map. editor-toolbar.js
modeMap uitgebreid voor css/scss/js/json.

Plugin overzicht knoppen: alleen iconen met title/aria-label.

Tests: pentest 30/30, WCAG 2.1 AA 25/25.
This commit is contained in:
2026-08-18 13:49:52 +00:00
parent 88fbaa5702
commit 6d5ca7cab4
64 changed files with 3503 additions and 366 deletions
+7 -1
View File
@@ -48,8 +48,10 @@ class CodePressCMS {
// Initialize plugin manager (files already loaded in cms/core/index.php)
$enabledPlugins = $this->config['enabled_plugins'] ?? [];
$this->pluginManager = new PluginManager(__DIR__ . '/../../../plugins', $enabledPlugins);
$siteDefaultLang = $this->config['language']['default'] ?? 'nl';
$this->pluginManager = new PluginManager(__DIR__ . '/../../../plugins', $enabledPlugins, $siteDefaultLang);
$api = new CMSAPI($this);
$api->setPluginManager($this->pluginManager);
$this->pluginManager->setAPI($api);
$this->buildMenu();
@@ -1378,6 +1380,10 @@ class CodePressCMS {
'author_name' => $this->config['author']['name'] ?? 'CodePress Developer',
'author_website' => $this->normalizeUrl($this->config['author']['website'] ?? '') ?: '#',
'author_git' => $this->config['author']['git'] ?? '',
// Per-page author metadata (from frontmatter, if present)
'page_author_name' => htmlspecialchars($page['metadata']['author_name'] ?? ''),
'page_author_email' => htmlspecialchars($page['metadata']['author_email'] ?? ''),
'page_created' => htmlspecialchars($page['metadata']['created'] ?? ''),
'seo_description' => $this->config['seo']['description'] ?? 'CodePress CMS - Lightweight file-based content management system',
'seo_keywords' => $this->config['seo']['keywords'] ?? 'cms, php, content management, file-based',
'block_ai_bots' => !empty($this->config['security']['block_ai_bots']),
+17
View File
@@ -241,4 +241,21 @@ class ContentAPI
{
return isset($_GET['search']);
}
/**
* Get the author metadata for the current page.
* Returns author_name, author_email and created from the page frontmatter.
*
* @return array Author metadata with keys: author_name, author_email, created
*/
public function getPageAuthor(): array
{
$page = $this->cms->getPage();
$metadata = $page['metadata'] ?? [];
return [
'author_name' => $metadata['author_name'] ?? '',
'author_email' => $metadata['author_email'] ?? '',
'created' => $metadata['created'] ?? '',
];
}
}