Официальный сайт SLAED CMS
Журнал изменений
The installer of 6.3 stays in the tree as setup_old/ for reference while the new setup.php is written; it is the setup/ directory of e28d3639 byte for byte. Two texts that still named setup/ after the move now say where the code lives.
Core changes:
- Old installer (setup_old/):
index.php, lang/, templates/ and the guards of setup/ as they were before the move
- its .sql files stay out of git, .gitignore keeps *.sql out; the schema lives in storage/update/sql
- References (core/admin.php, docs/SETUP-2026.md):
- the comment of getSqlbatch() names update.php as the third caller instead of setup/index.php
- the plan points at e28d3639 for the removed setup/ and records that setup_old/ is tracked
Benefits:
- The old validation and texts stay at hand for the new installer
Technical notes:
- setup_old/index.php dies without SETUP_FILE, so the copy runs nothing on its own
- No behaviour changes
Two work plans join docs: SETUP-2026 carries the installer of 8.0 in eight batches, of which the schema move, the 6.3 update in update.php and the texts have landed; FILES-2026 plans the closed delivery of forum and message files.
Core changes:
- Installer plan (docs/SETUP-2026.md):
- decisions, traps found before the plan, batches with their checks and what each landed batch taught
- File plan (docs/FILES-2026.md):
- the closed delivery of forum and private message files, archive links turned into attachments
Benefits:
- Every next run of the installer work starts from the table of batches
Technical notes:
- Both files are deleted by the last batch of their plan
The seventh series of the stand lets the owner pick the look of setup.php before it is built: every face plays the same seven stops, the server checks and the run from one list of rows.
Core changes:
- Faces (demo/setup-01-door.html ... demo/setup-13-lite.html):
the login card of the admin theme, a wizard, a scroll, a console, a panel, a dialog and later variants
- 09 Motion is the chosen leader: the login card with seven segments and a motion layer
- Stand engine (demo/assets/demo.js, demo/README.md):
- the manifest DEMO_SETUP and the rows DEMO_SETUP_RUN feed every face
- data-demo-run plays checks and the run, data-dir gives the step direction
Benefits:
- The installer is chosen on the stand, not rebuilt in the code
Technical notes:
- Demo files only; no template, style or code of the site changes
The coming setup.php speaks through 57 constants of the scope SETUP in admin/lang and reuses the globals that already name its words, so the installer and a later update module share one dictionary.
Core changes:
- Installer texts (admin/lang/*.php):
titles, step counter, leads, field labels and hints of the seven stops
- the Russian wording comes from the stand face demo/setup-09-motion.html and its run rows
check and run notes, the refusals of a wrong prefix, panel name, old server, taken prefix, pending journal and an installed site
- _DELSETUP now names a setup.php that should have deleted itself
Benefits:
- No word of the installer is defined twice: language, site, administrator, password and the buttons reuse globals
Technical notes:
- The constants follow _SESS_T, the six files stay parallel line for line
- They are unused until setup.php is written
The installer directory setup/ is gone: its schema files now live in storage/update/sql, which the web never serves, and its update branch for a 6.2 site runs as the first stage of update.php, an internal tool of the owner that is not shipped. The release keeps a new installation only, which the coming setup.php carries.
Core changes:
- Schema (storage/update/sql/):
table.sql, insert.sql and table_update6_3.sql move out of setup/sql
- the update files 4.1 to 6.2 are dropped
- .gitignore lets storage/update/sql/.sql back in instead of setup/sql/.sql
- every reader follows: the validation tests, the probes, tools/node-profile.php
- Update (update.php):
a first stage runs before the core under SETUP_FILE, without a key and without a login
- it opens while points, ratings and fields have not all left their marks, and always for op=update
- the connection comes from config/db.php in the 6.2 or 6.3 shape, so there is no form
the units of the old installer move over under names the core does not declare
- setUpdateFile, getUpdateSource, getUpdateCred, setUpdateSql, deleteUpdateTypes, setUpdateRun
- a unit answers its report rows as data, the page renders them with the fragments of the admin theme
- with the three marks the core boots and isAdmin(true) guards the Node migration as before
- Database facade (core/classes/pdo.php):
- a refused connection under SETUP_FILE throws a RuntimeException instead of calling setExit()
Benefits:
- No function of the update collides with the core, so one file carries both stages
- The schema is no longer reachable over the web
Technical notes:
- setup.php still requires setup/index.php and stays broken until the new installer lands
- The preflight of a clean installation (free prefix) left checkUpdateBase(); the installer carries it next
- NodeProfileTest and PointOwnersTest stay red until the installer and its tests land
A rehearsal of update.php on a copy of the production site found that migrated images rendered as #, that every directly linked file sat twice in the upload folders, that links from the forum and private messages pointed into folders Node closes, and that an attachment in a comment of a Node material answered 403. The migration and the attachment route are fixed, and the stand configuration follows the migrated production data.
Core changes:
- The migration (update.php):
A file has one place: the type folder holds what materials and their comments use, the archive what the site links to directly; a file that is both is copied, a file nothing uses stays outside the site in the working directory
- getMigrateKeep() lists the attachments of texts, help replies and comments and the local file of every resource
- setMigrateFile() moves or copies one file, deleteMigrateTree() removes the emptied working folders
setMigrateOuter() points the direct addresses of the forum, comments, private messages, newsletters, blocks, signatures and polls at the archive, once, before any file leaves the working directory
getMigrateLocal() gives a bare relative [img] or [url] target ./, the local form the safe parser accepts; a rewritten archive address is written as ./uploads/archive/... unless it is absolute or rooted
- Entity-quoted attributes of old HTML are decoded before conversion; [img alt=...] is recognised
- Only release guard files stay in a stashed folder, so an old empty placeholder no longer blocks the new type
Attachments of comments and help replies keep their tag under the managed name, so a private help request keeps its files private
Attachments of comments (core/user.php, core/system.php, core/classes/comment.php, core/classes/node/service.php, modules/node/index.php):
- A comment of a Node type renders with the id of its material, in the list and in the answer of an edit
NodeService::getNodeFile(..., Comment $com) grants the names the published comments of the material carry, every comment not deleted for a moderator, once the material itself is readable
- Comment::getAttachTexts() reads those bodies, so the comment table stays behind its class
The preview of a fresh upload is open to whoever the upload rule of the type lets upload; ownership is checked as before
- Theme links (templates/lite/partials/menu.html, site-footer.html):
- The menu and the footer link to docs instead of the removed pages
- Tests and reference (tests/Support/node_probe.php, tests/Unit/NodeServiceTest.php, docs/NODE.md, docs/VERSIONS.md):
- Published, pending, deleted and closed comments, and a name asked through another material or type
- The migration steps, the attach route and the versions of 2026-10-01
- Stand configuration (config/fields.php, modules.php, node.php, ratings.php, uploads.php):
- The types, field definitions and upload and rating rules of the migrated production data
Benefits:
- Migrated texts show their images and links on a site of any root
- One copy of each file; private help files stay behind the rights of their request
- A user can attach a picture to a comment of a material again
Technical notes:
- getNodeFile() takes the comment service as a new required argument
- The shipped config stays the stand configuration, as in the previous configuration commit
- config/security.php is not part of this commit: its only change is the secret of the stand
The stand ran update.php on 2026-09-30: its Node types, fields, rating rules and upload rules are now the configuration the migrated content needs, and the upload folders of the removed modules carry the guards the migration left behind. The secret of config/security.php is stored empty, as the repository requires.
Core changes:
- Configuration (config/*.php):
- node.php, fields.php, ratings.php and uploads.php hold the migrated types and their rules
- security.php and global.php carry the test bans and the debug switch of the stand; the secret is empty
- contact.php is written in the format the settings save produces
- Upload guards (uploads/*):
A deny-all .htaccess in the folders of news, faq, files, help and links, and an index.html in the thumbnail folder of docs
Benefits:
- A clone of the repository shows the stand the migrated content was checked on
Technical notes:
- A site that deploys this tree keeps its own configuration; the secret is generated on first use
Two inline edits exist - the forum post and the comment - each with its own route, both losing the typed text on a refusal and letting the last write win, while Node has none at all. The plan replaces both with one protocol that Node joins; its batch 0, the forum rights, has landed.
Core changes:
- Versions (docs/VERSIONS.md):
2026-09-30: the migration of the removed modules into Node with its 301 addresses and the look of the old modules, the escaped code blocks, the forum rights, the thumb burst and the category descriptions
- The quick edit plan (docs/QUICK-EDIT-2026.md):
One QuickEdit protocol over three kinds - node, forum, comment - with an adapter per kind for the source, the write and the view, all read from the stored row
A stamp for optimistic locking without a schema change: the version of a node, a hash of the text and its edit time for a post and a comment
- Two strict routes, getQuickEdit on GET and updateQuickEdit on POST, one status per refusal
- One fragment and one script: cancel without a request, the typed text kept on a refusal, a conflict window
- NodeService::updateNodeText() for moderators at any time and for the author within the window of the type
- Batches 0 to 5; batch 0 is done, the forum trust mode stays an open decision
Benefits:
- The history of the day is readable without the diff
- The next step of the quick edit has a written contract to be measured against
Technical notes:
- The plan file is removed by its last batch, which moves what lasts into docs/ARCHITECTURE.md
The thumbs of the shared rating answered a vote with nothing but a new number, while the favourite star and the rating stars already burst. The category tiles of a Node list showed no description, which the old modules did.
Core changes:
- The burst reaches the thumbs (plugins/system/slaed.js):
A vote remembers whether a star or a thumb was pressed; once the counted rating is swapped in, a thumb vote bursts the thumb, a star vote the stars up to the choice, both through setBurst()
Every thumb of the site is one fragment, rating-like: the forum post, the profile, the rating under an avatar in the forum and the comments, and the user list
- The thumb in its tone (templates/lite/assets/css/theme.css):
- A bursting thumb takes the round the ring wave needs, as a star does
- The up thumb bursts green in the rule of the copy feedback, the down thumb red, the tones their hover promised
- Category descriptions (core/system.php, modules/node/index.php):
- setCategories(string $mod, string $id = '') always passes the description; an empty one is not rendered
- The two switches $sub and $desc go: their one caller set them the same way every time
Benefits:
- One gesture answers every vote of the site, from one mechanism
- A reader sees what a category holds before opening it
Technical notes:
- No new class, token or template; the ui-audit dup count stays at zero
- The screenshot pair differs only on node-list, whose tiles grew by the description line
The quick edit, the full edit, the reply, the deletion and the moderator actions of the forum read their rights from the category the request named. The moderator of one category could therefore edit, delete, close or move the posts of every other one, which a live request against the stand confirmed before this change.
Core changes:
- Two rules every handler takes (core/user.php):
- getForumPlace(int $id) reads the category, the topic with its status and the author of a post from its rows
checkForumRight(bool $mod, bool $may, int $uid, int $stat = 3) is the one right over a post: the moderator of its category, or its signed-in author with the category right while the topic is open
- a guest never matches a post written without an account, which a category open to guests allowed
updatePost() takes both, ignores the category of the address, and echoes its refusals instead of returning them into a route that discards them, which left an empty body on the page
- The handlers of the module (modules/forum/index.php):
add(), send() and delete() take the category and the topic of a named post from its row; only a new topic takes the category of the form
A reply always answers the topic of the post it names and needs the reply right; the topic right alone used to insert one
- move() acts only on the topics stored in the moderated category; delete() loses its category argument
- The edit and delete buttons of view() ask checkForumRight(), so the view never offers what the handler refuses
- Tests (tests/Unit/ForumRightTest.php, tests/Support/contract_probe.php):
- The probe forumright compares the place with live rows and asks the right as a guest and as an account
- The handlers are pinned to getForumPlace() and checkForumRight()
Benefits:
- A category moderator is a moderator of that category and nothing else
- One rule decides both the buttons and the writes
Technical notes:
Behaviour change: guests no longer edit or delete anonymous posts, authors see no edit button in a closed topic, and a reply without the reply right is refused
- The addresses keep their cat parameter; it no longer decides a right
- Batch 0 of docs/QUICK-EDIT-2026.md