All modules that previously used the legacy form-add, files-add-input-row and files-add-upload-row fragments now point exclusively to the new/ namespace. Legacy fragments deleted. New new/ fragments created in all 4 themes.
Core changes:
- modules/*.php (9 files) — call site renames:
'form-add' → 'new/form-add' (auto_links, faq, files, help, jokes, links, money, order, pages)
- 'files-add-upload-row' → 'new/files-add-upload-row' (files)
- 'files-add-input-row' → 'new/files-add-input-row' (files)
- templates/*/fragments/new/ — new fragments added (all 4 themes):
- new/files-add-input-row.html: sl-form-row with label + typed input
- new/files-add-upload-row.html: sl-form-row with label + file input
- templates/*/fragments/ — old fragments deleted (default, lite, simple):
- form-add.html (3×)
- files-add-input-row.html (3×)
- files-add-upload-row.html (3×)
Benefits:
- No legacy root-level fragment used by any module
- Single consistent new/ fragment namespace for all add-form templates
Technical notes:
- No template content changes — only namespace migration
- admin theme had no form-add.html to delete
Replace the legacy <table class="sl_table_form"> form layout in form-add.html with the same sl-form div structure already used by new/form-add.html. Also update files-add-input-row and files-add-upload-row to emit sl-form-row divs instead of <tr><td> rows, which were invalid inside the new div container.
Core changes:
- templates/*/fragments/form-add.html (default, lite, simple):
- Replace <table class="sl_table_form"> wrapper with <div class="sl-form">
Replace <tr><td>label</td><td>field</td></tr> rows with <div class="sl-form-row"><label class="sl-form-label">...</label>field</div>
- Replace {% if titleval %} condition with {% if lbl_title %}
- Replace {% if catselect %} condition with {% if lbl_cat %}
Replace <tr><td colspan="2" class="sl_center"> submit row with <div class="sl-form-submit">
- templates/*/fragments/files-add-input-row.html (default, lite, simple):
- <tr><td> → <div class="sl-form-row"><label class="sl-form-label">
- templates/*/fragments/files-add-upload-row.html (default, lite, simple):
- <tr><td> → <div class="sl-form-row"><label class="sl-form-label">
Benefits:
- form-add and new/form-add now use the same layout — one consistent design
All add-form modules (files, faq, jokes, links, pages, help, auto_links, money, order) render identical structure as the news module
- Valid HTML: no <tr> outside <table>
Technical notes:
- No PHP changes
All call sites already pass lbl_title and lbl_cat — condition change is transparent
- new/form-add.html unchanged; form-add.html now matches it exactly
Insert a <title> block into bare.html for default, lite, and simple themes so that bare-layout pages (e.g. print, iframe, standalone views) render a proper document title. Also update the config fingerprint to reflect the changed template layer.
Core changes:
- templates/default/layouts/bare.html
- templates/lite/layouts/bare.html
- templates/simple/layouts/bare.html:
Added <title> tag with block/fallback pattern before {{{ meta }}}: <title>{% block title %}{% if title %}{{ title }}{% else %}{{ sitename }}{% endif %}{% endblock %}</title>
- config/local.php:
- base_fingerprint updated to reflect new template state
Benefits:
- Bare-layout pages pass HTML validation (title is required)
- Consistent title rendering across all layout types
Technical notes:
- Admin theme bare.html not included (managed separately)
- Pattern matches existing block structure in main.html and app.html
Delete constants that are no longer referenced anywhere in the codebase after the getTpl* refactoring and admin UI cleanup. All 6 locales (de/en/fr/pl/ru/uk) updated in sync.
Core changes:
- admin/lang/*.php (6 locales) — 18 constants removed per locale:
- _BOTTOM, _CALENDAR, _CENTER, _INDEX
- _INFO_NO, _INFO_NULL
- _IP_CIDR_EX, _LISTING, _LOGGED
- _NAVI, _PAGENUM, _PRINTS, _STYLE
- _TCLOSE, _TMESS, _TOPEN, _TTITLE, _TWARNING
- lang/*.php (6 locales) — 3 constants removed per locale:
- _RATE2, _RATE4, _SPOILER
- modules/changelog/admin/lang/*.php (6 locales) — 1 constant removed:
- _CHLOG_ERR_TOKEN (moved to inline validation; no longer a translatable string)
Benefits:
- Lang files contain only constants that are actively used
- Reduces risk of accidental reuse of stale identifiers
Technical notes:
- No PHP logic changes — constants only
- All locales kept in sync; no locale-specific differences
Replace the test double for fields_out() with one for getTplFieldsOut() to match the renamed function in helpers.php. The stub behaviour is identical; only the function name changes.
Core changes:
- tests/Unit/AdminPreviewBridgeFlowTest.php:
- Stub function_exists guard: 'fields_out' → 'getTplFieldsOut'
- Stub function name: fields_out() → getTplFieldsOut()
Benefits:
- Test suite matches the current public API
- No risk of false-pass from stale stub name
Technical notes:
- Stub return value logic unchanged
Replace all legacy function calls throughout admin modules, frontend modules, and templates with the new getTpl* names established in helpers.php. No logic changes — pure rename at every call site.
Core changes:
- admin/modules/ (6 files):
- cat_modul() → getTplCategoryModule()
- getTplCategorySelect() (image picker) → getTplImageSelect()
- getcat() → getTplCategorySelect()
- language() → getTplLanguageOptions()
- naviTabsLink/Content/Wrap → getTplTabLink/Content/Wrap
- categoryRow, categoryTextLink → getTplCatRow, getTplCatText
- modules/ (24 files) + core/user.php:
- new_graphic() → getTplNewGraphic()
- gender() → getGenderText()
- get_gender() → getTplGenderSelect()
- fields_out() → getTplFieldsOut()
- fields_in() → getTplFieldsIn()
- catlink() → getTplCategoryTrail()
- getcat() → getTplCategorySelect()
- title_tip() → getTplTitleTip()
- editorFilePreview → getTplEditorPreview()
- editorInsertAction → getTplEditorInsert()
- commentActionLink/Js/Delete/Menu → getTplCommentLink/Js/Delete/Menu
- votingActionLink/Delete/Menu → getTplVotingLink/Delete/Menu
- pagerLink/Current/Dots → getTplPagerLink/Current/Dots()
- getAsyncPagerLink → unchanged signature, still resolves correctly
- templates/lite/index.php:
- catlink() → getTplCategoryTrail()
Benefits:
- All call sites consistent with getTpl* convention
- No ambiguity between old legacy names and new helpers
- Codebase-wide rename is complete after this commit
Technical notes:
- No template fragments were changed
- No behavior changes — pure rename at call sites
Move all legacy template-helper functions out of system.php and helpers-old.php into helpers.php, applying the getTpl* naming convention and SLAED variable-naming rules. Removes the last large block of mixed-concern render functions from system.php.
Core changes:
- core/helpers.php — new getTpl* functions added:
- getTplNewGraphic, getTplRadioForm, getTplGenderSelect, getGenderText
- getTplTitleTip, getTplFieldsOut, getTplSearchResultTitle, getTplMoneyCalcForm
- getTplEditorPreview, getTplEditorInsert, getTplEditorMenu, getTplEditorRow, getTplEditorTable
- getTplCommentLink, getTplCommentJs, getTplCommentDelete, getTplCommentMenu
- getTplCommentMeta, getTplCommentColor, getTplCommentAvatar, getTplCommentRank, getTplCommentSign
- getTplAlphaLink, getTplAlphaText
- getTplTabLink, getTplTabContent, getTplTabWrap
- getTplPagerLink, getTplPagerCurrent, getTplPagerDots, getAsyncPagerLink
- getTplCatIcon, getTplCatIconText, getTplCatTitle, getTplCatText, getTplCatTitleText
- getTplCatSubitem, getTplCatRow, getTplCategorySelect (image variant renamed to getTplImageSelect)
- getTplBlockPosition, getTplBlockRefresh, getTplBlockAction, getTplBlockView
- getTplAdminHintLabel, getTplAdminSmallNote, getTplAdminTipLine, getTplAdminInfoLine
- getTplAdminTableHead, getTplAdminTableCells, getTplAdminStatusBadge, getTplAdminLangHint
- getTplAdminListForm, getTplAdminSubmitButton, getTplAdminSection
- getTplCatPermRow, getTplCatTab, getTplCatSubmitRow, getTplAdminConfSave, getTplCatForm
- getTplAdminAccountSearch, getTplAdminBlockGrid, getTplAdminSearchDrop, getTplAdminCatSearch
- getTplVotingLink, getTplVotingDelete, getTplVotingMenu, getRatingAsync
- core/system.php — corresponding legacy functions removed:
- new_graphic, radio_form, get_gender, gender
- editorFilePreview, editorInsertAction, editorActionMenu, editorFilesRow, editorFilesTable
- commentActionLink, commentActionJs, commentActionDelete, commentActionMenu
- commentMetaText, commentMetaColor, commentAvatar, commentRankImage, commentSignature
- alphaNavLink, alphaNavText, naviTabsLink, naviTabsContent, naviTabsWrap
- pagerLink, pagerCurrent, pagerDots, getAsyncPagerLink (old signature)
- categoryIconLink, categoryIconText, categoryTitleLink, categoryTextLink
- categoryTitleText, categorySubItem, categoryRow, categorySelect, categorySelectOption
- breadcrumbLink, getRatingAsync (old location)
- getCommentAsyncAction, getEditorAsyncAction (moved)
- core/helpers-old.php — removed duplicates/superseded functions:
- getTplAdminAjaxAction, getTplSearchResultTitle (old version)
- getTplCatPermRow, getTplCatTab, getTplCatSubmitRow, getTplAdminConfSave, getTplCatForm
- getTplAdminAccountSearch, getBlockModules, getTplAdminBlockGrid, getTplAdminSearchDrop
- getTplAdminCatSearch, getTplCategorySelect (image variant), getTplBlockPosition/Refresh/Action/View
- getTplAdminHintLabel, getTplAdminSmallNote, getTplAdminTipLine, getTplAdminInfoLine
- getTplAdminTableHead, getTplAdminTableCells, getTplAdminStatusBadge, getTplAdminLangHint
- getTplMoneyCalcForm, getTplAdminListForm, getTplAdminSubmitButton, getTplAdminSection
- core/admin.php — edit_list() removed (superseded by getTplAdminListForm)
Benefits:
- system.php focuses on runtime logic; all render helpers live in helpers.php
- Consistent getTpl* naming across the entire codebase
- Variable names comply with SLAED 2–8 char lowercase rule
Technical notes:
getTplCategorySelect (image picker) renamed to getTplImageSelect to avoid collision with the new getTplCategorySelect (category dropdown)
- All moved functions retain identical template fragment calls
- No fragment files changed in this commit
Align all 4 themes (default, lite, simple, admin) with the new template layer: update shared fragment markup to use sl-* CSS classes, sync layout partials, and remove admin-* fragments from frontend themes (default/lite/simple) that belong exclusively to the admin theme.
Core changes:
- Account forms (default/lite/simple):
account-login-form, account-edit-form, account-newuser-form, account-passlost-form, account-password-form, account-privat-message-form, account-rss-select-form, account-rss-url-form, account-avatar-upload updated to current markup conventions
- Layouts (all 4 themes):
- app.html, main.html, home.html, bare.html synced across themes
- CSS (default, admin):
- new.css: sl-* class additions for new fragment layer
- system.css: cleanup in default and admin themes
- Fragment updates (all themes):
- form-add.html, form-select.html, contact-form.html, login.html
- editor-code-panel.html, editor-text-panel.html
- block-login-form.html, block-search-form.html, block-languages-select.html
- files-add-input-row.html, files-add-upload-row.html
- media-form-add.html, media-link-row.html
- shop-kasse-form.html, shop-partners-form.html
- recommend-form.html, rss-info-form.html, rss-read-forms.html
- whois-add-form.html, whois-domain-form.html, whois-license-form.html
- pager-dots.html, button.html, money-calculator-form.html (admin)
- partials: changelog.html, contact-block.html
- Admin fragment cleanup (default/lite/simple — 120 files deleted):
Removed all admin-* fragments from non-admin themes; they are only rendered in the admin theme and must not exist in frontend themes
Benefits:
- Themes stay in sync; no stale admin markup in frontend
- CSS class naming consistent with sl-* convention
- Fragment structure aligned with new/ template layer
Technical notes:
- Admin theme retains all admin-* fragments unchanged
- No PHP changes in this commit
Add all new template fragments required by the HTML-in-PHP removal refactor and the new/ namespace for reusable form controls and UI components. All fragments are added to all 4 themes (default, lite, simple, admin).
Core changes:
- new/ namespace — form controls (all 4 themes):
- input.html, textarea.html, select.html, select-option.html
- hidden.html, button.html, form-submit.html, form-add.html, form-field-row.html
- ajax-textarea-form.html
- new/ namespace — layout and UI (all 4 themes):
- grid.html, card.html, div-hr.html, cat-navi.html
- related.html, related-item.html, graphic.html
- msg-center.html, alert.html (new/)
- new/ namespace — code rendering (all 4 themes):
- code-block.html, code-row.html, code-table.html, code-hljs.html
- System UI fragments (root level, all 4 themes):
- comment-avatar.html, comment-num-link.html, comment-text.html
- comment-list-form.html, alpha-nav-link.html, alpha-nav-text.html
- navi-tab-link.html, navi-tab-content.html, pager-dots.html
- category-sub-item.html, rating-wrap.html, warning-list.html
- debug-section.html, admin-block-links.html, geo-ip-flag.html
- Shared UI fragments (root level, all 4 themes):
- button.html, ajax-textarea-form.html, checkbox-input.html
- file-input.html, multi-select.html, radio-option.html, select-option.html
Benefits:
- All HTML output from PHP helper functions now has a fragment counterpart
- new/ namespace provides reusable form controls for all frontend modules
- Theme-specific overrides possible for any fragment independently
Technical notes:
- new/ fragments are identical across all 4 themes by default
- Root-level fragments match existing PHP function output exactly
- pager-dots.html added to root level (used by both old pagerDots() and getTplPager())
Replace all legacy function calls across modules and blocks with the new array-based getTpl* API. Includes mass-converted textarea() → getTplTextarea() call sites and related API updates.
Core changes:
- textarea() → getTplTextarea([]) (all modules):
- Converted 31 files via balanced-paren argument parser
All positional args mapped to named array keys: id, name, value, mod, rows, placeholder, required
- getAjaxTextarea() → getTplAjaxTextarea([]) (modules/forum, user):
- Updated call sites with named array parameters
- getTplHiddenInput() positional → array API:
- modules/forum/index.php: subject, id, fid, pid, cat hidden inputs
- modules/help/index.php: pid, catid, posttype hidden inputs
- fields_in() → getTplFieldsIn([]) (modules/news/index.php):
- New div-based field rows instead of legacy <tr><td> table layout
- Other module updates:
- modules/content/index.php: migrated to new/ template fragments
- modules/news/index.php: getTplTextInput class sl_field (no inline style)
- blocks/block-login.php, block-user_info.php: API updates
Benefits:
- No module code references deprecated textarea() or getAjaxTextarea()
- Consistent named-array call convention throughout all modules
- getTplFieldsIn() replaces table-based fields_in() for new layouts
Technical notes:
- textarea() and getAjaxTextarea() remain in system.php as deprecated wrappers
- fields_in() unchanged — still used for legacy table forms (forum, account)