Updated all public module handlers to use restructured template API: navi-lower now expects nested sub-objects; related blocks use getHtmlPart() with extended nested image_link/title_link/date_badge contracts; removed fragment names that no longer exist and replaced them with surviving equivalents.
Core changes:
navi-lower callers (modules/files, links, search, users, news, pages, media, faq, shop, sitemap, voting, money, main, account, forum):
- Flat keys back_title/back_label/home_href removed
Replaced with nested sub-objects: * back_button: {button_type, title, label, is_back, is_navi_lower} * home_link: {href, title, label, is_navi_lower} * top_link: {href, title, label, is_navi_lower}
- Related section callers (modules/files, links, media, faq, news, pages, shop):
- getHtmlFrag('related', ...) → getHtmlPart('related', ...)
related-item extended: added image_link, title_link, date_badge sub-objects * href extracted to $href variable to avoid repeated getSeoUrl() calls
- Forum module fragment renames (modules/forum/index.php):
- forum-list-wrap → forum-view-wrap
- forum-list-basic-wrap → forum-cat-wrap (with is_topic_list flag)
- forum-list-basic → forum-cat-basic (with is_topic_list flag)
- forum-cat-info → forum-list-info (with is_category_info flag)
- forum-all-open → title (with is_forum_heading flag)
- forum-view-change → getHtmlPart('fieldset-block', ...) / form-wrap
- Other promotions and renames:
- main-carousel: getHtmlFrag → getHtmlPart
- money-calc-scripts: getHtmlFrag → getHtmlPart
- main-grid fragment → post-div with is_main_grid flag
- main-section/main-content-item: extended with more_link/image_link/etc.
- account-privat-tab-title → span with is_htmx flag
- comment-signature → post-div with is_signature flag
Benefits: - navi-lower callers consistent with the composed fragment include contract - related-item sub-objects enable template-level link and badge rendering - Forum template rename disambiguates category list from topic list views
Technical notes: - Legacy flat keys removed from navi-lower callers; templates require nested form - date_badge sub-object uses ISO 8601 datetime for <time> element
Replaced all occurrences of getHtmlFrag('form', ...) and getHtmlFrag('div', ...) with getHtmlPart() across every admin module handler, following the promotion of those templates from templates/admin/fragments/ to templates/admin/partials/.
Core changes:
- Admin module handlers (modules/*/admin/index.php — 23 files):
getHtmlFrag('form', [...]) → getHtmlPart('form', [...]) * Covers all form wrappers used in list, add, edit, config, and search views
getHtmlFrag('div', [...]) → getHtmlPart('div', [...]) * Covers collapsible div containers (e.g. mail template block in account)
Files: account, auto_links, changelog, clients, contact, content, faq, files, forum, help, jokes, links, media, money, news, order, pages, rss, search, shop, sitemap, voting, whois
Benefits: - Admin module callers consistent with promoted partial paths - getHtmlFrag() reserved for true inline atoms across the entire admin layer
Technical notes: - No logic changes; substitution is structural only
Updated all callers in core/admin.php, core/helpers.php, core/system.php, and core/user.php to use getHtmlPart() for templates promoted from fragments/ to partials/, replaced removed fragment names with their surviving equivalents, and aligned login, navigation, and preview call sites to the new nested data contracts.
Core changes:
- core/admin.php:
- getHtmlFrag('sidebar-block', ...) → getHtmlPart(...)
- getHtmlFrag('form', ...) → getHtmlPart(...)
- core/helpers.php:
- getTplPreviewContent: partial name 'preview-content' → 'preview'
- getTplAdminTabs: 'module-head' → getHtmlPart(...)
- setTplAdminInfoPage, getRatingAsync: form/div → getHtmlPart(...)
- getModuleNavi: 'navi' → getHtmlPart(...); pre-computes link hrefs as named keys
- core/system.php:
setHead (logged branch): login-logged fragment → list + link composition * avatar link, username, logout built via getHtmlFrag('list', ...)
- setHead (login form): submit_button contract updated; token variable renamed
- setHead (no-login branch): login-without fragment → list + link composition
- setCategories: 'categories' → getHtmlPart(...)
- adminblock: 'sidebar-block' → getHtmlPart(...)
- renderFootControls: 'foot-controls' → getHtmlPart(...)
- encode_php: 'div' → getHtmlPart(...)
- ashowcom: 'comment-signature' → post-div with is_signature flag
- core/user.php:
- getUserNav: account-nav/account-nav-item → post-div + link composition
- getPrivateMessageView: 'comment-signature' → post-div with is_signature
Benefits: - getHtmlFrag() reserved for true inline atoms; getHtmlPart() for block partials - Deleted fragment names no longer referenced in core
Technical notes: - Behavior unchanged; call-site alignment only
Removed fragment files that represent independently renderable blocks and promoted them to partials, or merged their content into existing partials. Added label.html as a new shared inline atom for form labels. Templates that compose sub-fragments now use the new dot-path include syntax ({% include 'fragments/button.html' with back_button %}), which passes a nested data object directly without PHP preprocessing.
Core changes:
- Deleted fragments (templates/{default,lite,simple}/fragments/):
account-nav.html, account-nav-item.html, account-privat-tab-title.html, code-block.html, comment-signature.html, forum-all-open.html, forum-cat-info.html, forum-list-basic-wrap.html, forum-list-basic.html, forum-list-wrap.html, forum-view-change.html, login-logged.html, login-without.html, main-grid.html, navi.html, pager-dots.html, rating-wrap.html, voting-home-wrap.html, voting-home.html
- Promoted fragments → partials (all three themes):
categories.html, main-carousel.html, money-calc-scripts.html, related.html, voting-home.html
- New files (all three themes):
- fragments/label.html — inline label atom for form field rendering
- partials/navi.html — module navigation partial (previously a fragment)
- Deleted partials (all three themes):
- login-logged.html, login.html, registration.html, preview-content.html
- Modified partials — aligned to nested data contracts:
- navi-lower.html: {% include '...' with back_button/home_link/top_link %}
- account-view.html: back button via {% include 'fragments/span.html' %}
- preview.html, fieldset-block.html, view.html: extended contracts
- Modified fragments — extended for new sub-object and dot-path contracts:
button.html, link.html, span.html, date-badge.html, related-item.html, main-content-item.html, main-section.html, post-div.html, title.html, forum-cat-basic.html, forum-cat-wrap.html, forum-view-wrap.html, forum-list-info.html, card.html, edit-tip.html, field-value.html, form-field-row.html, list.html, session-row.html, table.html
- templates/lite/index.php:
- submit_button: removed button_class in favour of is_login_submit flag
Benefits: - fragments/partials boundary enforced consistently across all three themes - Dot-path includes eliminate per-partial PHP translation layers - Deleted files reduce dead HTML no longer referenced by any caller
Technical notes: - All three themes kept in sync; no theme-specific divergence introduced - templates/lite/images/ placeholder index.html files added for VCS tracking
Relocated ten admin-specific templates from fragments/ to partials/ to enforce the project convention that partials/ holds independently renderable blocks while fragments/ holds inline atoms. Simplified the preview pipeline by inlining the full preview layout into partials/preview.html and removing the now-redundant preview-content intermediaries.
Core changes:
- Renamed fragments → partials (templates/admin/):
- fragments/basic-monitor.html → partials/basic-monitor.html
- fragments/dashboard-panel.html → partials/dashboard-panel.html
- fragments/div.html → partials/div.html
- fragments/foot-controls.html → partials/foot-controls.html
- fragments/form.html → partials/form.html
- fragments/menu-grid.html → partials/menu-grid.html
- fragments/module-head.html → partials/module-head.html
- fragments/sidebar-block.html → partials/sidebar-block.html
- fragments/tabs.html → partials/tabs.html
- fragments/toggle-form-block.html → partials/toggle-form-block.html
- Preview pipeline (templates/admin/):
- Deleted: pages/preview-content.html, partials/preview-content.html
- partials/preview.html: expanded from a stub include to full inline implementation
- pages/preview.html: updated include path from preview-content to partials/preview.html
Benefits: - Clear fragments/partials boundary maintained across the admin theme - Preview render path reduced from three files to one partial
Technical notes: - All callers must now use getHtmlPart() instead of getHtmlFrag() for these ten templates - No behavior change; structural reorganization only
Extended the template compiler to resolve dot-path notation such as {{ user.name }} into PHP array access ($user['name']), enabling partials to consume nested data contracts directly. Added filemtime(FILE) to the cache check so changing template.php itself invalidates all compiled caches.
Core changes:
- Template compiler (core/classes/template.php):
filterEcho: regex extended to a.b.c paths; compiler walks path to nested array access * {{ field.iso }} compiles to <?= $this->getSafe($field['iso'] ?? null); ?>
- filterRaw: same extension for {{{ ... }}} raw output
parseIfCondition: regex and compiler both updated to support dot-path in conditions * {% if date_badge.iso %} is now valid
- writeCache: filemtime(FILE) added so engine upgrades auto-invalidate all caches
Benefits: - Partials receive nested data objects and dereference them without PHP preprocessing - Cache rebuilt automatically after engine upgrades - Backward compatible: single-word variables work unchanged
Technical notes: - Dot-path: first segment is a PHP variable, remaining segments are string array keys - Only lowercase snake_case identifiers allowed in each path segment
Migrate every call site away from the removed admin fragments and onto
the consolidated atomic contracts (link, div, hidden, button,
select, inline-badge, save-action, title-tip, message-block
with details, flat menu-grid items). Also switch two public theme
helpers (pager-dots, radio-group) to the flag-based variants and make
small variable-name cleanups along the way.
Core changes:
- core/helpers.php:
getTplPager / getPageNumbers: pager-dots now emits
inline-badgewithis_pager_dots- getTplRadioGroup: uses
post-divwithis_radio_groupflag getTplTitleTip: builds an
itemsarray and hands it totitle-tipdirectly (no per-item include)- getRatingAsync: drops the deleted
rating-wrapin favour ofdiv - core/admin.php:
- admininfo row actions switch from
row-actions-itemtolink - All ~20 admin info row constructions realigned to the new contract
- core/system.php:
getUserSessionInfo / getUserSessionAdminInfo: supply
name_linkandmodule_linkstructured objects alongside the legacy fields so session-row can render links via the consolidatedlinkfragment- adminblock: add
admin_link/logout_linkobjects - renderFootControls: add
top_linkobject for the upper anchor - encode_php: use
divwithis_codeflag instead ofcode-block - getAsyncPager: pager-dots switches to
inline-badgevariant getCartSummary: rename
$titleLinkto$titlinkto satisfy the variable-name rule (letters only, ≤8 chars)- admin/index.php (admin dashboard):
getAdminMenu: compose
image_link,title_link,link(grid) objects consumed by the new menu-grid-item / menu-list-item contractsgetAdminPanel: feed
items_htmldirectly to the flattenedmenu-grid(no per-row chunking; CSS now wraps)- admin/modules/*.php:
admins, blocks, categories, editor, groups, monitor, scheduler, security: migrate emissions from removed fragments (row-actions-item, user-search, multi-select, etc.) to the consolidated fragments and pass
linkobjects where needed- modules/*/admin/index.php:
account, auto_links, changelog, content, news, search: migrate admin-side emissions the same way; notably content/admin and news/admin switch comment/action groupings to the new contracts
- modules/money/index.php (send):
Build message-block
detailsas a structured list (label + value_html) instead of concatenatingtitle-tip-itemoutput intodetails_html- modules/shop/index.php:
edit-tipcallers passedit_link/delete_linkobjects withconfirm_textflag instead of the old flatedit_*/delete_*scalar fields
Benefits: - Every admin emission now goes through the same atomic fragment set; no hidden fragment-specific logic - Dashboard menu-grid is a single flat list; layout is CSS-driven - Session and footer rendering work off structured link objects, matching how the rest of the codebase composes links - Pager-dots and radio-group callers stop depending on deleted per-purpose fragments
Technical notes:
- Closes the multi-commit refactor series: admin fragment
consolidation + public fragment contract extension + admin CSS
update + caller migration
- link/div-based recomposition matches the HTML emitted previously;
no visible output change expected
- A CRLF warning is emitted on core/admin.php during staging; Git
normalizes the file to LF on commit as per .gitattributes
Align the three public themes (default, lite, simple) with the same
fragment contracts used on the admin side: inline items loop inside
title-tip, pager-dots variant on inline-badge, radio-group flag on
post-div, and optional structured details list on message-block.
Core changes:
- title-tip fragment (default/lite/simple):
Replace the single-content emission with a multi-branch contract: content_html / content / items (with inline label+value+is_last loop) / label_text
Remove the per-theme title-tip-item fragment; the item loop is inlined into title-tip to match the admin contract
- inline-badge fragment (default/lite/simple):
Add
is_pager_dotsflag: renders the ellipsis pager placeholder (sl_num_exitspan) directly from inline-badge- Matches admin-side pager-dots consolidation
- post-div fragment (default/lite/simple):
Add
is_radio_groupflag that appends thesl-radio-groupclass when the caller composes a radio group via post-div- message-block partial (default/lite/simple):
Accept a structured
detailslist (label + value/value_html) in addition to the existing free-formdetails_htmlCallers building a key/value detail table can now skip manual
<br>composition
Benefits: - Single contract for title-tip across admin and public themes, eliminating the per-item include round-trip - Shared pager-dots visual uses one fragment definition across stacks - Message-block rendering works from structured data instead of pre-concatenated strings
Technical notes:
- Pairs with the core/helpers getTplTitleTip switch to items and
the modules/money/send switch to details (see caller migration
commit)
- No visible HTML change when callers supply the same data in the
new format; the rendered markup matches prior output
Rework the admin stylesheet to match the consolidated fragment
contracts: drop rules that belonged to removed fragments, add rules
for the atomic variants now emitted by select, div, save-action,
and flatten menu-grid to remove the row wrapper.
Core changes:
- Admin stylesheet (templates/admin/assets/css/new.css):
- Add
.sl-save-action-selectfor save-action's composed select Add
.sl-debug-section,.sl-debug-section-success,.sl-debug-section-warn,.sl-debug-section-dangerto drive the debug-section fragment's tone variantsAdd
.sl-code-row-odd,.sl-code-row-even,.sl-code-row-num,.sl-code-row-cellto style the code-row fragment directlyFlatten
.sl-menu-grid: it is now a flex wrap container, with the former.sl-menu-grid-rowwrapper removed from markupRemove
.sl-menu-grid-row,.sl-user-search*rules tied to the deletedmenu-grid-rowanduser-searchfragments
Benefits:
- Stylesheet stays aligned with the current admin fragment set
- Menu-grid renders from a single flat items_html without per-row
wrappers, matching the admin/index.php caller change
Technical notes: - Pure CSS change; no JS or template contract implications beyond what the admin fragment refactor already introduced
Collapse ~35 single-purpose admin fragments into shared atomic ones
(link, div, hidden, button, select, inline-badge, etc.) and
extend the surviving fragments with the flags their consolidated
callers need. Three admin partials are realigned to the new contracts.
Core changes:
- Removed obsolete fragments (templates/admin/fragments/):
Wrappers collapsed into
link/div: alpha-nav-link, alpha-nav-text, category-sub-item, comment--link,
comment-avatar, comment-num-link, comment-text, comment-list-form,
geo-ip-flag, label-item, row-actions-item, view-field,
title-tip-item, table-cell, table-row-content, span-raw,
navi-tab-link, navi-tab-content, tabs-* helpers
Form/list wrappers collapsed into shared
form/select/hidden: * ajax-textarea-form, comment-list-form, edit-list-select,
forum-reply-form, money-calculator-form, multi-select,
radio-group, radio-option, user-search
Display wrappers collapsed into
inline-badge/div: * graphic, img-preview, pdo-error-badge, rating-wrap, code-block,
code-table, div-collapse, session-admin-summary, list-bottom,
menu-grid-row, msg-center, warning-list, checkbox-input,
pager-dots (now an inline-badge flag)
- Extended surviving fragment contracts (templates/admin/fragments/):
- title-tip: inline
itemsloop replaces the title-tip-item include table: single
<table>emission withis_wrapless+disable_sortbranches handled via boolean flags instead of 4-way duplicationform: accept either raw
actions_html+submit_labelor a structuredactionsblock that defers to save-action- save-action: compose from
hidden+select+buttonfragments - inline-badge: add
is_pager_dotsflag (replaces pager-dots) post-div, div, link, span, button, hidden, input, checkbox, radio, select, textarea, file-input, foot-controls, module-foot, admin-block-links, menu-grid, menu-grid-item, menu-list-item, debug-section, code-row, edit-tip, session-row, tabs-link, toggle-form-block, table-cells: tighten markup, add boolean flags required by migrated call sites
- Realigned partials (templates/admin/partials/):
changelog.html, login.html, registration.html: update to match new contract of underlying fragments (link/hidden/button composition)
Benefits: - One atomic fragment per concept; admins stop carrying 3-4 near duplicates for the same tag - Flag-driven variants keep markup consistent across callers - Contracts converge between admin and public themes (title-tip, inline-badge, save-action etc.)
Technical notes:
- Pairs with the core + admin + modules caller migration commit
below; intermediate checkouts are not expected to render cleanly
- No behavioural change in the final output; the emitted HTML matches
the previous markup once callers pass the new flag/link arrays





