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

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

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

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

Всего: 1286 Доступных коммитов | Отфильтровано: 1286 Коммиты | Страница: 1 из 129
Сегодня (19.10.2026)
Docs: The panel etalons get their plan into the themes, and DIAL folds into it
Автор: Eduard Laas | Дата: 10:21 19.10.2026

The etalons demo/admin/ and demo/site/ are checked code by code against the live panel, the lite site and every rule, and the transfer into the themes admin and lite becomes the plan docs/12-ADMIN-UI-2026.md: 24 batches, steps 88-111 of the roadmap, its batch 0 the nineteen open questions. The former step 88 DIAL is one of its batches.

Core changes:

  1. Plan of the panel (docs/12-ADMIN-UI-2026.md):
  2. Decisions of the owner, 2026-10-19: docs/2027-ADMIN-UX.md stays its own plan; one canon of the list and the form in the theme and the shared helpers, "Комментарии" and "Конфигурации" first, the other panel lists in two batches; DIAL folded in; sounds as files in sound/ of each theme, the engine in public/plugins/system, public/sound/ retired

  3. Nineteen open questions, each with a proposal: the state of the shell in cookies the server writes into <html>, the undo by a deferred send, the session lifetime, the monitor functions into core/monitor.php, the prefix of the shell constants, the motion switch beside prefers-reduced-motion, the module administrator, axe-core

    • Findings of the check, verified in code: soft delete without restore, the award of a first publication kept,
go=5 only for the super administrator, no single source of the queues, admin-block.css off the contract
  • Design: rules of the transfer, a consolidation table (one notice, one palette, one motion switch, one queue source, getThemeFileUrl()), the list and form canon, sound and the screensaver

  • 24 batches; every one of the 126 codes of both legends is named by a batch, the stale mark Э30 leaves the stand
  • Roadmap (docs/ROADMAP-2026.md):
  • The plan joins the table; step 88 DIAL becomes steps 88-111 of the plan, Close becomes 112
  • Admin UX 2027 (docs/2027-ADMIN-UX.md):
  • A line "Связь": its draft steps 2 and 6 and part of 3 are done by the new plan, the rest stays here
  • The note on sl-dial points at batch 3 of the new plan

Benefits:

  • One file names what moves from the stand, in which batch and on which existing mechanism
  • The decisions the transfer needs are asked once, before any code

Technical notes:

  • Documentation only; no code, template or schema changes
Feature: The admin block becomes a floating menu and one block for the panel and the site, both on the stand
Автор: Eduard Laas | Дата: 01:54 19.10.2026

The block "Администрация" (adminblock(), bkey admin) and its twin "Наблюдение" are redesigned on the demo stand: the series demo/ab-01…09 carries the variants, and the owner's choice - the floating menu 09 and the merged block 08 - stands in the panel etalon demo/admin/ and in the new site etalon demo/site/, with marks, descriptions and one shared stylesheet, so the transfer into the themes is one step. On the live site the total of the visitor summary gets its own icon.

Core changes:

  1. Admin block series (public/demo/ab-01-card.html … ab-09-menu.html, public/demo/assets/ablock.js, public/demo/assets/ablock.css, public/demo/assets/demo.js, public/demo/README.md):

  2. Nine faces, each in two rooms: ?ctx=admin on the admin theme with the block form, ?ctx=site on the lite theme

    • ablock.js holds the corpus of the stand: block id 2 word for word, the queue, the sessions, the live tick,
