Replace every setTemplateBasic() call with $tpl->getHtmlPart() across admin core and all module admin controllers, converting placeholder-map syntax to named-key arrays and normalising captcha condition logic.
Core changes:
- Admin core (admin/index.php):
- login() and preview() use $tpl->getHtmlPart() with named-key arrays
- Captcha condition simplified to in_array() instead of chained ==
- Admin modules (admin/modules/*.php):
- categories, modules, referers, statistic, template, uploads migrated
- Each search helper and listing function now passes named keys to getHtmlPart()
- uploads: bulk-edit form and per-file row rendering fully converted
- Module admin controllers (modules/*/admin/index.php):
- account, auto_links, search, shop — all setTemplateBasic() calls replaced
- shop: form helpers (getItemFields, getCategFields) and listing rows migrated
Benefits: - Eliminates string-keyed {%placeholder%} map pattern across 11 files - Template data validated and escaped by the engine, not inline PHP - Consistent API surface for all future admin template additions
Technical notes: - All calls use $tpl->getHtmlPart(name, [key => value]) signature - $tpl declared global inside each function that renders a partial - setTemplateBasic() remains in system.php for non-migrated frontend callers
Add a theme-aware template engine that compiles Jinja-style syntax to cached PHP, replaces setTemplateBasic() for admin and frontend views, and enforces path-traversal safety at every resolution step.
Core changes:
- Template engine (core/classes/template.php):
getHtmlPage() — renders a page with optional layout inheritance * supports {% extends 'layouts/app.html' %} and {% block %}/{% endblock %} * falls back to standalone render when no layout exists
- getHtmlPart() / getHtmlFrag() — compile and return partials and fragments
- Compiled PHP cache stored in storage/cache/view/<theme>/ keyed by sha1 hash
- Syntax compiled: {{ var }} (escaped), {{{ var }}} (raw), {% if/for/include/extends/block %}
- checkFile() / checkIncl() / checkName() prevent path traversal in all lookups
- Bootstrap (core/system.php):
- require_once Template class at startup
- Instantiate $tpl as Template('admin') or Template($theme) based on ADMIN_FILE
- Expose via $GLOBALS['tpl'] for access from all module functions
- Rewrite preview() to use $tpl->getHtmlPart('preview', [...])
Benefits: - Decouples HTML from PHP string interpolation across all admin views - Compiled cache eliminates repeated regex parsing per request - Single validated entry point for all template rendering
Technical notes: - Template files live under templates/<theme>/{pages,partials,fragments,layouts}/ - Cache invalidated automatically when source mtime changes - Backward-compatible: setTemplateBasic() remains available for non-migrated callers
Preserve original default theme as reference archive before rework.
Delete 22 old templates replaced by generic shared versions in the previous refactor (hit-badge, reads-badge, date-badge, back-button, category-image, category-link, admin-menu, whois-result, kasse-box, basic-files-view, basic-links-view) and update shop-kasse-content.
Merge 22 module-specific templates into 9 generic shared templates: hit-badge, reads-badge, date-badge, back-button, category-image, category-link, admin-menu, whois-result, basic-download-view
Fix rendering bug in basic-files-view / basic-links-view: pre-render ctitle/cimg/admin/goback before passing to parent template
- Update modules: auto_links, files, links, media, shop, whois
- Archive templates/default/ → templates/default_old/
Merge 33 paired open/close HTML files into 14 *-wrap.html templates using {%if open%}...{%else%}...{%endif%} conditionals. Remove 5 dead-code block-* files and 17 subdirectory placeholder index.html files (protected by .htaccess Options -Indexes). Update all PHP callers to use the new names. Applied identically to both templates/lite/ and templates/default/ themes.
Core changes:
- Template consolidation — both themes (templates/lite/, templates/default/):
Delete block-113, block-81, block-voting (no PHP callers), block-left, block-right (covered by core/template.php fallback to block-all)
Merge into wrap files: forum-cat, forum-list, forum-list-basic, forum-view, account-last, kasse, liste, assoc, voting-home, grid-table/*
- Add table-close.html shared by clients, content, users modules
- Remove 17 placeholder index.html files from fonts/, js/, images/**
- PHP caller updates (15 files):
- modules/forum/index.php: 4 open/close pairs → *-wrap with if_flag open=true
- modules/account/index.php: account-last-open/close → account-last-wrap
- core/system.php: kasse-open/close → kasse-wrap
- modules/voting/index.php: voting-home-open/close → voting-home-wrap
- modules/clients,content,users/index.php: *-close → table-close
- modules/shop,news/index.php: liste/assoc/grid-table pairs → wrap files
- modules/faq,files,links,media,help,pages/index.php: liste/assoc pairs → wrap files
Module refactoring (account, auto_links, contact, jokes, recommend, rss, whois, users): continued from previous sessions — admin panel and template API alignment
- Lang files (modules/clients/lang/): add de, en, fr, pl, ru, uk translations
Benefits: - Each template file represents a complete semantic unit (open+content+close) - Reduces template file count by ~50 files across both themes - Eliminates "file not found" warnings from mismatched open/close deletions
Technical notes: - if_flag mechanism: ['if_flag' => ['open' => true]] for open, [] for close - All 15 modified PHP files verified with php -l (zero syntax errors) - core/template.php not modified (project constraint respected)
Rename handler functions and switch case keys in all 38 admin files to eliminate ambiguous short names, unify the conf-save pattern, and bring admins.php into line with the standard naming convention used everywhere.
Core changes:
- admins.php — remove ad-prefix from all five handlers:
adlist → admins, adform → add, adsave → save, addrop → delete, adinfo → info * case keys in switch updated to match function names throughout * internal cross-calls (adsave calling adform) updated accordingly
- conf/confsave/saveconf → config/configsave (all 38 files):
Unified config-form handler to config(), save handler to configsave() * Eliminates three competing patterns: conf+save, conf+confsave, conf+saveconf
- del → delete (function + case key, all affected modules):
Aligns with 4-char minimum from .rules/global.md * Fix: corrected deleteete URL typo in database, groups, messages,
auto_links, clients caused by unbounded batch rename
- Semantic renames (targeted modules):
- act → approve (comments, whois)
block → banlist, blocksave → bansave, pass → passwd, fileview → logview, down → download (security)
- nullhits → hitreset, noindel → zerodel (auto_links)
- nullpoints/null → reset, newdel → newdrop, nullsave → resave (account)
- top → toplist, auto → reindex, addmods → modadd (search)
Benefits: - Handler names are consistent across all admin modules - conf-save pattern reduced from 3 variants to 1 (config/configsave) - admins.php follows the same convention as all other modules - op= URL parameters match function names in every switch case
Technical notes: - URL op= values change for all renamed handlers (conf→config, del→delete, etc.) - Config key security.block renamed to security.banlist (auto-migrates on next save) - No behavioral changes; pure rename refactor
Migrate multiple admin configuration screens to the shared form-conf template and fix shared rendering issues discovered during browser verification. This aligns admin modules around one template path, restores correct conditional template handling, and fixes radio field state selection for stored 0/1 values.
Core changes:
- Shared config form migration (templates/admin/form-conf.html):
Add and use the shared configuration form template across admin and module config screens * Replace duplicated inline form markup in multiple modules with template-driven rendering * Keep module-specific blocks controlled by explicit if_flag markers
- Standardize hidden fields, submit actions, and common input layout
- Template and form rendering fixes (core/template.php, core/system.php):
- Fix conditional template processing to evaluate only explicit template values before final replacement
Correct radio_form() checked-state logic * Normalize 0/1 values before rendering radio groups * Prevent invalid double-checked radio markup for stored zero values
Benefits: - Reduces duplicated admin form markup across modules - Fixes incorrect browser output in shared config forms - Improves maintainability of admin configuration screens
Technical notes: - No storage format changes were introduced - Template-driven config forms now depend on explicit if_flag sections in form-conf - Backward compatibility is preserved for existing config values and routes
Core changes: - README.md: admin modules 23/23 -> 24/24, add scheduler.php to list - UPGRADING.md: same count fix; getAdminInfo() now documents .html/.md dual extension support; add scheduler.php to modernized modules list - SECURITY.md: admin panel count 23 -> 24 (incl. scheduler); document getAdminInfo() .html/.md extension resolution order - CONTRIBUTING.md: getAdminInfo() info file table updated with .md col; setAdminNavi() section clarified (no per-module navi() wrapper needed)
Benefits: - Documentation accurately reflects scheduler.php admin module existence - getAdminInfo() .html/.md fallback behavior explicitly documented - UPGRADING migration checklist now complete for all 24 admin modules - SECURITY coverage table corrected
Technical notes: - getAdminInfo() (core/admin.php:826) checks .html then .md extensions - admin/info/*/ru.md files already exist alongside .html variants - .prompts/ dir is gitignored; internal knowledge files updated locally
Replace per-module navi() wrappers in all 24 admin/modules/*.php with direct setAdminNavi() calls inside handler functions
- Refactor modules/*/admin/index.php panels to use same convention
Remove redundant navi() top-level functions where setAdminNavi() now handles navigation inline
- Consistent tab/op URL format across all admin modules
Benefits: - Eliminates duplicated navi() wrapper boilerplate (24 files) - Single authoritative navigation implementation via core setAdminNavi() - Simplifies future admin module additions - scheduler.php already follows this pattern natively





