Журнал изменений
Consolidate duplicated logic behind shared core helpers, add item-level breadcrumb resolution, and fix forum topic-list pager and the inline favorite button across the lite theme and forum module.
Core changes:
- Entity decode helper (core/system.php, 16 files):
Add getDecodedText() and replace 25 inline html_entity_decode(..., ENT_QUOTES | ENT_HTML5, 'UTF-8') call sites
- Decode forum topic titles in the list so quotes render, not "
Forum topic state helper (core/system.php, modules/forum/index.php, blocks/center_forum.php):
Add getForumTopicState() as the single source for the is_topic_* status flag; drop the duplicated if/elseif chains
- Item breadcrumbs (core/helpers.php, templates/lite/index.php):
- Add getItemCrumb() guarded via information_schema (cid + title)
getThemeHeadVars() resolves the category trail for op=view items and appends the current item title as the last crumb
- Forum list fixes (modules/forum/index.php):
Stop the topic loop from clobbering the page category; use $catid so the pager and the moderator move form get the correct id
- Merge the status icon into the single topic title link
- Inline favorite button (core/user.php):
Wrap the favorite toggle in an inline span instead of a block div so it no longer shifts headings
- Block title bar (core/system.php):
render_blocks() forwards optional icon_name/href to the block-all wrapper; center_forum block supplies them
Benefits:
- Single source of truth for decode and topic-state logic
- Correct forum pagination and clean heading layout
- Uniform item breadcrumbs across category modules
Technical notes:
- Behavior preserved; shop/content without cid are safely skipped
- No backward-incompatible changes
Prevent the generated PHP CS Fixer cache from being tracked, keeping the working tree clean after running the style fixer.
Core changes:
- Ignore rule (.gitignore):
- Add .php-cs-fixer.cache under a dedicated PHP CS Fixer section
Benefits:
- No accidental commits of tool-generated cache
- Cleaner status output
Technical notes:
- Tooling-only change, no runtime impact
- Replace PERFORMANCE_AUDIT_* notes with consolidated PERFORMANCE.md and new ARCHITECTURE.md
- Update README/CONTRIBUTING/SECURITY/UPGRADING and docs guides
- table.html: single-call rows_html contract (drop open/close two-pass and dead footer_html)
- table-row.html: is_truncate, is_forum_user cell flags
- Sort-indicator CSS, sl-cell-ellipsis truncation, tokenized icon sizes
- Footer forum teaser: clickable user icon, fix list overflow and even column distribution
- Decode HTML-entity-encoded titles before escaped output across forum/news/files/pages/faq/jokes/center* blocks
- parser: decode entities in plain [code] blocks (fixes double-encoded <, ", &)
- Add getForumTopics() helper; drop triplicated forum-topic query assembly
- voting block: move HTML wrapper to block-content fragment, fix array_rand crash on empty set
- forum block: CSS truncation, plain escaped poster name
- Reindent blocks to 4 spaces; normalize legacy file headers
The Apache rules section of the editor help now notes that Nginx and IIS do not read .htaccess and shows the error_page directive needed to route HTTP errors to the styled CMS error page.
setExit() now renders a single styled card (logo, gradient divider, message, home/search) for every error and notice, in both the lite and admin themes. Assets resolve through an absolute <base href> built from homeurl so the page keeps its styling even when served from a deep URL, and all <head> tags are emitted via fragments (head-base, head-meta, meta-refresh) instead of inline HTML. The login divider and the message divider share a single --sl-line-gradient token. access.php becomes a thin guard, and _ERROR404 is reworded into a neutral, universal _ERROR_PAGE across all six locales.
Saving an info/help doc ran the Markdown source through filterHtml(), which (for the CodeMirror branch) applied nl2br + htmlspecialchars + $/quote escaping and corrupted the file on the first save. Info docs are rendered in trusted mode (filterContent safe=false), so store the raw Markdown with normalized LF line endings instead. Wrap the rendered doc in a scoped .sl-markdown container (via the generic div partial) and add spacing rules so the help pages no longer render cramped.
getAdminInfo() was an AJAX duplicate of setTplAdminInfoPage() reachable only via the index.php dispatch case 'getAdminInfo', which nothing in the UI ever triggered. Drop the function and its dispatch case.
The info/help tab in every admin section reused the generic _INFO label ('Информация'). Introduce a dedicated _DOCS constant ('Справка' / 'Documentation') in all six locales and switch the tab bars to it, leaving _INFO for the generic tooltip/nav usages that genuinely mean 'information'.