Журнал изменений

Официальный сайт SLAED CMS

Журнал изменений

Фильтр и поиск

Всего: 1239 Доступных коммитов | Отфильтровано: 1239 Коммиты | Страница: 1 из 124
Вчера (07.10.2026)
Feature: CodeMirror wears the admin theme, a manifest type may be a list, and the core and each language build apart
Автор: Eduard Laas | Дата: 23:32 07.10.2026

Steps 28 and 29 of docs/ROADMAP-2026.md (batches 1 and 2 of docs/4-EDITOR-2026.md). The code editor is painted by the theme tokens in place of One Dark and speaks the locale in its panels; one check in Editor reads the manifest field type as a string or a list, so one plugin can serve as a text and a code editor; and the build writes the core and every language as files of their own, which the runtime of batch 3 loads on demand.

Core changes:

  1. CodeMirror in the theme (public/plugins/editors/codemirror/driver.php, public/plugins/editors/codemirror/assets/cm6.css, public/templates/admin/assets/css/base.css, public/templates/admin/assets/css/theme.css, public/templates/lite/assets/css/theme.css, public/templates/admin/fragments/editor-mount.html, public/templates/lite/fragments/editor-mount.html):

  2. The driver writes syntaxHighlighting(classHighlighter), so the theme colours the tok-* classes and the code follows the scheme; One Dark leaves the driver and the build

  3. The mount of a code editor carries the shell name sl-editor in place of sl-code-editor in both themes
  4. --sl-face-mono and --sl-editor-max-height (50vh) join the admin API block; the height floor stands on .cm-content and .cm-gutter, and cm6.css keeps only the focus outline instead of a fixed 400 px

  5. The Tahoma rule on .cm-content and the doubled height of a second editor are gone
  6. Line numbers and comments take --sl-text-muted, tags --sl-primary-strong, and the current node of the file tree --sl-primary-strong, so each holds AA

  7. Phrases of the panels (lang/de.php, lang/en.php, lang/fr.php, lang/pl.php, lang/ru.php, lang/uk.php):
  8. Twenty-five EDITOR* constants for search, fold, go to line, lint, completion and the screen reader announcements; with _ALL, _CLOSE, _EDITOR_PREV and _EDITOR_NEXT the driver hands them to EditorState.phrases

  9. Manifest type (core/classes/editor.php, admin/index.php, public/plugins/editors/codemirror/manifest.json):
  10. Editor::checkType() answers whether a manifest serves a type given as one string or a list, and replaces the comparisons of getCode(), checkManifest() and getEditorList()

  11. isValidEditor() of admin/index.php, a copy of Editor::isValidEditor() with its own string comparison, is removed; the new administrator and the editor switch of the panel call the class

  12. Editor::getManifest() takes over the one check only the copy made: a manifest whose id differs from its directory is refused, so no key reaches a manifest or a driver outside its own folder

  13. The CodeMirror manifest declares type as ["code"]; content, the user role and the text formats join with its ContentDriver in batch 4, so no list offers a text editor that renders Plain

  14. Split build (public/plugins/editors/codemirror/build/build.mjs, build/core.js, build/entry.js, build/package.json, public/plugins/editors/codemirror/assets/*.js):

  15. ES modules with splitting: core.js, lang-<key>.js for php, html, css, js, json, sql, xml and markdown, each exporting language, and shared chunk-<hash>.js files named by their content

  16. The build refuses a language file that imports core.js, which a versioned core address would load a second time
  17. entry.js re-exports core.js and still builds cm6.bundle.js for the current driver until batch 3
  18. @codemirror/lang-markdown and the packages the exports name join package.json; theme-one-dark leaves
  19. Tests and registries (tests/Unit/EditorFormatTest.php, tools/ui-audit-baseline.json, tools/ui-contrast.json):
  20. Code editors are handed to the theme as classes and speak the locale; both forms of type and a key leaving its folder; the three lists of getSelect(); a split file for every language of the manifest with no import of the core entry

  21. The audit baseline counts the two new tokens; the contrast registry is regenerated over the new screens
  22. Plans (docs/4-EDITOR-2026.md, docs/ROADMAP-2026.md):
  23. Batches 1 and 2 record what was done and measured; batch 3 retires the bundle and the CM6.editors readers; batch 4 completes the manifest; the roadmap ticks steps 28 and 29

Benefits:

  • Code follows the light and dark scheme of the panel and is readable at AA
  • A code screen will load the core and one grammar: 151.8 KB gzip for css or sql, 223.5 KB for php, against 239.5 KB of the bundle on every screen; the core alone is 130.5 KB

  • One manifest check for the class and the panel

Technical notes:

  • The split files have no user before batch 3; the bundle keeps its size and changes only minifier names
  • Chunks are requested without v= and live a week in the browser, safe because their names follow their content
  • No schema, address or API changes
Fix: A saved text keeps its line breaks, the private data plan is closed, and the editor plan has its answers
Автор: Eduard Laas | Дата: 20:52 07.10.2026

Steps 25 to 27 of docs/ROADMAP-2026.md. The private data plan hands its lasting part to the reference and is deleted; batch 0 of the editor plan records the owner's answers, pins the lost <br> to the mount and takes the screenshot baseline; and the mount of getTplTextarea() no longer deletes every stored <br>, which made each save of the account settings strip the signature and the custom menu of every member writing in Markdown.

Core changes:

  1. Line breaks on mount (core/helpers.php, docs/EDITORS.md, docs/VERSIONS.md):
  2. getTplTextarea() mounts a stored <br>, with the line end after it, as a line end for plain, which nl2br() of the save restores, and as a Markdown hard break, two spaces and a line end, for markdown; html mounts as it is

  3. replace_break() is no longer part of the mount and keeps its other callers
  4. Measured through one save of the account settings in the browser: the custom menu went from 1475 bytes with 22 tags to 1431 bytes with 22 hard breaks instead of 1387 bytes with none, and a second save changed no byte

  5. EDITORS.md replaces the open defect with "Line Breaks on Mount", the contract with the measurements; VERSIONS.md records the change

  6. Tests (tests/Unit/EditorBreakTest.php, tests/Support/break_probe.php):
  7. Stored values go through the shipped mount, the browser submit and the save of both formats: the bytes written, a second save that changes nothing, the signature render before and after, and the escaped render of markdown

  8. The test fails on the old mount in three of its five methods
  9. Private data reference (docs/ARCHITECTURE.md, README.md, UPGRADING.md, docs/VERSIONS.md, admin/info/security/ru.md, docs/2027-CONNECTOR.md, docs/0-PRIVATE-DATA-2026.md, tests/Unit/JournalNameTest.php, tests/Unit/JournalSecretTest.php, tests/Unit/SelfCheckTest.php, tests/Support/check_probe.php, tests/Support/journal_probe.php):

  10. ARCHITECTURE.md gains "Private Data Boundary": the public/ tree, the two modes, the self-check and the journals
  11. The security help lists every journal by file and what it holds, and describes the self-check
  12. README.md names the public folders of uploads/ and the self-check; UPGRADING.md describes the self-check, the journals without secrets and their new names; VERSIONS.md records the whole plan, the document root included

  13. The plan is deleted; the comments of the journal and self-check tests and probes point at the reference
  14. Editor plan, batch 0 (docs/4-EDITOR-2026.md, tools/ui-shots.json):
  15. The seven open decisions are answered and settled under "Answered decisions", and the batches follow them
  16. The screenshot manifest gains the tplconfig, system file, block file, template style and new member screens
  17. The plan notes that the <br> defect was the mount and is repaired by item 1
  18. Roadmap (docs/ROADMAP-2026.md):
  19. Steps 25 to 27 are ticked; step 27, the repair of the <br> defect, was added by the owner before editor batch 1

Benefits:

  • No member loses the breaks of a signature or a custom menu by saving an unrelated setting
  • A markdown break renders as <br> in the escaped render of comments and the forum too, where a stored <br> printed as text

  • CodeMirror as a text editor mounts through the same function and does not inherit the loss

Technical notes:

  • Stored form: a value saved in markdown holds two spaces where it held <br>, two bytes less per break; a line of nothing but a <br> becomes an empty line, so the lines around it render as two paragraphs

  • Not fixed here: the WYSIWYG mode of Toast UI writes a hard break back as nothing and a <br> as a bare line end; the forward and quote of a private message are still stripped the old way, where only an inline <br> is lost

  • No schema, address or API changes
Feature: Versioned assets are kept a year, the head scripts run deferred, and the asset cache plan is closed
Автор: Eduard Laas | Дата: 15:47 07.10.2026

Steps 22 to 24 of docs/ROADMAP-2026.md (batches 2 to 4 of the asset cache plan): the web server gives a style or script with v= in its address a year and any other static file a week, every head script is printed defer in its order, and the reference takes over from the plan, which is deleted. The commit also carries the stand pages and the plans of the Node list header, the 2027 plans of the connector and Vine Monitor, and a toggle that remembers nothing.

Core changes:

  1. Lifetimes (public/.htaccess, nginx.conf.example):
  2. mod_headers sets public, max-age=31536000, immutable on a CSS or JS request with v= in the query and public, max-age=604800 on any other static kind; the mod_expires block is gone

  3. nginx chooses the same by a server-level $asset_cache on $arg_v, since an if inside a location would drop its try_files, and turns gzip on for the types the .htaccess deflates

  4. Deferred head scripts (core/system.php, core/classes/editor.php, core/classes/parser.php, public/plugins/editors/toastui/driver.php):

  5. doScript() prints every head script defer in the order of getAssetList(); setHead() always prints it
  6. Editor::getInitScript() waits for DOMContentLoaded while window.SlaedEditors is missing, so an editor of a page load registers its teardown

  7. The editor skin and the toastui emoji file ask the version map instead of the disk; the highlight versions are part of the parser cache key

  8. Settings (config/global.php, admin/modules/config.php, admin/lang/*.php, admin/info/config/ru.md, public/update.php):

  9. script_a (async) and script_b (scripts at the end of the page) leave the shipped configuration, the settings screen, the six admin locales and the help; update.php drops both from a carried 6.2 configuration

  10. Reference (docs/PERFORMANCE.md, docs/TEMPLATES.md, docs/VERSIONS.md, admin/info/editor/ru.md, docs/3-ASSET-CACHE-2026.md, docs/ROADMAP-2026.md):

  11. PERFORMANCE.md describes the versions, the lifetimes by kind, the Apache and nginx rules, the defer order, the compression and the measurement repeated on the stand; TEMPLATES.md the versioned addresses of a theme

  12. The help of the server files shows the shipped mod_headers and nginx rules instead of mod_expires
  13. VERSIONS.md records the change with the baseline comparison; the plan is deleted, the roadmap ticks steps 22-24 and gains steps 38-46 of the Node head plan

  14. Toggle scope (public/plugins/system/slaed.js):
  15. data-sl-toggle-scope="none" keeps no state in localStorage; "path" and the site-wide default stay as they were
  16. Plans and stand pages (docs/5-NODE-HEAD-2026.md, docs/2027-CONNECTOR.md, docs/2027-VINE-MONITOR.md, public/demo/nh-10-unified.html, public/demo/nh-11-full.html, public/demo/nh-12-views.html, public/demo/nh-13-calm.html, public/demo/assets/demo.js):

  17. The Node head plan carries the approved header of nh-13, views by type, the RSS channel, a live list and search hints; the 2027 plans describe the connector and the Vine Monitor module, nothing implemented

  18. The stand pages nh-10 to nh-13 and their shared script
  19. Tests (tests/Unit/AssetVersionTest.php, tests/Unit/NginxConfigTest.php, tests/Unit/UpdateConfigTest.php, tests/Support/asset_probe.php, tests/Support/update_probe.php):

  20. Every file of public/ is walked through both server files; the head scripts are deferred in the shipped order; neither switch survives a saved form, a rebuilt local.php or the 6.2 update

Benefits:

  • A returning visitor fetches only the files whose address changed; a warm page costs one network request
  • Script order holds without async tricks; no editor instance leaks its teardown

Technical notes:

  • Breaking: script_a and script_b are gone from configuration and settings; an Apache without mod_headers sends no lifetime; a theme or plugin file replaced by hand needs config/local.php rebuilt to reach the browsers

  • Not checked: Apache without mod_headers and LiteSpeed reading the <If> block
Feature: Every asset address carries the version of its content, read from the derived configuration
Автор: Eduard Laas | Дата: 10:52 07.10.2026

Batch 1 of docs/3-ASSET-CACHE-2026.md (step 21 of docs/ROADMAP-2026.md). A stylesheet or script is printed as file?v=<first ten hex characters of its SHA-1>, so batch 2 can give a versioned file a year in the browser and a changed file still reaches every visitor on the next page. The versions are computed once with config/local.php; a request hashes nothing and stats no asset file.

Core changes:

  1. Version map and address (core/classes/template.php):
  2. Template::getAssetVersions() maps every CSS and JS file below templates/ and plugins/ to its version
  3. Template::getAssetUrl() prints an address with the version from $conf['derived']['version']

    • dev_mode and a run without the map (setup.php, update.php) hash the file per request
    • A file the map does not know stays a plain address
  4. The companion assets of a template go through it
  5. Derived configuration and the page head (core/system.php):
  6. getConfig() stores the map under $conf['derived']['version']; cache_version 5 rebuilds an older local.php
  7. doCss() and doScript() print the versioned addresses and no longer call file_exists() per file
  8. Other printers (core/classes/editor.php, core/classes/parser.php, core/classes/captcha.php, core/security.php, modules/presentation/index.php, public/setup.php, public/update.php):

  9. Editor::getAssetTags() versions its lists before the page and the htmx branch, so the client loader compares the same address the page carries and an engine is fetched once

  10. The highlight scripts, the altcha loader, presentation.js, the error page and the installer and updater pages
  11. Robots screen (admin/modules/editor.php):
  12. getRobotsButton() drops its own tag of editor-robots.js, which the admin package prints on every panel page
  13. Tests and plans (tests/Unit/AssetVersionTest.php, tests/Support/asset_probe.php, docs/3-ASSET-CACHE-2026.md, docs/ROADMAP-2026.md):

  14. Every head tag of both themes carries the version of its file; a changed file changes its address; the head is printed from the map for a file that does not exist; page and fragment name the same editor address

  15. The plan's status line records batch 1; the roadmap ticks step 21

Benefits:

  • A release reaches returning visitors at once, whatever lifetime batch 2 sets
  • No asset stat per request in the page head

Technical notes:

  • getAssetList() keeps answering plain addresses; the theme lists and every other printer share one map
  • Adding or changing a theme or plugin asset needs a config rebuild, as theme assets did before; dev_mode shows it at once

  • No schema change, no route change
Docs: The asset cache plan records every printer of an asset address and a measured baseline
Автор: Eduard Laas | Дата: 10:52 07.10.2026

Batch 0 of docs/3-ASSET-CACHE-2026.md (step 20 of docs/ROADMAP-2026.md). Before any asset address carries a version, the plan lists every place that prints one, every inline script that depends on a loaded file, and a cold and warm measurement of three pages on the stand, so the later batches change a known set and are measured against the same figures.

Core changes:

  1. Inventory (docs/3-ASSET-CACHE-2026.md):
  2. Every printer of an asset address with its files, its attribute today and what batches 1 and 3 do to it

    • doCss(), doScript(), Editor::getAssetTags(), SlaedEditors, Template::getAssetTag(), Parser, Captcha,
the robots screen, the presentation partial, setExit(), setup.php and update.php
  • The inline scripts that call a function of a loaded file, and the one real conflict of defer: getInitScript()
  • The root .htaccess reference corrected to public/.htaccess
  • Baseline (docs/3-ASSET-CACHE-2026.md):
  • Start page, list and view, cold and warm, median of three runs: requests, bytes, FCP, DCL and load
  • The warm hits come from the heuristic freshness of RFC 9111, not from a header
  • Roadmap (docs/ROADMAP-2026.md):
  • Step 20 ticked

Benefits:

  • Batch 1 versions a known, complete set of printers
  • Batch 4 repeats the same measurement against the same figures

Technical notes:

  • Documentation only, no code changed
Fix: addFile() writes or appends exactly the data it is given, and the prod findings plan is closed
Автор: Eduard Laas | Дата: 10:19 07.10.2026

Item 2 of docs/2-PROD-FINDINGS-2026.md (step 19 of docs/ROADMAP-2026.md). addFile() took its second argument as a source file or as the data and told them apart with is_file(), so every new visitor of the statistics probed a path that open_basedir logged as a warning; it now writes data only. The lasting part of the plan moves into VERSIONS.md and the plan file is deleted.

Core changes:

  1. File writer (core/system.php):
  2. addFile(string $file, string $data, string $mode = 'w'): bool writes or appends exactly the data

    • A short write fails and an incomplete append is rolled back, as before
    • The unused compression branch leaves with $comp, $del and $max
  3. updateStatsTrack() calls the new signature for ips.log and user.log
  4. Tests and probes (tests/Unit/StatsContractTest.php, tests/Support/contract_probe.php):
  5. The append contract reads bool results; data that names an existing file is appended as text, and an address appended under open_basedir raises no warning

  6. Repeated hits of one signed-in user enter the user set once and the user counter follows the set
  7. Changelog and plans (docs/VERSIONS.md, docs/ROADMAP-2026.md, docs/2-PROD-FINDINGS-2026.md):
  8. VERSIONS.md 2026-10-07 records both findings of the plan and the breaking change of addFile()
  9. The roadmap ticks step 19; docs/2-PROD-FINDINGS-2026.md is deleted

Benefits:

  • The statistics no longer fill the PHP log with an open_basedir warning per new visitor
  • Data that happens to name a file can never append that file's content

Technical notes:

  • Breaking: addFile() returns bool instead of the codes 0-3 and drops $comp, $del and $max; a caller that copied a file reads it first

  • No schema change
Feature: Every journal is named after what it holds, and a file operation lands in file.log or error_file.log by its level
Автор: Eduard Laas | Дата: 09:54 07.10.2026

Batch 5 of docs/0-PRIVATE-DATA-2026.md (step 18 of docs/ROADMAP-2026.md). error_*.log keeps what the system could not do and <meaning>.log what happened; no journal carries a log_ prefix, the file scan takes the name of its job, the rotation archives follow the journal names, and the locks leave storage/logs/ for storage/cache/locks/.

Core changes:

  1. Journal names (core/system.php, core/classes/oauth.php, core/monitor.php):
  2. log_admin.log and log_user.log become admin.log and user.log, log_oauth.log becomes oauth.log
  3. dump_log.log, dump.log and dump_map.json become filescan.log, filescan_tree.log and filescan.json

    • The scan skips its own two journals under the new names
  4. Both rotations of addCompress() name an archive <name>_<date>.log.<zip|gz|bz2>, or .log.bak without a compressor
  5. getFailedLoginCountHours() reads admin.log
  6. Routing by level (core/classes/logger.php, core/classes/upload.php):
  7. The channel file writes notice and warning to file.log, error and critical to error_file.log, each line once
  8. The rotation of Logger names its archive <name>_<date>.log.<ext>, as addCompress() does
  9. A refusal of the remote address policy is a warning and lands in file.log; a missing capability stays an error
  10. Locks (core/classes/filemanager.php, core/system.php, public/setup.php, public/update.php):
  11. The locks of FileManager live in storage/cache/locks/uploads/, the scheduler locks in storage/cache/locks/scheduler/

    • Cache::deleteAll() skips every *.lock, so clearing the cache never removes a held lock
  12. setup.php and the first stage of update.php define CACHE_DIR for the lock of config/
  13. Security section and dashboard (admin/modules/security.php, admin/lang/*.php, core/monitor.php):
  14. The label map covers exactly the journals of the rule
  15. _SEC_STAT_FILE and _SEC_STAT_OAUTH in the six locales
  16. getErrorLogCountHours() reads the structured line Logger writes and counts warning, error and critical over the four error_*.log; it counted a bracketed format no writer produces and always reported zero

  17. Help and reference (admin/info/uploads/ru.md, modules/account/admin/info/ru.md, docs/ARCHITECTURE.md, docs/NODE.md):

  18. The uploads help points the address refusals and the file manager operations at file.log
  19. The OAuth help names oauth.log; ARCHITECTURE.md and NODE.md name the lock folder and CACHE_DIR of the first stage
  20. Tests and probes (tests/Unit/JournalNameTest.php, tests/Unit/JournalSecretTest.php, tests/Unit/UploadContractTest.php, tests/Unit/FileManagerTest.php, tests/bootstrap.php, tests/Support/.php):

  21. JournalNameTest: every channel maps to a journal of the rule and the label map covers every journal; every name the code writes into LOGS_DIR is a journal, a state file or an archive of the rule; a refused operation reaches file.log only and a missing capability error_file.log only; a cache clear leaves a held lock; the error counter counts the problem levels only

  22. JournalSecretTest checks the archive names of both rotations; UploadContractTest the journal of a refusal and of a stranded partial

  23. The test bootstrap keeps CACHE_DIR in the scratch of the run; the upload and scheduler probes redirect it, and the upload probe starts from empty journals

  24. Plans (docs/0-PRIVATE-DATA-2026.md, docs/ROADMAP-2026.md):
  25. The plan records batch 5 and the four points its text left open; the roadmap ticks step 18

Benefits:

  • A journal name says what the file holds, and an operator reads failures apart from records
  • The dashboard counts the errors the journals really hold
  • storage/logs/ holds journals, state and rotation archives only, and the locks sit with the cache that spares them

Technical notes:

  • Breaking: the journal names change; 8.0 installs from scratch and nothing renames the journals of an existing site
  • No schema change
Docs: The delivery of uploaded files moves into the permanent reference, and the files plan is closed
Автор: Eduard Laas | Дата: 09:20 07.10.2026

Batch 10 of docs/1-FILES-2026.md (step 17 of docs/ROADMAP-2026.md). What lasts of the plan - the owners and their folders, the go=file route, closing a folder, the writers that bind a name and the unused files filter - is written into ARCHITECTURE.md and NODE.md, VERSIONS.md records the whole plan, and the plan file is deleted. UPGRADING.md keeps saying that the release installs a new site only; the file steps of update.php live in NODE.md.

Core changes:

  1. Architecture reference (docs/ARCHITECTURE.md):
  2. A new section "File Delivery Boundary": FileAccess and its adapters, the six owners with folder, target and reader

    • The route go=file, its preview form, the shared checks of getFilePath() and the one 404 for every refusal
    • The parser file context, the writers over checkUploadNames(), closing a folder through getUploadPublic()
    • The unused filter of the uploads screen with its covered folders and readers
  3. Node reference (docs/NODE.md, docs/POINTS.md):
  4. getNodeFile() is described as the code grants: a bare name of a supported type, the go=file addresses of [usehtml], a managed name only for the preview; getTypeFiles() is added; the type folder is uploads/node/<name>

  5. "The 6.3 update" gains setUpdateAttach() among the data units, the table of the 6.2 folder moves and the copies of the profile files; POINTS.md and the intro point there instead of UPGRADING.md

  6. Upgrade notes (UPGRADING.md, lang/*.php):
  7. The 6.2 folder table and the update.php paragraphs leave; update.php leaves the list of public entries
  8. The module folders name profile; custom code asks getUploadFolder() for the folder of an owner
  9. _NODE_MIGINFO names docs/NODE.md for the folder moves in the six locales
  10. Changelog and plans (docs/VERSIONS.md, docs/ROADMAP-2026.md, docs/1-FILES-2026.md):
  11. VERSIONS.md 2026-10-07 records the files plan, the rehearsal figures and its breaking changes
  12. The roadmap ticks step 17; docs/1-FILES-2026.md is deleted
  13. Tests (tests/Unit/UpdateAttachTest.php, tests/Unit/UploadIntegrationTest.php):
  14. Two comments no longer name the deleted plan

Benefits:

  • One permanent place answers who receives an uploaded file and how a folder is closed
  • The public upgrade notes no longer describe a maintainer tool the release does not ship

Technical notes:

  • Documentation, language texts and comments only; no code path and no schema change
Feature: The file browser of the uploads screen filters a covered folder to the files no stored row references
Автор: Eduard Laas | Дата: 08:30 07.10.2026

Batch 9 of docs/1-FILES-2026.md (step 16 of docs/ROADMAP-2026.md). The foot of a folder an owner covers offers "Unused: N", which keeps the files older than a day that no text, comment, resource or avatar names, read as the file route reads them but from every stored row whatever its state; the marking and the deletion of the browser remove them. The shipped tree loses the three screenshots of uploads/forum/.

Core changes:

  1. The references of a folder (core/admin.php, core/classes/node/service.php, core/classes/comment.php, core/classes/privat.php):

  2. getAdminFileRefs() names the owner folder of a browser path and the paths below it any stored row references

    • A Node type, forum, account, profile, voting and the avatar folder are covered; all and presentation are not
    • Parser::getAttachList() reads posts, signatures, own blocks, private messages and comments; users.avatar the
avatar folder
  • NodeService::getTypeFiles() returns every name the materials of a type and their local resources reference
  • Comment::getAttachTexts() reads every target of a module for the id 0
  • Privat::getAttachBodies() reads every stored message for $all
  • The filter (core/admin.php, admin/modules/uploads.php, public/templates/admin/partials/file-browser.html, admin/lang/*.php):

  • getAdminFileShell() counts the unused files of a covered folder and keeps them alone for unused=1

    • A thumb is judged by its original, a file younger than a day is not reported
  • unused=1 travels through the filter field and the operations form, so a marked deletion returns to the filter
  • _UPLOADS_UNUSED and _UPLOADS_UNUSEDTXT in the six locales
  • Tests and probes (tests/Unit/FileAccessTest.php, tests/Unit/NodeServiceTest.php, tests/Support/route_probe.php, tests/Support/install_probe.php):

  • getRouteUnused() covers a named and an unnamed forum file, a thumb, a Node type with an attachment and two resources, the avatars, the messages, the signature and profile comments, a pending and a moderated poll comment, a fresh upload, an uncovered folder and the deletion

  • NodeServiceTest knows the signature of getTypeFiles()
  • install_probe.php writes the one forum file the post of update62 shows, since the tree ships no upload of a post
  • The tree (uploads/forum/):
  • The three screenshots slaed_cms_2026-07-13_*.png leave the shipped tree
  • Documentation and plans (docs/1-FILES-2026.md, docs/ROADMAP-2026.md):
  • The files plan records batch 9 and the decisions "The form of the report", "The folders of the report" and "What references a file"; the roadmap ticks step 16

Benefits:

  • An operator finds and removes the files no material, post, message, comment or account uses, folder by folder
  • A file of a draft, a pending material or a message one side deleted is never reported as unused

Technical notes:

  • The scan adds about 100 ms to a listing on the production database
  • Each table stays with the class that owns it
  • No schema change
Fix: The rehearsal of update.php on the production dump runs through, a forum file outside the forum reaches its post, and the folders move after the migration
Автор: Eduard Laas | Дата: 00:44 07.10.2026

Roadmap step 15, the rehearsal of docs/1-FILES-2026.md: update.php of the tree ran both stages over HTTP on a copy of the production dump of 2026-09-30 with the production files, in a scratch tree outside the stand. It found four faults, each fixed here, and that a clean 6.2 site is not migrated; every file address of the stored texts was compared before and after, and the pages that show them were crawled.

Core changes:

  1. First stage (public/update.php):
  2. The first stage defines UPLOADS_DIR, which setUpdateAttach() reads for the forum and the private messages

    • Without it the first forum post with a direct address stopped the update with a fatal error
  3. setUpdateConfig() drops a 6.2 global key that names a configuration area (forum, newsletter, search)

    • getConfig() merges the files in name order, so 'forum' => '0' of global.php replaced the whole forum area and
every topic answered a TypeError
  1. Foreign addresses (public/update.php):
  2. getMigrateForeign() takes the owner of the file route
  3. setMigrateForeign() points a direct address of uploads/forum/ in any text but a forum post at the go=file address of the first published post that carries the name

    • The news #468 and the private message #1665 of production reach their forum files through posts #6235 and #14824
  4. Order of the operator (UPGRADING.md, docs/NODE.md, lang/*.php):
  5. The upload folders move into uploads/node/<type>/ after the migration and before the site opens

    • addNodeType() refuses a type whose folder already holds a file, so a folder moved before the run stopped it
  6. _NODE_MIGINFO says so in the six locales
  7. NODE.md records the foreign address step, the path constants of the first stage, the dropped global keys and that the migration reads the 6.3 shape of the module tables, which a clean 6.2 site does not have

  8. Tests and probes (tests/Unit/UpdateSiteTest.php, tests/Unit/UpdateConfigTest.php, tests/Unit/UpdateAttachTest.php, tests/Support/install_probe.php, tests/Support/update_probe.php, tests/Fixtures/update62/site.sql):

  9. The update62 fixture seeds a forum post and a private message with direct addresses; the probe reports both texts

    • The forum post is one more rating target, so the expected count is 4
  10. The configuration probe ships forum.php and carries the 6.2 key forum, which must not reach global.php
  11. UpdateAttachTest covers the forum owner of getMigrateForeign()
  12. Documentation and plans (docs/1-FILES-2026.md, docs/ROADMAP-2026.md):
  13. The files plan records the rehearsal and the decisions "The rehearsal data", "The folders move after the migration" and "A forum file outside the forum"; the roadmap ticks step 15

Benefits:

  • update.php runs through on the production data of slaed.net without a stop
  • Of 721 file addresses in the stored texts none is lost; the guest crawl of 231 pages saw 1049 file references, all answering 200, and the 12 addresses no guest reads answered 200 to the panel

Technical notes:

  • Breaking for the operator: the folder moves of UPGRADING.md now come after update.php, not before
  • A clean 6.2 site with sid, hometext and bodytext is not migrated; update.php serves slaed.net alone
  • The stand database still carries the two forum addresses of news #3895 and private message #1665 unconverted
  • No schema change

Страница 1 из 124. Всего: 1239

1 2 3 4 5 6 7 8 9 10 … 124
Хотите опробовать SLAED CMS в действии?
Идеи и предложения
Обратная связь
Подтверждение

Поделиться
QR-код

Предварительный просмотр