Releases: wazum/sluggi
Release list
14.12.0
Features
- Pages below a locked page now show that lock: with
lock_descendantsenabled, a child page renders its URL path read-only, the lock toggle is disabled and a note names the parent as the source. Previously the field looked editable and the submitted value was discarded on save without any message — a discarded value is now reported. - When auto-sync would move a page onto a URL path another page already uses, the conflict dialog offers Keep current URL path, which switches auto-sync off so the path really stays. Before, the choice was silently overwritten on save. Where auto-sync is enforced by configuration, only the suggested alternative is offered.
- Page TSconfig can now disable the sync, lock and full path controls for one branch of the page tree, so a policy applies to administrators too:
TCEFORM.pages.tx_sluggi_sync.disabled = 1(likewiseslug_lockedandtx_sluggi_full_path). - Creating a page shows the parent path as a prefix instead of pre-filling it into the field, so the editor only types the page's own segment.
Bug Fixes
- Two pages can no longer end up on the same URL path when a slug post modifier rebuilds the path from the page tree.
- Turning auto-sync off resets the URL path to the stored value, so changing the title first and switching sync off afterwards no longer saves the interim path.
- The Copy page URL button is available to editors without permission for the sync and lock fields — copying changes nothing on the record.
- Moving or copying a page keeps the page's own path segment instead of regenerating it.
- Editors without permission for the sync and lock fields keep the configured defaults instead of losing them on save.
- Child pages whose path changed through a cascade get their redirects, and the number of changed URL paths is reported even when redirect control is off.
- The parent path follows the site's fallback language chain, so translations no longer fall back to the default language path.
- Creating a page below an excluded page type restricts it to the parent path.
- A page can no longer take its URL path from a record of another table that happens to have the same id.
Compatibility
- Pages excluded from subpage paths are skipped when resolving the parent path. This removes the false "Custom URL path" warning and the accompanying notification on pages whose short path is correct according to masi.
- The exclusion flag is coupled across languages: switching it on the default language regenerates the whole subtree including translations. An upgrade wizard aligns translations whose flag diverged.
- Recycler pages are always left out of URL paths while masi is installed, whatever
exclude_doktypessays. - Post modifiers receive the effective slug configuration on every generation path.
Upgrade
- URL path locking is opt-in since 14.0.0. Up to v13 it was always available and only gated by the
pages:slug_lockedfield permission. Pages that carry a lock keep the flag, but it is no longer evaluated whilelockis off — their URL path follows the page title again. The new wizard "Enable URL path locking for sluggi" offers to switch the setting on and reports how many pages are affected. - With masi installed, the wizards leave folders alone: "Set default excluded page types" sets
199instead of199,254, because254in that list makes every folder disappear from subpage paths and renders masi's per-folder switch inert. "Clear slugs for excluded page types" skips folders for the same reason, no longer touches deleted pages, and states that it writes no record history and cannot be undone.
Full Changelog: 14.11.0...14.12.0
14.11.0
Compatibility
- Compatible with the latest TYPO3 core releases (13.4.33 / 14.3.5): the "Revert update" and "Revert redirects" buttons work again.
Bug Fixes
- Clicking Save right after editing the page title (or another URL path source field) no longer loses the save or stores an outdated URL path — saving now waits for the URL path update to finish.
- Cleaning up outdated redirects never touches manually created redirects or redirects belonging to other domains, and cleaned-up redirects are recoverable instead of being deleted permanently.
- Reserved URL paths can no longer slip through during recursive URL path updates or automatic child page updates.
- The recursive URL path update reports accurate counts of updated and skipped pages.
- Redirects are no longer created for pages that are not publicly visible because of publish/expiration dates (previously only hidden pages were considered).
- Fixed a crash when page URL paths were changed from the command line (scheduler tasks, imports).
- A failed URL path suggestion can no longer clear the URL path field.
Hardening
- The redirect decision dialog now covers every way of saving a document and blocks repeated save attempts while the decision is still open.
- Recursive URL path updates no longer expose technical error details.
- Release archives no longer contain source map files.
Full Changelog: 14.10.3...14.11.0
14.10.3
Bug Fixes
- A slash in the page title no longer creates a broken URL path segment ("x-/-x") when the page is created or renamed in the page tree; slashes are now replaced consistently in every generation path (#144).
Full Changelog: 14.10.2...14.10.3
14.10.2
Bug Fixes
- Copying a page tree now builds each translated child's URL path from its translated parent, not the default-language one.
- Moving a page as a restricted editor now updates its URL path to match the new location instead of keeping the old one.
- "Re-apply URL paths recursively" now also updates descendant pages and translations created in a workspace.
- Moving a page onto a reserved path now assigns a temporary placeholder slug instead of keeping the old URL path.
- Turning sync off, locking the field, or cancelling an edit is no longer overridden by a slug proposal that resolves afterwards.
- The cursor no longer jumps to the end when typing an uppercase letter, space, or slash mid-path.
- Clearing the editable segment under a locked prefix now cancels cleanly instead of saving a malformed path.
Full Changelog: 14.10.1...14.10.2
14.10.1
Bug Fixes
- Ship the correct v14 "Create new page" wizard guard — 14.10.0 shipped a stale compiled bundle of the page-wizard guard, built from an earlier source revision. It committed all visible FormEngine inputs on each wizard button press instead of only the focused field, which could fire unrelated
onChangehandlers. The bundle is now rebuilt from source, so the shipped behavior matches the intended focused-input-only commit that 14.10.0's notes described.
Internal
- Added a CI guard that runs
npm run buildand fails when the compiled assets inResources/Public/differ from the source, so a stale bundle can never ship again.
Full Changelog: 14.10.0...14.10.1
14.10.0
Bug Fixes
-
Prevent empty pages from the v14 "Create new page" wizard (#139) — TYPO3 v14's new-page modal wizard strips empty form values before posting, and FormEngine syncs visible→hidden inputs only on
change/blur. Clicking Next before a field had committed silently created pages withtitle=''and a misleading fallback slug likeparent-page-name-1. sluggi now commits the focused FormEngine input on each wizard buttonpointerdown(client-side fix). As a safety net, a server-side DataHandler hook (RejectNewPageWithoutSource) aborts the new-page insert when the wizard submitted no source-field values and no TCA / userTS default would supply one — so an empty submission fails visibly instead of saving a page with a meaningless fallback slug. -
Fix Setup module exception on TYPO3 v14 (#140, #141) — TYPO3 v14.3 migrated backend user settings to TCA, and FormEngine now expects every column to carry a nested
configarray. sluggi's legacy flat registration ofsluggiCollapsedControlsinext_tables.phptriggeredUndefined array key "config"(exception #1476107295) when opening the Setup module. The setting is now registered through the newExtensionManagementUtility::addUserSetting()API inConfiguration/TCA/Overrides/be_users.php; the legacy registration is kept behind amethod_exists()guard so v12/v13 continue to work unchanged. Thanks to @peter-neumann-dev for the report and the PR!
Dependencies
- Dropped support for TYPO3 v14.0–v14.2. Those releases were not LTS, and the user-settings TCA migration that powers
addUserSetting()only landed in v14.3. The minimum supported TYPO3 v14 version is now v14.3+. sluggi continues to support TYPO3 12.4 and 13.4.26+.
Full Changelog: 14.9.1...14.10.0
14.9.1
Bug Fixes
-
Regenerate URL path now uses the persisted title in restricted-column edit forms — previously when editing only the URL path (e.g. via the list module's "edit this column" link,
columnsOnly[pages][0]=slug), clicking the regenerate button produced adefault-<random>slug like/parent/default-78c5c76409. In that form context TYPO3 doesn't render the title input, so the sluggi web component had no source-field value to send; core'sSlugHelper::generate()saw an empty title and fell back to its safety net. sluggi's slug-suggest endpoint now hydrates missing source-field values from the persisted record (workspace-aware) before delegating to core, so the proposal reflects the actual title. Submitted values still win over DB values. -
Explain why hidden pages don't get a redirect on URL change — sluggi already silently skipped redirect creation for hidden (draft) pages since 14.8.3, but editors had no way to know that ahead of save. The slug field now shows an inline note ("This page is hidden — saving will not create a redirect for the changed URL path.") whenever redirect control is enabled and the page is hidden. The note is suppressed when the editor has no chance to change the slug from this form (slug locked, or auto-synced without source-field inputs visible).
Full Changelog: 14.9.0...14.9.1
14.9.0
Features
- Accurate post-save toast for slug changes (forge #101226, forge #99828) — replaces TYPO3 core's misleading post-save notification ("Slugs updated and redirects created") with one whose wording reflects what actually happened. The new toast names the edited page in the message —
The URL path for page "About Us" (UID 42) was updated.— and counts only pages whose slug actually changed in the database plussys_redirectrows that were actually persisted. Multi-edit saves list each edited page; the recursive context-menu "Re-apply URL paths recursively" flow gets its own wording. Singular/plural grammar is correct on its own (no more "1 redirects created"). Revert update and Revert redirect actions still work and reload only the edit iframe so the success notification persists. Auto-sync (source-field changes triggering slug regeneration) is covered too. Requiresredirect_controlto be enabled.
Full Changelog: 14.8.3...14.9.0
14.8.3
Bug Fixes
- No prompt or redirect when renaming the slug on a draft page — editing the slug on a hidden (draft) page no longer pops up the "Create Redirects?" question, and no redirect is created. Drafts were never reachable by visitors, so the redirect would only have been noise.
Full Changelog: 14.8.2...14.8.3
14.8.2
Bug Fixes
- Revert update now undoes all changed slugs in multi-edit saves — previously when several page slugs were changed in one multi-edit save, the post-save "Revert update" notification reverted only the last page. Core's
BackendUtility::setUpdateSignalstores the slug-changed signal under a single key with last-writer-wins semantics, so only the last record's correlation id survived. sluggi now installs one shared correlation id on every outermost DataHandler whose datamap touches a slug, when the request body holds slug changes for more than onedata[pages]entry. Slug history rows across the multi-edit save share that id, so core's existing single-revert undoes all changed pages. Field-only DataHandlers, nested DataHandlers and callers with their own correlation aspects (cascade, move, slug rebuild) keep their default correlation — unrelated field changes in the same save are not affected by the slug revert.
Full Changelog: 14.8.1...14.8.2