Focus: ops
Summary
Updates copyright year to 2026 and adds standardized commit message template.
Changes
What
- Update copyright year in modules.php to 2026
- Add .gitmessage template for consistent commit formatting
Why
- Keep copyright notices current
- Standardize commit message format across team
Test
- N/A - metadata changes only
Impact
For Admins / DevOps
- None
For Developers
- Use .gitmessage as template:
git config commit.template .gitmessage
Breaking Changes
- None
Upgrade
- No action required
Focus: UX
Summary
Standardizes language icon filenames using ISO 639-1 two-letter codes for consistency and internationalization.
Changes
What
- Rename language icons from full names to ISO codes (e.g., english_mini.png → en_mini.png)
- Applied to admin, default, and lite templates
Why
- Align with international standards (ISO 639-1)
- Simplify language detection logic
- Enable consistent naming across all templates
Test
- Visual inspection of language switcher in all templates
Impact
For Admins / DevOps
- None - purely cosmetic change
For Developers
- Update any hardcoded references to old icon names
- New naming: de, en, fr, pl, ru, uk
Breaking Changes
- Language icon filenames changed - update template references if needed
Upgrade
- No action required if using dynamic language detection
Focus: stability
Summary
Adds static analysis and unit testing tools to improve code quality and catch bugs early.
Changes
What
- Add PHPStan for static code analysis (level 0)
- Add PHPUnit 12 for unit testing
- Create test directory structure with example tests
- Update .gitignore for test artifacts
Why
- Enable automated code quality checks
- Establish foundation for test-driven development
- Catch type errors and bugs before runtime
Test
- PHPStan:
php vendor/bin/phpstan analyse(81 issues found at level 0) - PHPUnit:
php vendor/bin/phpunit(3 tests passing)
Impact
For Admins / DevOps
- New dev dependencies: phpstan/phpstan, phpunit/phpunit
- Run
composer installto get testing tools
For Developers
- Use
php vendor/bin/phpstan analyseto check code - Use
php vendor/bin/phpunitto run tests - Add tests in
tests/Unit/directory
Breaking Changes
- None
Upgrade
- Run
composer install --devto install testing tools
This commit completes the module system migration by updating the admin panel and admin management to use module names instead of database IDs, aligning with the new config-based module architecture.
admin/index.php - Admin panel module loading:
Panel sidebar (panelblock function): - Replace: SELECT title, active FROM _modules query - Use: getModules() iterator for module enumeration - Direct module name access eliminates database dependency
Panel navigation (panel function): - Replace: SELECT title, active FROM _modules query - Use: getModules() iterator for building navigation - Consistent with panelblock implementation
Module loader refactoring: - System modules: Use BASE_DIR constant for absolute paths - Change: include() → require_once for better error handling - Custom modules: Remove database lookup for module existence - Direct filesystem check: file_exists(modules/$name/admin/index.php) - Clean up: Remove commented experimental code - Code formatting: Consistent indentation and spacing
admin/modules/admins.php - Admin permissions management:
Module list generation (add function): - Replace: SELECT mid, title FROM _modules query - Use: getModules() iterator to enumerate available modules - Change checkbox values: mid (database ID) → title (module name) - Update permission check: Compare with module name instead of ID - Storage format: Comma-separated names instead of IDs
Permission save handler (save function): - Parameter type change: 'amodules[]', 'num' → 'amodules[]', 'var' - Accept module names (strings) instead of numeric IDs - Implode array to comma-separated string of names - Database stores: "news,pages,users" instead of "1,5,8"
Benefits: - No database queries for module enumeration (performance gain) - Module permissions portable across installations - Human-readable permission strings for debugging - Eliminates mid/title mismatch issues during migrations - Consistent with config-based module architecture
Technical notes: - Admin permissions stored as module name CSV in database - Module existence validated by filesystem, not database - getModules() provides consistent iteration interface - Backward compatibility maintained for existing installs
Files changed: 2 files Impact: Admin panel, module permissions, panel navigation
admin/modules/modules.php: - Remove commented debug line (migrateModulesConfig call) - Delete legacy database-based module scanning code (32 lines) - Remove obsolete module sync logic from old system - Clean up empty lines for better readability
admin/modules/newsletter.php: - Fix setConfigFile parameter order: (file, name, base, update) - Align with refactored function signature
This commit represents a major architectural change in SLAED CMS, moving module management from database storage to file-based configuration for better performance, portability, and version control integration.
Core changes:
Module configuration storage (config/modules.php): - Rename field: 'inmenu' → 'menu' for clarity - Store all module settings: active, view, menu, group, side, top - Configuration now version-controlled and portable - 26 modules migrated with existing settings preserved
New module management functions (core/system.php): - Add getModules($title = null): Iterator-style module reader
* Returns array: [title, active, view, menu, group, side, top]
* Static iterator for row-by-row processing
* Single module lookup when title provided
- Load modules.php configuration on bootstrap
- Enhance setConfigFile(): array_replace_recursive for deep merging
Module synchronization utility (core/admin.php): - Add updateModulesConfig(): Sync config with filesystem
* Scan modules/ directory for actual modules
* Add new modules with default settings
* Preserve existing module configurations
* Remove entries for deleted modules
* Natural case-insensitive sorting
Admin module management refactor (admin/modules/modules.php): - Remove temporary migration function migrateModulesDbToConfig() - Replace database operations with config file operations - Update all functions to use config-based storage:
modules():
- Call updateModulesConfig() to sync filesystem
- Read modules via getModules() iterator
- Comment out legacy directory scanning code
edit():
- Parameter change: 'mid' (DB ID) → 'mod' (module name)
- Load settings from config instead of database
- Field renames: mod_group→group, blocks_m→side, blocks_mc→top
- Display module status in edit form
status():
- Update module active state in config file
- Use setConfigFile() instead of SQL UPDATE
save():
- Persist all module settings to config file
- Conditional group assignment (only for view=1)
- Parameter renames throughout: inmenu→menu, mod_group→group
Setup/upgrade system (setup/index.php): - Sync setConfigFile() implementation with core - Add recursive normalization for nested arrays - Fix parameter order in setConfigFile() calls - Add update6_3 migration:
* Read all modules from database _modules table
* Generate initial config/modules.php
* Rename inmenu→menu during migration
Benefits: - No database queries for module configuration (performance) - Module settings in version control (auditability) - Easier backup and restore (portability) - Simpler debugging (readable PHP arrays) - Atomic updates via setConfigFile() with file locking
Technical details: - Maintains backward compatibility during upgrade - Config file auto-regenerates from filesystem scan - Preserves all existing module settings - Natural sorting ensures consistent file ordering - Deep merge allows partial config updates
Files changed: 5 files, ~250 lines modified Database impact: Replaces _modules table reads/writes with config file I/O
- Create config/modules.php with all module settings
- Migrate module data from database to configuration
- Include settings for 26 modules: active, view, inmenu, group, side, top
- Generated by migrateModulesDbToConfig() function
Core changes: - Merge config/config_seo.php into core/system.php * Move $confse SEO configuration array inline * Remove separate config_seo.php file * Consolidate configuration loading
Enhance setConfigFile() function in core/system.php * Add recursive normalization for array values * Convert booleans to string '0'/'1' * Handle floats, integers, and null values * Add copyright header to generated files * Improve type safety and consistency
Add module migration utility in admin/modules/modules.php * Create migrateModulesDbToConfig() function * Migrate module settings from database to config file * Extract: active, view, inmenu, group, side, top fields * Generate config/modules.php via setConfigFile()
Code formatting: - core/access.php: Convert tabs to spaces, update copyright to 2026 - core/security.php: Fix indentation, add trailing newline - modules/news/index.php: Reformat code structure
Configuration: - config/global.php: Regenerate sitekey
Files changed: 7 modified, 1 deleted





