Журнал изменений
Replace getTplAdminTable, getTplAdminTableHead, getTplAdminTableRow, getTplAdminTableCells, getTplAdminFlagBox and old alert fragment calls with new/* fragment API throughout. Replace getTplAdminNavi with getTplAdminTabs in all handler functions.
Core changes:
- getSqltable (admin/modules/database.php):
- Replace getTplAdminFlagBox with inline new/inline-badge fragment call
- Replace getTplAdminTableRow + getTplAdminTableCells with new/table-row + new/table-cells
- Replace getTplAdminTable + getTplAdminTableHead with new/table fragment (disable_sort)
- getSqlsum (admin/modules/database.php):
- Replace getTplAdminInfoLine lines and old alert fragment with new/alert using lines array
- Inline status as plain text (_OK / _ERROR) instead of inline-badge
- All handler functions (dump, dblock, etc.):
- Replace getTplAdminNavi with getTplAdminTabs
- Replace old alert type-string calls with new/alert is_warn bool
Benefits:
- Removes dependency on all deprecated getTplAdmin* table helpers
- Alert rendering consistent with rest of admin via new/alert
Technical notes:
- disable_sort: true used on SQL log table (row order is query-defined)
- new/alert lines array renders each element as a separate paragraph
Replace all legacy fragment and helper calls with new/* fragment API. Rebuild getEditbox as a new/form with HTMX attributes, box_id anchor, and inline token. Add CSRF check to save() with HTMX-aware response. Replace robots button fragment with new/button and inline onclick. Add global $tpl declaration to renderEditorPage.
Core changes:
- getEditbox (admin/modules/editor.php):
- Replace getTplAdminNavi with getTplAdminTabs
- Replace admin-editor-note-panel with box partial using box_id repeditornote
- Replace alert fragments with new/alert (is_warn flag instead of type string)
- Replace getTplAdminForm + row helpers with new/form (form_attr, rows, hidden, submit_label)
- Replace textarea_code direct call with getTplCodeEditor helper
- getRobotsButton (admin/modules/editor.php):
Replace admin-editor-robots-button fragment with new/button + button_attr containing data-robots-template and inline onclick for CodeMirror setValue/focus
- renderEditorPage (admin/modules/editor.php):
- Replace admin-editor-root-panel fragment with box partial using box_id repeditor
- Add missing global $tpl declaration
- save() (admin/modules/editor.php):
- Add checkSiteToken() guard with HTMX-aware early echo for new/alert is_warn
- info() (admin/modules/editor.php):
- Replace setAdminInfoPage with setTplAdminInfoPage
Benefits:
- CSRF guard in save() closes missing token check for file write operations
- HTMX partial replacement targets named box_id anchors (repeditor, repeditornote)
- No module-specific fragments remain; all replaced by new/* contracts
Technical notes:
- getTplCodeEditor called with mode, id, name, text — API unchanged
- form_attr passed through new/form via form.html form_attr extension
Replace getTplAdminNavi with getTplAdminTabs throughout. Replace getTplAdminPlaceholder and legacy alert fragment calls with new/alert and box partial. Add CSRF token validation to fix() with early return on failure. Add module search widget as subtitle.
Core changes:
- categories(), add(), subadd(), addedit(), edit() (admin/modules/categories.php):
- Replace getTplAdminNavi with getTplAdminTabs (same op/tab arrays, no subtabs)
- Replace getTplAdminCatSearch + sub param with subtitle_html via getHtmlPart searchbox
- Replace getTplAdminPlaceholder with $tpl->getHtmlPart('box', ['box_id' => ...])
- Replace alert fragment calls with new/alert
- fix() (admin/modules/categories.php):
- Add checkSiteToken() guard with early return and getTplAdminTabs header output
- Prevents category reorder endpoint from being called without a valid CSRF token
- add() and related form functions:
- Replace admin-categories-add-rows fragment with getTplRadioGroup and new/* inputs
- Form rows passed as structured arrays to new/form fragment
Benefits:
- CSRF protection in fix() closes a missing token check
- Subtitle search widget aligned right in module head via new flex layout
- All legacy admin- fragment calls replaced by new/ contracts
Technical notes:
- getTplAdminNavi no longer called from this module
- No behavioral changes to category CRUD logic
Replace all module-specific table/row fragment helpers in getAdminCategoryList, getAdminBlockList and getAdminFavoriteList with direct new/table, new/table-row, new/table-cells, new/title-tip and new/row-actions fragment calls.
Core changes:
- getAdminCategoryList (core/admin.php):
- Build tipItems array for new/title-tip (description, subcategory, language)
- Replace getTplAdminCategoryRow with new/table-row + new/table-cells inline
- Replace getTplAdminCategoryTable with new/table fragment (disable_sort, colspan for weight)
- Replace getTplAdminMoveControls with getTplMoveControls
- Inline delete action as row-actions item with onclick_attr
- getAdminBlockList (core/admin.php):
- Build tipItems array for new/title-tip (name, language, expiry)
- Replace getTplAdminBlockRow with new/table-row + new/table-cells inline
- Replace getTplAdminBlockTable with new/table fragment (disable_sort, colspan for weight)
- Inline status-change, edit and delete as row-actions items with onclick_attr
- getAdminFavoriteList (core/admin.php):
- Analogous migration to new/table-row + new/table-cells + new/table
Benefits:
- Removes dependency on all deleted module-specific row/table fragments
- Table header defined inline as data; no separate head fragment needed
- Action menus built from structured arrays; no string concatenation
Technical notes:
- disable_sort: true used for reorderable lists where JS sort would conflict
- Colspan 2 on weight column accounts for the adjacent move-controls cell
- All onclick_attr values use htmlspecialchars on title to prevent XSS
Move getTplMoveControls from helpers-old to helpers as a stable new-layer helper. Extend getTplAdminTabs to pass tabs_id, is_runtime, tabs_index and tabs_sync_selector to the module-head fragment, and forward link_attr and rel per tab link. Remove deprecated module-specific table/row helpers from helpers-old.
Core changes:
- core/helpers.php:
getTplAdminTabs: pass tabs_id, is_runtime, tabs_index (from tab or tabs_index key), tabs_sync_selector, link_attr and rel to the new/module-head fragment
getTplMoveControls: new stable helper replacing getTplAdminMoveControls in old layer; renders new/move-controls fragment with HTMX transport and token-safe URLs
- core/helpers-old.php:
- Remove getTplAdminMoveControls (superseded by getTplMoveControls in helpers.php)
- Remove getTplAdminCategoryTable, getTplAdminCategoryRow
- Remove getTplAdminBlockTable, getTplAdminBlockRow
- Remove getTplAdminFavoriteTable, getTplAdminFavoriteRow
- Remove getTplAdminPrivateTable, getTplAdminPrivateRow
- Remove getTplAdminFilesTable, getTplAdminFilesRow
- Update getTplAdminFlagBox to use new/inline-badge fragment
Benefits:
- getTplMoveControls is now a first-class new-layer helper
- getTplAdminTabs covers all new module-head contract attributes in one call
- Removes ~110 lines of deprecated, module-specific rendering code
Technical notes:
- All callers of removed helpers have been migrated to direct fragment rendering
- getTplAdminFlagBox still exists in helpers-old for legacy callers not yet migrated
Tab switching now reads data-sl-tabs-sync from the root element and updates matching DOM nodes (e.g. hidden inputs) with the active tab index on every pick.
Core changes:
- tabs.js (setAdminTabs):
- Read data-sl-tabs-sync attribute from the tabs root element
- Extract tab index into local var before the loop (avoids repeated indexOf call)
- On pick: query all syncSelector nodes and set their .value to the active index
- Reuse index var for sessionStorage and info-link URL param (no behavior change)
Benefits:
- Enables tab index persistence into hidden form inputs without PHP-side coupling
- Reduces redundant list.indexOf(link) calls inside the pick handler
Technical notes:
- Backward compatible: if data-sl-tabs-sync is absent, behavior is unchanged
- Complements the new tabs_sync_selector attr added to module-head.html
Move legacy sl_bl_up/down styles from system.css to new.css under sl-* naming. Improve alert border-radius and module-head flex layout for subtitle alignment.
Core changes:
- new.css:
- Add .sl-bl-up / .sl-bl-down (move controls, replaces legacy sl_* equivalents)
- Add border-radius: 6px to .sl-warn and .sl-info alert boxes
- Refactor .sl-module-head-body to flex with space-between for subtitle alignment
- Fix .sl-module-head-subtitle margin and searchbox float reset
- system.css:
- Remove legacy .sl_bl_up / .sl_bl_down rules (now covered by new.css)
Benefits:
- Move-control styles now live in the new layer alongside the move-controls fragment
- Alert boxes visually consistent with rounded corners
- Module head subtitle (e.g. search widget) aligns right without float hacks
Technical notes:
- No behavior change; purely visual and structural CSS migration
- sl_* legacy classes remain unaffected elsewhere
New fragment contracts replace module-specific HTML templates with neutral, reusable fragments aligned to the new admin base layer architecture.
Core changes:
- New fragments (templates/admin/fragments/new/):
- inline-badge.html: colored status badge (replaces admin-flag-box)
- move-controls.html: HTMX up/down reorder controls (replaces admin-move-controls)
- Extended fragments (templates/admin/fragments/new/):
- form.html: add optional form_attr pass-through for HTMX attributes
- label-hint.html: switch hint to triple-braces to allow HTML content
- module-head.html: add tabs_id, is_runtime, tabs_index, tabs_sync_selector attrs
- row-actions-item.html: add link_attr for HTMX and custom attributes on links
- table.html: add disable_sort flag to suppress data-sl-table-sort
- th.html: add colspan support
- Extended partials (templates/admin/partials/):
- box.html: add optional box_id attribute for HTMX target anchoring
- Removed module-specific fragments (13 files):
- admin-block-row.html, admin-block-table.html
- admin-category-row.html, admin-category-table.html
- admin-editor-note-panel.html, admin-editor-robots-button.html, admin-editor-root-panel.html
- admin-favorites-row.html, admin-favorites-table.html
- admin-files-row.html, admin-files-table.html
- admin-private-row.html, admin-private-table.html
Benefits:
- All callers now use neutral new/* contracts instead of module-specific fragments
- box_id enables HTMX partial replacement without extra wrapper elements
- Reduces total fragment count; eliminates one-off module templates
Technical notes:
- inline-badge replaces getTplAdminFlagBox output contract
- move-controls replaces getTplAdminMoveControls output contract
- Deleted fragments had no callers remaining after module migration
Local development configuration adjustments only; no production impact.
Core changes:
- config/global.php:
- Set dev_mode from '0' to '1' to activate debug output locally
- config/local.php:
- Remove header comment block and example overrides
- Set base_fingerprint to current computed value
Benefits:
- Template debug alerts (getTemplateDebugComment) now active in dev
- Fingerprint kept current for asset cache-busting
Technical notes:
- These files should not be deployed to production as-is
Full rewrite of admin/modules/config.php UI layer to use the canonical fragment API. Tabs now persist across page loads via URL ?tab=N parameter, and the INFO link always reflects the currently active tab.
Core changes:
- config() function:
- Replace getTplAdminNavi() with getTplAdminTabs() and new/tabs fragment
- All 7 tab panels rebuilt using new/tabs-panel fragments
All form inputs migrated: getTplTextInput/Textarea/Select → getHtmlFrag
- input: text, url, email, number types with is_config, maxlength, placeholder
- textarea: with is_config, is_required, cols_num, rows_num
- select/select-option fragments replace getTplSelect/getTplOption
- Tabs rendered with init_attr="data-sl-tabs-index=N" for JS state sync
- INFO link rendered with data-sl-tab-info-link="config" for URL sync
- Form rebuilt via new/form fragment (hidden tokens, content_html slot)
- save() function:
- Add CSRF token check at entry; render alert on failure and return early
- Fix: getVar('req' → 'post') for startdate field
- Fix: $xhomeurl trailing-slash strip guarded against empty string
- info() function:
- Complete rewrite: replaces setAdminInfoPage() with inline rendering
- Tab nav built with new/tabs fragment (plain links, INFO tab is_active)
- Reads locale-specific .md/.html file from admin/info/config/
- Editable via new/form fragment when $conf['adminfo'] is set
- CSRF token checked on save_info POST; alert shown on failure
Benefits:
- Tab state survives reload via ?tab=N without sessionStorage conflicts
- Consistent API across all admin modules
- CSRF check in save() closes gap that existed in original implementation
Technical notes:
- getTplAdminNavi/getTplAdminTabContent/getTplAdminTabsSetup calls removed
- Backward-compatible: config keys and save logic unchanged