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

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

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

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

Всего: 1281 Доступных коммитов | Отфильтровано: 1281 Коммиты | Страница: 1 из 129
Сегодня (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
Feature: The updater signs, checks and boots light, the master answers the sites, and every choice of several becomes a list of boxes
Автор: Eduard Laas | Дата: 12:41 16.10.2026

The update plan closes its batches 3 to 5: releases are signed and verified without sodium by the own class Signature, the module master answers master/check and master/file, and the client checks, shows the page "Updates" and runs the database steps in a light boot. Beside it every select multiple of the site and the panel becomes one check list fragment, the light that follows the pointer comes from one script for both themes, and the motion check is one.

Core changes:

  1. Update signature, keys and release tools (core/classes/signature.php, core/classes/update.php, core/version.php, tools/release.php, tools/sign.php):
  2. Signature verifies Ed25519 in PHP when sodium is missing, so no sodium_compat is shipped

    • the version is the constant SL_VERSION with SL_CODENAME, $conf['version'] is built from both
    • config/global.php no longer carries a version
  3. tools/release.php builds files.json and the package, tools/sign.php signs it with real sodium
  4. Module master (modules/master/, config/modules.php):
  5. master/check and master/file through the API branch, a panel of six tabs, the jobs masterclean and masterwatch
  6. The scheduler jobs are known to the core and written by the settings of the master, never shipped
  7. Update client (admin/modules/update.php, admin/update.php, core/gate.php, core/admin.php, config/scheduler.php):
  8. The job updatecheck, the page "Updates", the notices of a found release and of the master
  9. The card page of the admin theme is shared by the installer and the light mode of the updater (setCardPage)
  10. One check list for every choice of several (fragments/check-list.html of both themes):
  11. No form offers a select multiple any more: Node categories, multi fields, modules on the home page, debug variables, access of categories and Node types, modules of the sitemap and the search, admin rights, block places

    • the group writes role="group" and the aria-labelledby of its row label, a tree row carries --sl-d-depth
    • a full admin row lays the list out in the columns of a radio group
  12. The hint _CTRLINFO about Ctrl/Strg is removed in all six locales
  13. catacess() becomes getTplAccessChecks() without its dead class parameter, getTplModuleSelect() becomes getTplModuleChecks(), getNodeCatOptions() becomes getNodeCatItems(), blocks share getBlockWhereItems()

  14. The flags is_multiple, is_name_array and is_radio_group of the select and div templates are gone
  15. Pointer light and motion (public/plugins/system/slaed.js, admin-ui.js, presentation.js, theme CSS):
  16. slaed.js alone writes the place of the pointer; lite shows the light on every page as the admin does
  17. The rim of the installer card is pinned to the viewport in CSS, no measuring in admin-ui.js
  18. isMotionStill() in slaed.js replaces nine copies of the reduced motion query
  19. Theme fixes (public/templates/lite/assets/css/*.css, tools/ui-contract.php, tools/ui-shots.json):
  20. --sl-select-height of the frozen API now bounds the check list in both themes
  21. The row label of a tall field meets its first line; the code of a module stands under its name
  22. The screenshot rig finds the site logout at account/logout
  23. Repository and release archive (.gitattributes, .gitignore, composer.json, public/sitemap.xml):
  24. export-ignore keeps public/update.php, the 6.3 update SQL and modules/master out of a release archive
  25. The files the updater and the master write, and public/sitemap.xml written by its job, leave git
  26. composer.json suggests ext-sodium for the direct signature check

Benefits:

  • A choice of several never needs a modifier key, and a click no longer clears what was chosen
  • One fragment, one script and one query where there were four ways, three copies and nine
  • A site learns of an update and can check its signature without sodium

Technical notes:

  • Posted names and values of every form are unchanged: cids[], module[], variables[], pview[] and the rest
  • The option "No" of the module lists is "nothing checked", which the save already stores as 0
  • docs/TEMPLATES.md describes the check list; docs/2027-IDEAS.md takes the idea of select options as data
  • NodeProfileTest::aCleanInstallationCreatesTheTenTypes and RouteRegistryTest::twoWritersRaceForOnePath fail at this commit
Feature: The API routes to declared services through its guards, and the admin cockpit reads the real OPcache
Автор: Eduard Laas | Дата: 00:33 16.10.2026

Step 78, batch 2 of docs/11-UPDATE-2026.md: the core of the connector without clients. A path v<n>/<service>/<action> reaches a core service or the api.php of an active module through the guards of .rules/api.md in their fixed order, and every reply is the envelope or, for an action that declares reply file, a stored file. Beside it the admin stand gets hover panels on its cockpit, the presentation shows the real OPcache, and the spelling "кеш" becomes the standard of the panel.

Core changes:

  1. Router (core/classes/api/router.php, error.php, client.php):
  2. getResponse() runs route, maintenance and switches, CORS, the flood of the address, auth, size and input, then the handler; every refusal is an ApiError of the closed code list

    • An action with a key or a secret answers 401 until the clients of the connector exist; a public one is called
with the guest ApiClient
  • A preflight is answered 204 without auth; a foreign Origin is 403, a listed one is echoed on every reply
  • A request reads only the service its path names; a declaration with an unknown key, a key action without a scope of its service, a public action that is not GET or an unknown param type is refused whole, logged, and answers 500

  • The common.php of a module loads after the last guard; a fault of a handler is logged under the request id and answers 500 internal without a word of the reason

  • setApiReply() writes the envelope, a 204 without body or type, or hands a file to getFileStream()

    • The mode file takes only a file below storage/update/ or the upload root, so a slip sends no dump or journal
    • A reply that cannot be encoded becomes 500 internal; a public cached action is public, max-age only without
Authorization
  1. Input and limits (core/classes/api/input.php, limit.php, core/classes/cache.php):
  2. ApiInput reads the declared params by type: num, word, text, json, ver; a param without def is required, an undeclared one is dropped, a refusal is the 422 that names the param; a body must be a JSON object

  3. ApiLimit keeps a token bucket per address in the file cache under a keyed hash; IPv6 counts by its /64 and a mapped IPv4 as IPv4

  4. Cache::setDirPath() becomes public for the buckets
  5. Services and settings (core/classes/api/services/system.php, config/api.php, tools/api.http, .gitignore):
  6. system/ping answers the empty success; system/schema is the live reference of the public actions, built from the declarations and kept a minute by a public cache

  7. config/api.php holds active, maint, off, the global CORS list and the limits flood, burst and size
  8. tools/api.http carries the requests for the REST Client; tools/.env is ignored
  9. Tests (tests/Unit/ApiRouterTest.php, tests/Support/route_probe.php, tests/Unit/ApiEntryTest.php):
  10. The probe mode router writes three modules for the run and proves the route, versions, the order of the guards pair by pair, typed input, the envelope, the crash log, CORS, the switches, the flood and the mode file

  11. ApiInput and ApiLimit are also tested in-process; ApiEntryTest expects the answering system/ping
  12. Admin stand and presentation (public/demo/admin/*, modules/presentation/index.php, theme lite presentation.css, partials/presentation-hero.html):

  13. Every ring and the lamp of the cockpit open the bell panel on hover; the lamp lists only broken signals
  14. The cache ring of the presentation shows the hit rate of the real OPcache, or off when it is disabled
  15. The lamp of the presentation is the one-colour mark of the theme masked in the tone of the state, no second coloured logo beside the header

  16. Spelling and documentation (admin/lang/ru.php, admin/info/*, modules/changelog/admin/info/ru.md, config/presentation.php, docs/*):

  17. "кеш" instead of "кэш" in the constants, the help and the presentation text
  18. .rules/api.md gains the action key reply (owner, 2026-10-15); docs/2027-CONNECTOR.md, docs/ARCHITECTURE.md, docs/2027-ADMIN-UX.md, the plan and the roadmap follow

Benefits:

  • A module offers an API by one declaration file, without a line of the core naming it
  • Every refusal has one shape, and no reply of the API carries a reason, a path or HTML

Technical notes:

  • New config file config/api.php; a site without it runs the API on with the shipped limits
  • No schema or URL change; the site and the panel answer as before
  • Full phpunit green: 1865 tests, 24889 assertions, 14 skipped
Вчера (15.10.2026)
Feature: The plate of the presentation becomes the state lamp, and the admin stand gets a cockpit of the system
Автор: Eduard Laas | Дата: 22:53 15.10.2026

The central plate of the presentation cockpit drops its name and caption and becomes a lamp: the mark alone in the tone of the system state, with a ring that breathes only while something waits. The admin stand shows the same cockpit over its home page, with gauges that drift as a live panel would.

Core changes:

  1. Presentation (modules/presentation/index.php, lang/*.php):
  2. The plate carries the theme, the logo and a tone instead of a name and a caption
  3. The query gauge reads "sql" under the new constant _PRES_QUERY in all six locales; the Russian and Ukrainian _PRES_QUERIES lose their hyphen

  4. Theme lite (presentation.css, partials/presentation-hero.html):
  5. The plate takes its border, halo, glow and dashed orbit from currentColor, set by data-sl-tone, and a pulsing ring that stays still in the success tone

  6. The mark fills the plate; the arcs of the rings take round ends on track and value
  7. The figure of a gauge stands in the centre of the dial and its caption in the mouth of the arc
  8. Admin stand (public/demo/admin/index.html, admin.css, admin.js):
  9. A cockpit over the home: the state line, gauges of CPU, RAM, disk and cache round a state lamp, a strip of generation, queries, PHP memory and visitors online, and the signals the lamp sums

  10. setCockpit() lets each gauge drift round its value every three seconds and retones the server gauges by the thresholds of getPercentTone()

Benefits:

  • One state lamp reads the same on the site and in the panel
  • A calm system shows a steady glow, so motion itself is the alarm

Technical notes:

  • The stand is static demo markup; no core, schema or route change
  • New language constant _PRES_QUERY in six locales
Feature: The API gets its one entry in index.php, boots a light core and answers only in JSON
Автор: Eduard Laas | Дата: 22:52 15.10.2026

Step 77, batch 1 of docs/11-UPDATE-2026.md: a path under /api/ defines API_FILE and boots the core without theme, template, parser, visual classes, session or the layer of the user, and ApiRouter answers it before a line of the site runs. The router knows no route yet, so every path answers 404 no_route; the guards and the services follow in batch 2.

Core changes:

  1. Entry (public/index.php, core/stream.php):
  2. A path under api/ is the branch of the API, taken after the light path of uploads/ and before the site
  3. getUploadRequest() becomes getRequestPath($dir), which reads both uploads/ and api/

    • MODULE_FILE stays defined in the API, core/stream.php needs it before the branch is known
  4. Light core (core/system.php, core/classes/api/router.php):
  5. Under API_FILE the core loads config, database, security, logger, cache, mail, geoip, route, the class map of Node and the helpers; theme, Template, Parser, captcha, oauth, field, point, rating, comment, quick, privat, editor, core/user.php and core/admin.php stay out

  6. ApiRouter::getResponse() returns the reply, ApiRouter::setApiReply() is the one writer of status, headers and the envelope of .rules/api.md: ok, data or error with code and text, meta with id, ver, ms and now

    • A valid X-Request-Id is echoed, any other is replaced; every reply is no-store and nosniff
  7. Security in the API (core/security.php, core/classes/pdo.php):
  8. No cut of the path, no ?error= page, no session, no flood check by session, no visitor or language cookie
  9. The request scan of the site is skipped: ApiInput is the filter of the API, so v=../8.0.1 becomes a 422 there and never a ban of the caller here

  10. Errors are never displayed; a ban answers 403 no_scope, a lost database, an uncaught exception or a fatal error 500 internal, all in JSON without a word of the reason

  11. Tests (tests/Unit/ApiEntryTest.php, tests/Support/route_probe.php, tests/Support/route_web.php):
  12. The probe mode entry drives the real index.php and admin.php: the envelope, the files the light core loads, the session state at the end of a request, a deep path, a POST, a HEAD, the scan, a ban, a lost database, and the site and the panel beside it

    • Five deliberate regressions of the core were each caught by the test
  13. Documentation (docs/ARCHITECTURE.md, docs/11-UPDATE-2026.md, docs/ROADMAP-2026.md):
  14. The entry of the API in "Entry Points"; step 1 of the plan and step 77 of the roadmap closed

Benefits:

  • A fault of a page can never render into a reply of the API, and a reply of the API never carries HTML
  • An API request costs no theme, template or session

Technical notes:

  • No schema, URL or config change; the site, the panel and setup.php answer as before
  • Full phpunit: 1855 tests, one failure in AssetVersionTest from a stale config/local.php of the stand after a change of presentation.css outside this step; green after the cache was rebuilt

Docs: The updater verifies a signature without sodium, reads an archive without zip, and leaves the files a site writes
Автор: Eduard Laas | Дата: 21:56 15.10.2026

Step 76, batch 0 of docs/11-UPDATE-2026.md: the two open questions are answered by the owner after probes on the stand and the console, and the baseline of the suite is recorded. A site without sodium or zip still receives every release, and a release no longer overwrites the sitemap and robots.txt a site writes for itself.

Core changes:

  1. Decisions (docs/11-UPDATE-2026.md):
  2. Without sodium the core verifies the signature with a bundled paragonie/sodium_compat, loaded only when the extension is missing; signing stays on real sodium

  3. Without zip the archive is read by PharData; Update walks the central directory itself and applies every refusal to the raw names, the same for both readers

    • PharData drops ../x and /x silently, loses the symlink mode and throws on a backslash, so its names prove nothing
  4. The nginx access log of slaed.net goes without the query string for /api/v1/master/, so the privacy note keeps its promise

  5. public/sitemap.xml leaves git; public/robots.txt is a site file in files.json, placed only when missing
  6. The whole tree ships; nothing beyond the named export-ignore entries leaves the archive
  7. Plan sections and steps (docs/11-UPDATE-2026.md):
  8. The client, the refusals, the privacy, the help and the tests follow the decisions; steps 3, 6 and 10 carry them
  9. "Open questions" becomes "Probes of step 0": stand extensions and opcache, write rights and one device, the speed of sodium_compat, PharData on the tree archive and on hostile entries, the archive size, the suite baseline

  10. Roadmap (docs/ROADMAP-2026.md):
  11. Step 76 is closed with its decisions

Benefits:

  • A site on a host without sodium or zip is not left blind to updates forever
  • One set of refusals holds whichever reader opens the archive

Technical notes:

  • Plans only; no code, theme or schema change
  • Baseline: full phpunit green, 1849 tests, 24477 assertions, 14 skipped

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

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

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

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