v0.5.3
<p>Pages get a published flag and an access limit that visitors and queries both respect, and the admin gains a page Settings tab, a ⌘K search palette and page status lights.</p>
3 October 2026
Added
Page::$publishedandPage::$accessreplace the oldstatusstring. A page is live only when published.accesssays who may open it: empty for anyone,loginfor any signed-in user, or role names joined by|.Page::save()rejects an unknown role.Page::assertViewable()andPage::isViewable(), run first inPage::route(). An unpublished page is a 404, a gated page redirects a signed-out visitor to login, and the wrong role gets a 403. A page is closed if it or any ancestor is.- Registry queries apply the same rule in SQL, so
find(), counts,limitandoffsetonly see pages the visitor may open. The registry haspublishedandaccesscolumns and a partial index,idx_registry_gated, that keeps the check fast (schema 15). App::isEditor()(signed in withadmin.access) andApp::seesAll()(an editor, or the CLI). Both skip the checks above.Page::settingFields()returns published, access, hidden and locked as ordinary fields. The edit panel has a Settings tab built on it, saved bypage/settings/{path}and gated bypages.publish.- The
checkboxesfieldtype, a multi-choice list. The access setting uses it. hidden,openandreadonlyas global option fields."label": falsehides a field's label in the admin (Field::$labelled). A field with no stored value falls back to itsdefaultoption.phlat page:access <path> --to=public|login|<role>.make:pagetakes--publishand--access=, andpage:statusis nowpage:publish <path> [--off].Page::new()emitspage.create:after.- A ⌘K search palette replaces the admin search page.
- Status lights on each row of the admin page tree, and a statusbar under the preview (
ui/statusbar.latte, replaceable fromsite/views/@admin/ui/statusbar.latte). They show published, access, hidden, unsaved draft, uncommitted changes and locked. - A filter toggle on the page tree that turns secondary while a filter is active.
Dt::setTimezone(). Thetimezoneconfig key is now applied at boot.- Session cookie hardening in
phlat/php.ini:session.cookie_httponly,session.cookie_samesite=Laxandsession.use_strict_mode. PHP errors go to the log instead of the response (display_errors=Off), andexpose_phpis off.
Changed
statusis gone fromRecord, the registry andHistory. Pages made bymake:pageand the admin start unpublished.- An editor's autosave draft shows only in the admin preview iframe. The same editor browsing the site directly sees what is saved.
createdandupdatedare always written in UTC, so they sort chronologically whatever the site timezone.phlat/config.jsondefaultstimezonetoUTC, dropsdomains,api,auth.logoutandauth.admin, and gainsfeatures.versions(off).env.jsonandenv.cli.jsonare read fromsite/instead ofdata/.backup:create,backup:restoreanddeploy.phpfollow.session.expirealso setsgc_maxlifetime, so PHP's collector no longer deletes idle sessions after 1440 seconds.Session::isThrottled()loses its unused$windowargument.FieldValueSet::fromRequest()keeps areadonlyfield's stored value instead of reading its input, and does not validate ahiddenfield.Registry::boot()is public and replacesensureBooted().
Fixed
- Textareas autosize again after an htmx swap, and use their content height as the minimum.
Removed
- The
nyholm/psr7dependency. App::noContent()and theAppwrapperspushUrl(),replaceUrl(),retarget(),reswap()andreselect(). UseHx::.History::hasDeployKey(),deployKeyPublic(),generateDeployKey()anddiscardPath().History::$deployKeyis public.Registry::batchGet()andRecord::isAddonObject().
Comments
No comments yet. Be the first!
Loading form…