the summary, the window "Наблюдение" and the stand desk
  • 01-08 merge "Администрация" and "Наблюдение" into one block; 08 "Пульт" is the leader: the summary, six square icon keys (panel, statistics, refresh, site, own links, logout), the own links open as the rows of the user block

  • 09 "Плавающее меню" is the leader of the menu: a solid layer over the page, placed anywhere and remembered, turned across or upright, folded with the slide of the column blocks, only the icon under the hand grows

  • demo.js lists the series (DEMO_ABLOCK); README.md records the series, its history and the rejected ideas
  • Panel etalon (public/demo/admin/index.html, public/demo/admin/admin.js, public/demo/admin/admin.css):
  • М1-М14: the floating menu with its pins from the fan of a section, the quick jump, the watch ring, the own links, the admin window, the turn, the fold and the grip; Options get "Плавающее меню", "Меню на сайте" and "Позиция меню" (top, right, bottom, left; a place set by the grip reads "Произвольная")

  • А1-А8: block 08 on the home, always, whatever the menu; the rail shows it beside its icon, opening upward
  • The window "Наблюдение" (#sl-stats): filter by kind, pause, figures, the hour, shares, who and where, pages, countries
  • Fixes found on the stand: the grip cancelled by the page's own drag (preventDefault, pointercancel), the growth measured from the wrong parent (the hovered icon now grows), the toast lifted only over a menu lying at the bottom

  • Five own links: Sypex Dumper (dead, flagged), SLAED CMS on GitHub, PageSpeed Insights, Google Search Console, Яндекс Вебмастер; each row ends with the chevron of the site's user block

  • Labels in plain words; the legend gets the sections М and А and rewrites Г5, Э13, Н4, Н5, В09.3
  • Site etalon (public/demo/site/index.html, public/demo/site/site.js, public/demo/site/site.css):
  • The server answer of the live news page under an administrator: the real lite chrome, without htmx, the pseudo-cron, the debug panel and the form tokens; the stand posts nothing and calls no server

  • Block 08 first in the column, always; menu 09 with what the site needs of its own: the mark into the panel with the queue sum when folded, "Эта страница в панели", the queue (four apps, one bell upright), "Все разделы" with search and stars instead of Ctrl+K, the setToast pill with "Отменить"

  • The panel's Options act here at once (shared keys sl.dock.side, sl.dock.pins, sl.dock.mag; sl.dock.site switches the site); the place dragged on the site is the site's own

  • Marks С1-С14 with their descriptions and the stand desk of the site
  • Shared stylesheet (public/demo/assets/admin-block.css):
  • The menu, the block and the window move out of admin.css into one file both etalons link; admin.css keeps only the lift over its toast host and the rail rule, site.css only what the site adds

  • Visitor summary of the site (public/templates/lite/partials/session-summary.html, public/templates/lite/assets/css/theme.css, tools/ui-contract.php):

  • The total line carries bi-people in the text tone and stands in the column of the lines above it
  • Its rule body now equals the two changelog rules; the dup allowlist entry names it with the reason
  • Scheduler (config/scheduler.php):
  • The update check runs at 24 0 instead of 40 4

Benefits:

  • The owner judges the menu and the block where they will live, in the panel and on the site, before any transfer
  • One markup and one stylesheet for the menu, the block and the window on both themes
  • The live block's faults (list markers, the empty ring, the dead link, the wrong tooltip) are shown and repaired

Technical notes:

  • Storage of the stand only: sl.dock, sl.dock.site, sl.dock.side, sl.dock.at, sl.dock.dir, sl.dock.fold, sl.dock.mag, sl.dock.pins, sl.dock.site.at, sl.dock.site.dir, sl.dock.site.fold

  • For the transfer: setToast() of slaed.js gains an undo action, the lite theme gains the token --sl-solid-text, setSlideMotion() gains an axis option

  • No breaking change: the only change to a shipped template is the added icon of the summary total
Вчера (18.10.2026)
Feature: The release carries the real keys and only what a site runs, and the plan of updates closes
Автор: Eduard Laas | Дата: 20:02 18.10.2026

Roadmap step 87 finishes batch 11 of the update plan: the factory keys of the core are the keys of the owner's ceremony, README.md publishes their fingerprints, and docs/11-UPDATE-2026.md is deleted with its lasting part in docs/UPDATE.md. On the owner's word the release archive leaves out every file a site does not run, the modules changelog and master of slaed.net included, so the core no longer names either; the GitHub release goes to the repository the sites link to. The help of the client and the master covers keys, versions and releases.

Core changes:

  1. Factory keys (core/classes/update.php, README.md, docs/ROADMAP-2026.md, docs/11-UPDATE-2026.md):
  2. Update::PRIMARY and Update::RECOVERY are the public keys of the ceremony; README.md carries both fingerprints
  3. docs/11-UPDATE-2026.md is deleted, roadmap step 87 is closed
  4. Release archive (.gitattributes, tools/release.php):
  5. export-ignore: tests/, tools/, docs/, public/demo/, public/phoenix/, public/sound/, modules/changelog with its templates in admin and lite, composer.json and the other files of development and documents of the root

    • the root keeps LICENSE, .htaccess and nginx.conf.example; uploads/presentation/ and storage/geoip/ ship
  6. setArchiveModules() cuts from config/modules.php of the archive the row of every module whose folder the tag holds and the archive lacks; the result must return the same array without those keys, or the build stops

    • the stand keeps its rows; files.json hashes the cut file, and the delta takes it from the full archive
  7. Publishing (tools/release.php):
  8. getReleaseRepo() reads the repository from Update::PAGE; checkReleaseRepo() refuses while origin points elsewhere, and every gh call names that repository with --repo

  9. getReleaseNotes(): which archive installs and which updates, their SHA-256, that the "Source code" archives of GitHub are sources only, and the link to docs/VERSIONS.md of the tag

  10. The address of origin is never printed, and an error of git has the userinfo of any address masked
  11. Scheduler jobs of a module (core/system.php, modules/master/scheduler.php, modules/master/admin/index.php):
  12. modules/<name>/scheduler.php declares its jobs with their row defaults and a closure under run; getSchedulerModuleJobs() collects them, addSchedulerModuleJob() runs one while its module is active

  13. masterclean and masterwatch moved there; addMasterTask() and both names left the core
  14. Saving the settings of the master writes the rows from that declaration
  15. Names of modules (core/system.php, core/helpers.php, admin/index.php, admin/modules/modules.php, admin/modules/security.php, lang/.php, modules/changelog/lang, modules/master/*lang):

  16. getModuleLabel(): the constant a row names, read from the language of the module for this context when the common language lacks it

  17. _CHANGELOG and _MASTER moved from lang/*.php into the site and panel languages of their modules
  18. The menus, the list of modules, the journal filter and the tabs header use it; getModuleName() answers the name of a site module its map lacks, node included

  19. Presentation (modules/presentation/index.php, modules/presentation/lang/*.php):
  20. The commits of the changelog are read only while modules/changelog/ exists, with its language loaded first
  21. Its own label _PRES_DV_LOG and the icon concept commits in getIconName()
  22. Light mode (admin/update.php):
  23. After the database steps it clears config/local.php, the caches of pages and assets and OPcache, as step 7 of an installation does

  24. Tests (tests/Unit/ReleaseToolTest.php, tests/Unit/MasterTest.php, tests/Unit/UpdateGateTest.php, tests/Support/route_probe.php):

  25. ReleaseToolTest: the archive lacks the excluded files and the row of a left-out module, keeps a panel module, files.json holds the cut hash; publish refuses without origin and with origin on another repository and prints no address

  26. MasterTest: the core names no job of the master; the jobs run through the hook
  27. UpdateGateTest: the light mode leaves no configuration or page of the old code cached
  28. Reference and help (docs/UPDATE.md, docs/VERSIONS.md, docs/ARCHITECTURE.md, docs/2027-CORE.md, README.md, UPGRADING.md, admin/info/update/ru.md, modules/master/admin/info/ru.md):

  29. docs/UPDATE.md: what the archive leaves out, the GitHub release, the jobs of a module, the light mode cache
  30. The help of the master: what the owner's machine needs, preparing a version, build options, signing, publishing, the red rehearsal, creating, storing and changing both keys, the privacy note, what slaed.net takes by SFTP

  31. The help of the client: the manual path with the archive source, the panel entry, setup.php, robots.txt, files a release deleted, and the caches cleared after the steps

  32. docs/ARCHITECTURE.md: names and scheduler jobs at the module boundary; docs/2027-CORE.md item 4 records the hook
  33. Ideas (docs/2027-IDEAS.md):
  34. The section "PHP 8.4": small means of 8.2-8.4, enums for closed number sets, property hooks, lazy objects and the new DOM, the analyser before the hints

Benefits:

  • No release can be signed with a key anyone else holds, and no site receives code it does not run
  • A module of slaed.net needs nothing in the core: its folder, its languages and its scheduler.php
  • The GitHub release and the links of the sites point to the same repository

Technical notes:

  • Breaking: _CHANGELOG and _MASTER are no longer in lang/*.php; addMasterTask() is gone; getModuleName() answers the name of a site module outside its map instead of its key

  • publish needs origin on github.com/SLAED-CMS/SLAED, which does not exist yet; until then it refuses
  • config/scheduler.php stays out of this commit: its minute of updatecheck is the stand's own
  • No schema or URL changes
Feature: Every release is rehearsed before it is published, and the updater gets its permanent reference
Автор: Eduard Laas | Дата: 00:19 18.10.2026

The update plan closes its batch 10 and does the documents of batch 11 (roadmap steps 86 and 87). tools/rehearse.php installs the previous release clean and updates it by both archives under the real signatures, and publish refuses a release without that green record. The general rehearsal through a real master on two OSPanel projects found five faults, all fixed. docs/UPDATE.md is the lasting reference of releasing, signing, the master, the installation and privacy. Step 87 stays open: the key ceremony was postponed by the owner, so the factory keys are still the test keys and UpdateSignTest::theFactoryKeysAreRealAndPublished is red until the real keys are in.

Core changes:

  1. Rehearsal (tools/rehearse.php, tools/release.php, tools/sign.php):
  2. rehearse.php: a clean run of the new full archive through its own setup.php, then a full and a delta run, each on the previous release installed clean into a disposable folder and database

    • the archive and its signed manifest go to Update of that site as an upload by hand, so the site verifies itself
    • dry run, installation, self-check, integrity, the schema against the clean run, "Вернуть предыдущую версию" to
the byte, empty error journals; children without OPcache
  • a green run writes storage/release/<version>/rehearsal.json with the SHA-256 of each archive
  • release.php publish refuses without the rehearsal record of the same archives (checkRehearsal())
  • sign.php points to the rehearsal after signing, and sign.php --note writes <id>.sig where publish and the master read it, not <id>.json.sig

  • Faults of the general rehearsal (core/classes/update.php, core/monitor.php, .gitignore):
  • addAudit() no longer reports the public/setup.php the installer deleted as a missing file
  • getMonitorDiskSnapshot() reads zero on a host without disk_free_space()/disk_total_space() instead of failing the start page of the panel

  • .gitignore lets storage/update/step/*.sql into git; the database steps would have missed the release
  • Light mode backup (admin/update.php, admin/lang/*.php):
  • "Применить шаги базы" takes the portion dump of the site tables, as step 4 of an installation does, instead of the full dump of the job dbbackup: a foreign MyISAM table of a shared database left the site closed

    • a dump that does not fit into one request continues with the next click (_UPDATE_BACKPART in six languages)
    • the used backup is set aside under its time and is not taken again after a failed step
  • Shipped configuration (config/security.php, config/modules.php):
  • No test ban, no row of the module master, error level 0; the secret stays empty and getSecret() makes one per site
  • Factory keys seam (core/classes/update.php, modules/master/common.php, modules/master/admin/index.php):
  • Update::getFactoryKeys() starts every key chain: Update::PRIMARY and Update::RECOVERY, or UPDATE_KEYS where a test run defines it before the core; getKeyFile(), the master and its tab of keys read through it

  • No request and no setting can define a constant, so the source of trust still changes by code only
  • Tests (tests/Support/test_keys.php, tests/bootstrap.php, tests/Support/probe_boot.php, tests/Support/route_web.php, tests/Support/route_probe.php, tests/Unit/*.php):

  • test_keys.php defines UPDATE_KEYS from tests/Fixtures/update in the PHPUnit bootstrap, the probe boot and the router
  • ReleaseToolTest pins the test keys in the copy of update.php of its scratch repository
  • theFactoryKeysAreRealAndPublished replaces theFactoryKeysAreTheTestKeys: the core ships real keys and README.md their fingerprints

  • ReleaseToolTest: publish refused without a rehearsal and with the record of another archive, publish --note finds the signature; UpdateFetchTest: the deleted installer; UpdateGateTest: a foreign MyISAM table, a dump of the site only, no second backup after a failed step

  • Reference (docs/UPDATE.md, docs/VERSIONS.md, UPGRADING.md, README.md, docs/ARCHITECTURE.md, docs/TESTS.md):
  • docs/UPDATE.md: parts, releasing, signature and keys with the ceremony and the key change, manifest and packages, notes, the master, the client, settings, database steps, storage, installation and contract v1, refusals, rehearsal, statistics and privacy with the privacy note of slaed.net, security, tests, reasons

  • docs/VERSIONS.md records the updater with its breaking changes; UPGRADING.md gets "Updates From the Panel"
  • README.md gets "Updates and Release Keys" with placeholders for the two fingerprints
  • docs/ARCHITECTURE.md gets "Update Boundary"; docs/TESTS.md lists the updater tests
  • Help and references (admin/info/update/ru.md, modules/master/admin/info/ru.md, docs/2027-*.md, .gitattributes, tests/Support/apply_probe.php):

  • The help of the light mode and of the integrity check follows the behaviour; the help of the master explains the rehearsal and the new signatures of served releases and notes after a change of the primary key

  • Every reference to docs/11-UPDATE-2026.md points to docs/UPDATE.md
  • Plans (docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md):
  • Batch 10 and roadmap step 86 are closed; batch 11 and step 87 record what is done and that the ceremony waits

Benefits:

  • No release reaches a site without being installed and rolled back on a clean copy first
  • The light mode works on a shared database with tables of other programs
  • A test run keeps signing with the test keys once the core ships the real ones

Technical notes:

  • Breaking: the shipped config/security.php has error level 0 and no bans; config/modules.php has no row master
  • The factory keys are still the test keys; release.php publish refuses them, so nothing can be published yet
  • No schema, URL or API contract of the site changes
Эта неделя (17.10.2026)
Feature: The panel installs an update in steps under a lock, and every failure rolls the files, config and database back
Автор: Eduard Laas | Дата: 13:58 17.10.2026

The update plan closes its batch 9: a release unpacked in stage/ is installed from the panel by an executor of the new package, one short request per portion, while client/apply.lock keeps every entry closed. The installed rescuer rolls back automatically, by a one-time rescue code or by rescue.now put by FTP, and "Go back to the previous version" returns the last installation. The lock, the backup layout and the call of the gate are frozen as contract version 1.

Core changes:

  1. Gate of all three entries (core/gate.php, public/index.php, public/admin.php, public/setup.php):
  2. getSiteGate() runs first in every entry and names the file the entry requires at its top level

    • a rescue code, ?rescue, rescue.now or a rollback under way go to the installed core/rescue.php
    • the token of the installation goes to the run copy client/run/apply.php, only while its hash matches the lock
    • anything else, and every /api/ request, gets the static 503 with Retry-After
  3. setGateClose() is the one static 503 of both the lock and the database steps waiting
  4. Executor of the package (core/apply.php):
  5. Step 4 dumps the site tables through the installed portion mode of Backup, without the core
  6. Step 5 moves the files by rename in batches of 100, no core loaded; the old file goes to the backup

    • each batch is marked in the lock before it runs, so a cut batch is finished or undone exactly
    • the entries, the gate and the executor move last; empty folders of deleted files go
    • opcache is reset, and the revalidation time is waited where timestamps are checked
  7. Step 6 copies config/ into the backup, boots the new core in its light mode, runs the database steps and merges config/; a fatal error there is noted in the lock, so the next request rolls back

  8. Step 7 clears config/local.php, the page and asset caches and opcache
  9. Step 8 swaps core/rescue.php, removes stage/ and run/, lifts the lock and notes the installation
  10. Pages without core on the shell of public/error.html, each continuing by itself with the token
  11. Rescuer (core/rescue.php):
  12. Restores the database in portions from the dump, restarting a cut table from its head, then config/ with the marks of the database steps, then the files by the plan in reverse, then the caches

  13. The rescue code continues a cut installation under a new token or rolls it back; a wrong code is refused
  14. rescue.now rolls back without any code and is removed afterwards
  15. Every rollback records the step and the cause; a failed installation is kept for the master once
  16. Preflight and plan (core/classes/update.php):
  17. getApplyPlan(): replaced, added and deleted files, folders created, files PHP cannot write, files changed on the site as they are now

    • a site file is placed only where it is missing, an identical file stays, the deleted installer never returns
    • the package public/admin.php takes the name of the panel entry of the site
  18. getApplyCheck(): stage, lock, PHP, min, rights, changed files, opcache, database rights, space, config merge and the database steps of the package, written nowhere; the first refusal is its error

  19. getApplySpace(), getBaseSize(), getDirSize(), getOpcacheState(), getApplyCode(), getSelfCheck()
  20. addApplyStart() takes the lock first in phase prep, then writes the backup plan and the run copy; a delta without core/apply.php runs the installed one held to the new files.json

  21. addApplyRevert() closes the site for the rescuer to undo the whole plan of the last installation
  22. getStepList() takes the step folder and version of a package
  23. Page "Обновления" (admin/modules/update.php, admin/lang/*.php):
  24. "Проверить установку", the box "Установить" with the space and the marks, the page of the rescue code
  25. The rows of the last installation with its self-check and of the last rollback, "Вернуть предыдущую версию" and "Всё в порядке"; the size of the kept backup beside its setting

  26. 36 UPDATE* strings in six languages
  27. Scheduler (core/system.php):
  28. addSchedulerRun() starts no job while client/apply.lock lies
  29. Manual (admin/info/update/ru.md, admin/info/scheduler/ru.md):
  30. The dry run, the installation step by step, the space, the marks, the rescue code, every rollback and the table of refusals; the silent scheduler during an installation

  31. Contract of the markup scan (tools/ui-contract.php):
  32. core/apply.php and core/rescue.php are excluded with their reason: they run while no core or template may load
  33. Tests (tests/Unit/UpdateApplyTest.php, tests/Support/apply_probe.php):
  34. The probe copies the code of the tree into a disposable site with its own database, signs a package of 6.3.1 with a fresh key the copy trusts and serves the copy with the built-in server

  35. Runs over real HTTP: installation and going back, a failed database step, a failed dump, a cut batch continued and rolled back by the code, a broken run copy and rescue.now, a package without its executor with a file changed after the unpacking; the pure parts of Update in a child process

  36. Plans (docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md):
  37. Batch 9 and roadmap step 85 are closed; contract v1 of apply.lock and of the backup stands in "Installation"

Benefits:

  • A release installs from the panel on any host: short requests, renames instead of copies, space checked
  • A broken package cannot block its own rollback, and a closed browser window does not leave the site closed
  • The tables of other programs in a shared database are never touched

Technical notes:

  • Update::APPLY is 1: client/apply.lock, the plan.json of storage/backup/update/<from>-<to>/ and the gate call are frozen in 8.0.0; new fields are only ever added

  • Every entry gains one first line, getSiteGate(), and keeps it in every version
  • The executor and the rescuer read only apply, rescue, act and ?rescue before the core, each held to its grammar
  • The self-check runs on the first view of "Обновления" after an installation
  • No schema, URL or API contract of the site changes
Эта неделя (16.10.2026)
Feature: The backup dumps a site prefix in portions and restores it the same way, without the core
Автор: Eduard Laas | Дата: 18:46 16.10.2026

The update plan closes its batch 8: Backup gets a portion mode on a bare PDO, one part per call with the progress kept by the caller, so the installer can back up the database before its file phase and the rescuer can restore it without loading the core. Its entry is frozen in 8.0.0 as contract version 1.

Core changes:

  1. Portion mode of Backup (core/classes/backup.php):
  2. getSiteTables() lists the base tables of a prefix without those of a longer prefix that has its own _admins
  3. checkDumpAccess() names the missing SELECT, INSERT, CREATE, DROP, and REFERENCES on MySQL with foreign keys

    • the rights come from SHOW GRANTS, nothing is written, so "Check installation" may call it
  4. getDumpState() and addDumpPart() write parts 000001.sql.gz, at most one table and about 4 MB of SQL each

    • an integer key is read by seek, any other table by offset in key or full column order
    • every part is written under a temporary name and renamed, free space is checked before each one
    • the last part writes the index dump.json with the hash, table and rows of every part
  5. getRestoreState() and addRestorePart() check the hash of a part, unpack it and run it

    • part 0 first drops every table of the prefix: the listed ones come back from their parts, the others were
created after the list was fixed
  • head names the part that recreates the current table, where a caller resumes after a lost result
  • A state or index of another format, an index with a table lacking contiguous parts, a damaged part, a finished dump in the directory, a prefix outside its grammar and a connection that does not throw are refused by name

  • Parts shared by both modes (core/classes/backup.php):
  • Grant reading, session state, columns and keys of a table are static and used by the full mode too
  • A grant names its database as a LIKE pattern, so hosting grants on user_db or user_% prove the schema
  • FLOAT and DOUBLE are written in their shortest exact form; the string cast of PHP cut them to 14 digits
  • Tests (tests/Unit/BackupPartTest.php, tests/Support/dump_probe.php, tests/Unit/BackupContractTest.php):
  • The probe loads only the class and config/db.php and runs every part of the dump and of two restores in a process of its own: in place after a failed step, and into an empty database

  • Its schema holds a prefix ab, a longer prefix ab_x, a look-alike abc, MyISAM, a composite key, a keyless table, a stored generated column, a DOUBLE and a foreign key; tables are compared by rows and CHECKSUM TABLE

  • A lost result inside a table is replayed from its head without a duplicate row
  • An account with SELECT alone lacks INSERT, CREATE and DROP; an escaped pattern grant is enough
  • Plans (docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md, docs/TESTS.md):
  • Batch 8 and roadmap step 84 are closed; the contract v1 of the portion mode stands in "Installation"

Benefits:

  • The database backup of an installation runs in short requests on any host and on any engine
  • A restore never touches a table of another program sharing the database

Technical notes:

  • Backup::FORMAT is 1; a change of the entry is version 2, and version 1 stays readable
  • MariaDB 11.8 gives identical tables with a stored generated column different CHECKSUM TABLE values, so the probe compares such a table by its rows

  • The light mode "Apply database steps" still takes the full dbbackup dump in one request
  • No schema, URL or API contract of the site changes
Fix: The orbit of the state lamp and the presentation plate is a dashed SVG circle, so Firefox draws no seam on it
Автор: Eduard Laas | Дата: 17:29 16.10.2026

The previous commit took the rounded lines off both circles but caught the orbit in the middle of its change: the styles of the new orbit were there without its markup. The orbit is now an SVG circle with a dashed stroke in both places, which Firefox draws in one piece.

Core changes:

  1. State lamp of the admin stand (public/demo/admin/admin.css, public/demo/admin/index.html):
  2. The lamp button carries the SVG .sl-cockpit-orbit before its mark; the stand texts follow the lamp
  3. Presentation plate (public/templates/lite/assets/css/presentation.css, public/templates/lite/partials/presentation-hero.html):
  4. The plate carries the SVG .sl-pres-plate-orbit; its class no longer shares a name with the orbit of the module map

Benefits:

  • The lamp and the plate render the same in Firefox as in Chromium

Technical notes:

  • No token or template variable changes
Feature: An update adds the options a site lacks to config/, keeps what the site owns, and replaces languages and the two themes whole
Автор: Eduard Laas | Дата: 17:28 16.10.2026

The update plan closes its batch 7: the installer merges the missing options of the shipped config/ into the files of the site at any depth, while lists, field sets and the sections of Node types stay as the site holds them; the language files and the themes admin and lite are replaced whole without a stop, and the panel warns where they are edited. A delta now carries every settings file of config/, so the merge always sees the shipped state.

Core changes:

  1. Settings merge (core/classes/update.php):
  2. getConfigMerge() adds every missing key of the shipped value at any depth and names the paths it added

    • a list of the shipped value is taken whole, also at the top, a clash of shapes keeps the site value
    • a section of a Node type (node.types, fields.node, uploads, ratings 'node.<type>') present on the site is
kept, missing it is never added, so a deleted type never comes back
  • a field set present on the site is kept whole, a new field set of the release is added
  • modules.modules and scheduler.jobs merge recursively: new modules, jobs and keys of each entry arrive
  • addConfigMerge($dir, $test) reads config/ of the package, checks the shape of both sides and writes only files with missing options; node, fields, uploads and ratings go in one Closure save of setConfigFile()

    • $test only names the paths, for "Check installation" of a later batch
    • a package with a Node file but no node.php is refused before anything is written
  • Languages and themes (core/classes/update.php, admin/modules/lang.php, admin/modules/template.php, admin/lang/*.php):
  • isSwapFile() and Update::THEMES: language files of lang/, admin/lang/ and both lang folders of a module, and the themes admin and lite; addStage() keeps them out of the stop list stage.changed

  • _UPDATE_LANGS on the list and the editor of Languages, _UPDATE_THEMES on Templates and Styles of admin and lite, in six locales

  • Release tool (tools/release.php):
  • addDelta() puts every settings file of config/ into the delta, changed or not
  • Help (admin/info/lang/ru.md, admin/info/template/ru.md, admin/info/update/ru.md):
  • Language files and the two themes on update; their place in "Changed files" and "Check integrity"
  • Tests (tests/Unit/UpdateMergeTest.php, tests/Support/config_probe.php, tests/Unit/UpdateFetchTest.php, tests/Unit/ReleaseToolTest.php):
  • The probe mode merge runs the trial and the write on a scratch copy of config/
  • A changed language file stays out of stage.changed; the delta carries an unchanged settings file
  • Plans (docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md):
  • Batch 7 and roadmap step 83 are closed; the owner's decisions on owned sections and on the delta are recorded

Benefits:

  • A new option of a release reaches every site without overwriting what the site saved
  • A deleted Node type or field never returns through an update

Technical notes:

  • The string form of setConfigFile() stores scalars as strings, as every panel save does
  • The merge has no caller yet: the installation of batch 9 runs it after the database steps
  • Breaking change for release archives: a delta is larger by the settings files of config/
Fix: The state lamp and the presentation plate draw no rounded line, so Firefox shows no cross hair through them
Автор: Eduard Laas | Дата: 16:32 16.10.2026

Firefox paints a box-shadow, a border or an outline round a circle in pieces, and their seams cross the circle as a hair cross through its middle; the lamp of the admin stand and the plate of the presentation lose those lines.

Core changes:

  1. State lamp of the admin stand (public/demo/admin/admin.css):
  2. The border, the halo, the inner glow, the orbit and the pulse ring become radial and conic gradients

    • every edge fades over one pixel, since a hard gradient stop is not smoothed as a border is
  3. Presentation plate (public/templates/lite/assets/css/presentation.css):
  4. The inner glow is a radial gradient and the halo an outline; the mark carries no drop-shadow filter

Benefits:

  • The lamp and the plate render the same in Firefox as in Chromium

Technical notes:

  • No token, class or markup changes
Feature: The updater downloads, takes an uploaded archive, verifies it and unpacks it into the stage
Автор: Eduard Laas | Дата: 16:32 16.10.2026

The update plan closes its batch 6: a site fetches the release the master offers now, resumes a broken download, accepts a manually uploaded archive only for that offer, reads the zip through its own central directory and unpacks it with ZipArchive or PharData into storage/update/client/stage/, checked against files.json of the package.

Core changes:

  1. Update client, fetching and unpacking (core/classes/update.php):
  2. getOffer() re-verifies the found manifest by the keys in force, getPackKind() takes a delta only on its exact from
  3. addDownload() fetches master/file under work.lock through getRemoteLink(), shared with getRemote()

    • no longer than 40 s or half of max_execution_time, resumed by Range, a server without Range starts over
  4. addUpload() tells a full archive from a delta by size and SHA-256
  5. addStage() checks size and hash, reads the central directory by getZipList() and unpacks by addZipFiles()

    • refused: a path outside isPackagePath(), a Unix mode of no regular file, encryption, ZIP64, a case-insensitive
twin, a sum of usize beyond the manifest
  • every entry is counted and hashed, the list is checked against files.json and, for a delta, the installed list
  • stage/<version>.part becomes stage/<version>; PharData lets go of a refused archive by Phar::unlinkArchive()
  • getChangedList(), addAudit() over the folders of AUDIT, deleteStage() when the found version changes or goes
  • state.json carries stage, fault and audit
  • Page "Updates" (admin/modules/update.php, admin/lang/*.php, admin/info/update/ru.md):
  • The overview shows the package, the disk space, the last refusal and the integrity
  • "Download" / "Continue download", "Check integrity" and the block "Upload archive"; the upload asks the master again
  • 25 strings UPDATE* in six locales; the help takes sections 3 and 4
  • addAudit() checks public/<name>.php of $conf['security']['afile'] against the entry public/admin.php
  • Master schema and tests (modules/master/sql/table.sql, .gitignore, tests/Unit/UpdateFetchTest.php):
  • table.sql of the module master missed git under the rule *.sql; rebuilt from the queries of the module and the probe, and .gitignore excepts modules//sql/.sql, so MasterTest runs on any copy

  • UpdateFetchTest covers download, upload, the central directory, both readers and the audit
  • Plans (docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md):
  • Step 6 of the update plan and step 82 of the roadmap are closed
  • Step 9 learns that the new public/admin.php of a package takes the place of public/<name>.php

Benefits:

  • A release reaches the stage only whole, signed and matching its list, whatever the host offers for zip
  • A slow host resumes instead of starting over, and a refused archive leaves no lock on Windows

Technical notes:

  • New files of storage/update/client/: work.lock, tmp/, stage/; all gitignored
  • No schema, URL or API contract of the site changes

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

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

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

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